Self managed repository and CI #3 - Nexus3

Jinwon Seo·2022년 11월 30일
1
post-thumbnail

앞서 구성한 docker compose에 Nexus를 추가 하겠습니다.

├─ nginx
│   ├─ config
│   └─ nginx.conf
└─ docker-compose.yml # this!

Nexus3

nexus3의 docker image는 아래 링크에서 확인할 수 있습니다.

Docker hub - sonatype/nexus3

Nexus3 구성

docker compose에 nexus3가 사용할 volume을 추가합니다.

# ./docker-compoose.yml

volumes: 
  nexus-data:
    name: nexus-data

docker compose에 nexus3 구성을 추가 합니다.

# ./docker-compose.yml

services:
  (...중략...)
  nexus:
    image: sonatype/nexus3:3.42.0
    container_name: nexus
    hostname: nexus
    restart: always
    volumes:
      - type: volume
        source: nexus-data
        target: /nexus-data
    networks: 
      docker-host:
        ipv4_address: 172.20.0.20

docker-compose.yml이 존재하는 위치에서 아래 명령을 실행합니다.

$ docker-compsoe up -d nexus

실행이 완료되면 아래와 같이 continer log를 확인 할 수 있습니다.

$ docker logs -f nexus

2022-11-30 05:11:39,824+0000 INFO  (생략)
-------------------------------------------------

Started Sonatype Nexus OSS 3.42.0-01

-------------------------------------------------
2022-11-30 05:12:38,294+0000 INFO  (생략)

Nginx reverse proxy 설정

생성된 nexus에 접속할 수 있도록 nginx의 reverse proxy 설정 파일을 추가합니다.

├─ nginx
│   ├─ config
│   │   └─ nexus.conf # this!
│   └─ nginx.conf
└─ docker-compose.yml
# ./nginx/config/nexus.conf

upstream nexus.domain.com { # WebUI, Maven repo
	server nexus:8081;
}

server {
	server_name nexus.domain.com;
	listen 80 ;
	location / {
		proxy_pass http://nexus.domain.com;
	}
}

upstream resistry.nexus.domain.com { # Docker container registry
	server nexus:5000;
}

server {
	server_name resistry.nexus.domain.com;
	listen 80 ;
	location / {
		proxy_pass http://resistry.nexus.domain.com;
	}
}

nginx 컨테이너에서 nginx를 reload 하거나 nginx container 를 재시작 해줍니다.

$ docker restart nginx-proxy

웹 브라우저를 통해 http://nexus.domain.com 으로 접속 하면 아래와 같은 페이지가 연결됩니다.

Nexus 관리자 계정

nexus의 관리자 계정은 admin이고 초기 비밀번호는 컨테이너 안의 파일에 생성되어 있습니다. 아래 명령을 실행하면 UUID 타입의 초기 비밀번호가 터미널에 출력됩니다. 이 후 관리자 계정으로 로그인 하면 비밀번호를 변경할 수 있습니다.

$ docker -exec -itu 0 nexus cat /nexus-data/admin.password

그리고 익명 연결을 허용해 줍니다.

Maven repository 설정

Nexus를 설치하면 maven과 nuget은 기본 설정 되어 있습니다.

Docker container registry 설정

administration > repository > blob stores 메뉴로 이동합니다.

create blob store를 클릭하여 아래와 같이 두 개의 store를 생성합니다.

Type: file
Name: docker-hosted, docker-hub

administration > repository > repositories 메뉴로 이동합니다.

create repository를 클릭하여 아래와 같이 두 개의 repository를 생성합니다.

  • Recipe: docker(hosted)
  • Name: docker-hosted
  • Http: checked, port 5000
  • Enalbe docker v1 api: checked
  • Blob store: docker-hosted

  • Recipe: docker(proxy)
  • Name: docker-hub
  • Repote storage: https://registry-1.docker.io
  • Docker index: Use docker hub
  • Enalbe docker v1 api: checked
  • Blob store: docker-hub

administration > security > realms

Docker bearer token realm을 Active로 이동 시키고 저장합니다.

접근 권한 생성

Role 생성

administration > security > Roles > Create

  • RoleID: maven-browse
  • RoleName: maven-browse
  • Privileges-Given:
    • nx-repository-view-maven2-*-browse
    • nx-repository-view-maven2-*-read

  • RoleID: maven-deploy
  • RoleName: maven-deploy
  • Privileges-Given:
    • nx-repository-view-maven2-*-add
    • nx-repository-view-maven2-*-edit
  • Roles-Contained:
    • maven-browse

  • RoleID: docker-browse
  • RoleName: docker-browse
  • Privileges-Given:
    • nx-repository-view-docker-*-browse
    • nx-repository-view-docker-*-read

  • RoleID: docker-deploy
  • RoleName: docker-deploy
  • Privileges-Given:
    • nx-repository-view-docker-*-add
    • nx-repository-view-docker-*-edit
  • Roles-Contained:
    • docker-browse

User 생성

administration > security > Users > Create local user

  • ID: gitlab-ci
  • FirstName: gitlab-ci
  • LastName: gitlab-ci
  • Email: gitlab-ci@domain.com
  • Password: change_me
  • Roles-Granted:
    • docker-deploy
    • maven-deploy

Maven setting

Https가 적용되지 않은 maven repository를 사용하려면 maven mirror 설정이 필요합니다.

Mirror 설정의 maven-default-http-blocker을 주석 처리(maven-3.8.1 이상)하고 생성한 Maven repository mirror를 추가 합니다.

<!--MAVEN_HOME/conf/settings.xml-->

<settings>
  <servers>
  	  <!-- private nexus maven repository -->
    <server>
        <id>private-nexus3-maven</id>
        <username>gitlab-ci</username>
        <password>change_me</password>
    </server>
    <!-- private nexus maven releases repository -->
    <server>
        <id>private-nexus3-maven-releases</id>
        <username>gitlab-ci</username>
        <password>change_me</password>
    </server>
    <!-- private nexus maven snapshots repository -->
    <server>
        <id>private-nexus3-maven-snapshots</id>
        <username>gitlab-ci</username>
        <password>change_me</password>
    </server>
  </servers>
  
  <mirrors>
    <!--
    <mirror>
      <id>maven-default-http-blocker</id>
      <mirrorOf>external:http:*</mirrorOf>
      <name>Pseudo repository to mirror external repositories initially using HTTP.</name>
      <url>http://0.0.0.0/</url>
      <blocked>true</blocked>
    </mirror>
	-->
    <!-- private nexus repository -->
    <mirror>
      <id>private-nexus</id>
      <mirrorOf>central</mirrorOf>
      <name>private-nexus3-maven</name>
      <url>http://nexus.domain.com/repository/maven-public/</url>
      <blocked>false</blocked>
    </mirror>
    <!-- private nexus maven releases repository -->
    <mirror>
      <id>private-nexus3-maven-releases</id>
      <mirrorOf>releases</mirrorOf>
      <name>private-nexus</name>
      <url>http://nexus.domain.com/repository/maven-releases/</url>
      <blocked>false</blocked>
    </mirror>
    <!-- private nexus maven snapshots repository -->
    <mirror>
      <id>private-nexus3-maven-snapshots</id>
      <mirrorOf>snapshots</mirrorOf>
      <name>private-nexus</name>
      <url>http://nexus.domain.com/repository/maven-snapshots/</url>
      <blocked>false</blocked>
    </mirror>
  </mirrors>
</settings>

Docker inseucre-registry

Https가 적용되지 않은 registry docker engine에서 사용하려면 insecure-registry 설정이 필요합니다.

# /etc/docker/daemon.json (존재하지 않으면 생성)

{
	"insecure-registries" : [
    	"registry.nexus.domain.com"
    ]
}

설정 완료 후 Docker engine을 재시작 하면 적용 됩니다. docker login을 통해 확인할 수 있습니다.

$ docker login registry.nexus.domain.com
Username: gitlab-ci
Password: change_me

Login Succeeded

예제코드

작성된 코드는 아래 Repository에 올려두었습니다.

Github - self-managed-repository-and-ci

Next

다음은 MinIO를 구성하겠습니다.

  1. Self managed repository and CI #1 - Overview
  2. Self managed repository and CI #2 - Docker network, Nginx reverse proxy
  3. Self managed repository and CI #3 - Nexus3ㆍ현재 글
  4. Self managed repository and CI #4 - Minio
  5. Self managed repository and CI #5 - Gitlab
  6. Self managed repository and CI #6 - Gitlab-runner
  7. Self managed repository and CI #7 - Gitlab-CI

0개의 댓글