코알못

[Docker] Nexus - meven proxy로 활용하여 빠른 빌드 실습 본문

ETC

[Docker] Nexus - meven proxy로 활용하여 빠른 빌드 실습

코린이s 2023. 3. 25. 18:59
728x90

이번 시간에는 Nexus 설치 및 이용을 해보도록 한다!

Nexus를 이용하면 아래 장점을 누릴 수 있다.

  1. 클라우드가 아닌 자체 서버에 내부 소스 코드 저장하여 보안적 측면에서 좋음
  2. maven central에 있는 라이브러리중 사용하는 라이브러리는 nexus blob stores(local, aws s3)에 저장
    • 두번째부터 라이브러리 사용시 저장한 데이터를 사용하므로 maven central 와 네트워크 통신을 하지 않아도 되어 빠르게 사용 가능함 (빠른 빌드)
    • 서비스 서버가 maven central(외부)를 통신하지 않고 nexus(내부)서버와 통신하면 되므로 서비스 서버를 private한 공간(외부 통신 안되는 구간)에 구축 할 수 있음

[이전글] 에서도 Nexus 관련 실습을 진행하였으나 이번 시간에는 다르게 실습 하도록 하며 원하는 목적에 맞게 글을 확인하면 된다.

구분 이전 실습 현재 실습
설치 방법 wget으로 소스파일 직접 다운 docker를 통해 이미지 다운
목적 사내 소스 파일 private한 서버에 저장 (장점 01) 빠른 빌드 (장점 02)
실습 내용 사내 소스 파일을 nexus 에 올리고 다운 받아 이용 maven central에 있는 라이브러리 AWS S3에 저장하여 이용

 이제 실습을 진행해보자!

실습을 위해 EC2 아래 스펙이 필요하므로 t3.medium로 생성해본다.

CPU MEMORY
2 Core 4GB

아래와 같이 원하는 선택사항 선택후 인스턴스 시작을 눌러 EC2를 생성한다.

보안 그룹은 아래와 같이 nexus 포트인 8081, ssh 를 위한 22번 포트 인바운드를 열어둔다.

저자의 경우 모든 대역을 오픈하였으나 실제 서비스 할 경우에는 실제 접속하는 IP 나 대역만 열어 두도록 한다!

EC2에 접속한 뒤 

$ ssh -i [pem key] ubuntu@[IP]

아래와 같이 패키지 업데이트 한 뒤 도커를 설치하고 일반 유저(ubuntu)에게 권한을 부여하여 root 권한 없이 실행 가능하도록 한다.

$ sudo apt update
$ sudo apt install -y docker.io
$ sudo chmod 666 /var/run/docker.sock

이제 docker로 Nexus 설치 한다!

$ docker run --name nexus -d -p 8081:8081 -v ~/nexus-data:/nexus-data -u root sonatype/nexus3

사용한 옵션은 아래 참고한다.

옵션 내용
--name nexus 컨테이너명을 nexus로 지정한다.
-d 백그라운드로 띄운다.
-p 8081:8081 서버 8081 포트를 컨테이너 8081 포트로 연결한다.
-v ~/nexus-data:/nexus-data 로컬 볼륨(~/nexus-data)에 컨테이너 볼륨(/nexus-data)을 마운트하여 컨테이너 삭제 뒤에도 데이터가 날라가지 않도록 한다.
-u root 루트 권한으로 컨테이너를 실행한다. (컨테이너 안에서 sudo를 못쓰기 때문에 컨테이너 자체를 루트 권한으로 띄운다.)

이제 nexus를 브라우저에 http://[IP]:8081 입력하여 접속해보자!

아래와 같이 첫 화면이 나오며 Sign in 을 눌러 로그인 하려고 보면 관리자 ID는 admin이며 패스워드는 아래 경로에서 확인 가능하다고 하니 복사하여 로그인 하도록 한다.

둘중에 하나 입력하여 패스워드 확인하고 입력하여 로그인 한다.

$ docker exec -it nexus bash -c 'cat /nexus-data/admin.password'
$ cat ~/nexus-data/admin.password

로그인 하면 새로운 패스워드 변경창이 뜨며 설정하고 Next를 눌러 넘어가며 Disable 을 눌러 로그인 하지 않은 유저가 조작 하지 못하도록 한다.

이제 meven central 라이브러리를 S3에 저장하기 위해 Blob Stores 를 생성해보자!

아래 경로로 들어가면 default로 로컬 경로 4.9GB 저장 가능한 Blob Stores 가 있으며 Create 버튼을 누른다.

아래와 같이 설정 하며 AWS Key의 경우 [해당글]에 'AWS Key 를 생성' 부분을 참고하여 키 생성하고 입력한다.

설정 관련해서는 아래  정리한 표 참고한다.

구분 내용
Type S3(AWS), File(Local) 중에 선택하며 저자는 S3에 저장할 예정이니 S3를 선택한다.
Name Blob Sores를 구분할 이름을 지정한다.
Region S3 리전을 입력하며 저자의 경우 서울이므로 ap-northeast-2를 입력한다.
Bucket S3에 라이브러리를 저장할 버킷명을 입력한다. (이미 생성되어 있는 버킷이면 해당 버킷에 저장하며 생성 되어 있지 않다면 생성한다.)
Prefix 위에 지정한 버킷의 어떤 디렉토리에 저장할지 적는다. (이미 생성되어 있는 버킷이면 해당 버킷에 저장하며 생성 되어 있지 않다면 생성한다.)
Expiration Days 예를 들어 3일 일 때 라이브러리를 Nexus에서 삭제하면 S3에 저장된 라이브러리는 3일 뒤에 삭제 되고 -1이면 Nexus에서 삭제시 S3에서도 바로 삭제된다.
Access Key / Secret Key AWS Key

S3 이기에 무제한 공간으로 생성 되었으며 S3 에 들어가서 보면 정상적으로 해당 버킷, 디렉토리가 생성 된것을 볼 수 있다.

해당 Blob Stores 를 사용하기 위해 Create 버튼을 눌러 repository를 생성한다.

maven central에 라이브러리 대신 가져오는 용도로 사용하므로 의미에 맞는 proxy를 선택하면 되며

Version policy 의 경우 Mixed 는 release, snapshot 모두 사용한다는 의미 이며

Layout policy 는 라이브러리 가져올시 상대 경로 입력해도 된다는 뜻이며 나머지는 디폴트로 한다.

그리고 remote storage 에는 메이븐 저장소 URL 'https://repo1.maven.org/maven2/' 을 입력한다.

그 다음 사용할 Blob store 인 S3 를 선택하고 Create 버튼을 눌러 생성한다.

nexus에서 maven repo를 가져오기 위해서는 아래 저장소 URL 을 복사한뒤

아래와 같이 build.gradle 을 수정하면 된다.

allowInsecureProtocol true 의 경우 maven url 이 https 가 아니면 오류가 발생하므로 현재는 상용 서비스가 아니니 true 로 하여 임시로 오류 발생하지 않도록 한다.

repositories {
  //mavenCentral()
  maven {
    url "[복사한 저장소 URL]"
    allowInsecureProtocol true
    credentials {
                username "[nexus id]"
                password "[nexus pw]"
            }
  }
}

 

변경한 뒤 빌드를 수행하고 S3 에 정상적으로 저장 되었는지 확인 하면 19MB 쌓인 것을 볼 수 있다.

이제 로컬에 빌드 캐시를 지우고 빌드 시간이 얼마나 소요되는지 확인한다.

$ rm -rf ~/.gradle/caches/*
$ gradlew build

세번 평균으로 측정하였으며 아래와 같이 Nexus 사용시 소요시간이 단축 된 것을 볼 수 있다.

nexus 변경전 nexus에서 라이브러리 두번째 가져올시
약 2분 약 42초

끝!!

728x90
Comments