본문 바로가기

4.개발 및 운영 환경

[nexus] Nexus로 Maven Repository 구성

들어가기

Nexus는 sonaytype에서 개발한 Maven Repository 지원하는 오픈소스이다. 가장 많이 사용하고 있는 Maven Repository로 다양한 형태의 Repositry 지원(npm, nuget, pypi,yum, etc)한다. 실제 사용하는 방법을 간단하게 살펴보자.

작성자: http://ospace.tistory.com/ (ospace114@empal.com)

환경 구성

아래 다운로드 링크를 통해 설치할 OS에 맞는 파일을 다운받는다. 리눅스는 자체 패키지 관리자에 의해서도 설치 가능하다.

압축을 풀면 nexus 디렉토리가 있고 그 안에 실행파일이 있다. 아래 처럼 실행하면 된다.

# Windows
$ nexus /run
# Unix
$ ./nexus run

백그라운드로 실행하려면 다음과 같다.

# Windows
$ nexus /start
$ nexus /stop
# Unix
$ ./nexus start
$ ./nexus stop

그외 옵션으로 restart, force-reload, status 명령어가 있다.

물론 도커로도 실행가능하다. 가장 손쉬운 방법일 듯 하다.

$ docker pull sonatype/nexus3

문제 없이 실행되면 8081포트 주소로 접속하면 된다.

아래와 같은 화면이 보인다. UI는 버전에 따라서 상이할 수 있다.

Fig 01. 메인화면

로그인을 위해서 Username은 admin을 사용하고 패스워드는 nexus\sonatype-work\nexus3\admin.password에 저장되어 있다. 패스워드 입력해서 로그인하면 초기 위저드 창이 뜬다. 위저드 창에서 두 가지 추가적인 설정이 필요하다.

  1. 패스워드 변경
  2. Anonymous Access 설정: 허용하면 Enable로 허용하지 않으면 Disable

모든 설정 작업을 끝마치면 아래와 같은 기본 화면이 표시된다.

Fig 02. 기본화면

리포지토리 생성

설정으로 이동하먼 저장소를 관리할 수 있는 화면이 있다. 그리고 상단에 [Create repository]로 리포지토리를 생성할 수 있다.

Fig 03. 리포지토리 관리화면

다양한 리포지토리를 생성할 수 있는데 크게 group, hosted, proxy로 구분할 수 있다. 생성시 아래 종류를 참고로해서 선택하면 된다. 이미 기본으로 제공되는 리포지토리도 같이 구분했다.

  • proxy: 원격 리포지트리에 대해 캐시역할을 한다
    • maven-central: Maven Central인 중앙 리포지토리 접근
    • nuget.org-proxy: NuGet 갤러리를 접근
  • hosted: 자신이 리포지토리로 동작한다
    • maven-release: maven2 리포지토리로 릴리즈 버전용
    • maven-snapshots: maven2 리포지토리 스냅샷 버전용
    • nuget-hosted: 내부 릴리즈 배포에 사용
  • group: proxy, hosted 및 group 까지 리포지토리 들을 묶은 리포지토리를 제공한다
    • maven-public: maven2 형식 리포지토리들을 묶음
    • nuget-group: nuget 형식 리포지토리들을 묶음

리포지토리 생성시 Maven 기준으로 보면 maven2 (group), maven2 (hosted), maven2 (proxy)가 있다. 타입을 선택했다면 리포지토리 추가 정보 입력한다.

Fig 04. 리포지토링 생성1

Maven2 저장소에 대해 추가 입력 정보 중에 Version policy는 별다른게 없고 Layout policy를 보자. 이는 저장소에 저장되는 형식을 정한다. 저장할 때 디렉토리와 파일명에 대한 규칙이 필요하다. 파일 명명 규칙에 대한 제약사항이 있다.

  • Permissive: 기본 형식 위반을 허용
  • Strict: 기본값으로 기본 형식을 엄격하게 적용(Apache Maven, Eclipse Aether 등 사용에 추천)

다음으로는 Content Dispoisiton이다.

  • inline: 기본값으로 저장소 콘텐츠가 브라우저에 표시
  • Attachment: 저장소 콘텐츠가 브라우저겡서 첨부 파일로 제공

나머지 추가 설정 항목은 종류에 따라 다르다. 이 부분은 크게 어렵지 않기에 뛰어 넘겠다. 하단에 [Create repository] 버튼을 클릭하면 생성된다.

Fig 05. 리포지토리 생성2

추가로 Blob Stores가 있는데 이는 실제 리포지토리가 저정되는 스토리지이다. 스토리지가 여러 개 있을 경우 또는 제한된 용량으로 지정할 경우에 사용할 수 있다. 리포지토리가 Blob Store에 할당되어서 사용된다.

Repository 전략

Maven Repository을 활용은 다양하게 할 수 있다. 외부 라이브러리 캐싱, 상용 라이브러기 공유, 팀간 공통 라이브러리 사용, 배포할 때 배포 서버 역할등 다양하게 사용할 수 있다.

Maven Repository을 활용할 수 있는 방법이 몇 가지를 정리했다.

  • mvn: 외부 원격 maven 저장소로 외부 라이브러리를 가져와서 캐시 형태로 제공된다. 한번 라이브러리를 가져오면 다시 가져오지 않는다.
    • Central Repository에 갱신은 매우 느리기 때문에 최신 버전을 사용하려면 제품 마다 별도 maven repository를 등록하면 빠르게 사용할 수 있다.
    • maven.org, jcenter.bintray.com, egovframe.kr 등을 묶어서 제공할 수 있다.
  • 3rdparty: 외부 제공 jar 관리 저장소로 maven 리포지토리에 의해서 제공되지 않는 경우이다. 대부분 상용으로 제공되는 경우가 많다.
    • release, snapshot 두가지 버전을 지원하는데 보통 release로도 충분하다.
  • private: 내부 개발 저장소로 공유 라이브러리나 최종 바이너리를 관리한다.
    • release, snapshot 두가지 버전을 지원한다.

Repository URL

Maven Repository에서 각 방법에 따라 접속할 수 있는 주소가 별도로 존재한다.

Fig 06. Browse 화면

URL 주소는 Browse 화면에 테이블 목록에서 URL 항목에서 가져올 수 있다. [copy] 버튼을 클릭하면 URL 주소를 복사할 수 있다. 아래는 기본 리포지토리 제공하는 저장소 URL이다.

저장소 환경 구성

Nexus에 의한 maven repository는 기본 환경이 아니기 때문에 사용하려면 추가 설정이 필요하다.

프로젝트별 환경

메이븐 프로젝트 환경 설정 파일인 pom.xml에도 추가 설정이 필요하다. pom.xml에 설정되어 있다면 별도 자신의 메이븐 환경은 변경할 필요는 없다. 물론 프로젝트 마다 설정을 추가해야하는 불편한 점이 있다.

Nexus을 통해 통해 라이브러리를 가져올려면 repositories에 사용할 저장소를 추가하면 된다. 여기사용할 리포지토리는 maven-public이다. 이 리포지토리에서 maven-relases, maven-snapshots, maven-central를 제공

<repositories>
    <repository>
        <id>nexus</id>
        <url>http://nexus.example.org/repository/maven-public/</url>
    </repository>
</repositories>

maven에서 알아서 저장소 선택해서 배포 진행한다. 버전 정보에서 뒤에 SNAPSHOT으로 판단하여 저장소 선택한다.

공통 maven 환경

한번 설정 해두면 추후 프로젝트 별로 추가 설정할 필요는 없다. 각자 자신의 maven 저장소 환경 설정을 변경해야 한다. 환경설정 파일은 ${HOME}/.m2/settings.xml에 위치한다. 이 설정 파일에 접속할 저장소 위치와 계정 정보를 입력해야 한다. 물론 익명 사용자를 허용할 경우는 계정정보가 필요없다.

리포지토리를 repositories에 repository 추가한다.

  • releases, snapshots: artifact에 대한 유형
    • enabled: 활성화 여부 (true 또는 false)
    • updatePolicy: 업데이트 발생 빈도 설정 (always, daily(기본), interval:{minutes})
    • checksumPolicy: 배포시 체크섬 파일도 같이 배포시 체크섬 오류시 정책 (ignore, fail, warn)
    • layout: 기본 레이아웃으로 maven2사용, maven1.x은 다른 레이아웃(default, legacy)
<profiles>
    <profile>
        <id>default</id>
        <repositories>
            <repository>
                <url>http://nexus.example.org/repository/maven-public/</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
                <layout>default</layout>
            </repository>
        </repositories>
        <pluginRepositories>
            <pluginRepository>
                <id>maven-public</id>
                <url>http://nexus.example.org/repository/maven-public/</url>
            </pluginRepository>
        </pluginRepositories>
    </profile>
</profiles>

위의 예제는 샘플이므로 직접 자신 환경에 맞게 수정이 필요하다. 프로파일을 설정했다고 해서 바로 적용되지 않는다. 사용할 프로파일을 선택해야 한다.

<activeProfiles>
    <activeProfile>default</activeProfile>
</activeProfiles>

물론 activeProfiles을 무시하고 maven에서 직접 프로파일을 지정해서 실행할 수 있다. 앞의 경우는 리포지토리가 각각 1개만 구성되어 있다. 현재는 nexus를 사용하기 때문에 이렇게만 구성해도 충분하다. 물론 리포지토리를 구성하고 싶다면 추가할 수 있다. 이후로부터 프로젝트마다 리포지토리 구성을 할 필요가 없다.

배포 환경 설정

배포할 경우에는 프로젝트 별로 pom.xml에서 distributionManagement를 사용해야한다. maven 환경 설정인 settings.xml로만 배포환경 설정할려고 했는데 원하는 방식으로 작동하지 않았다. 결국 pom.xml에 설정해서 사용하는게 더 좋다고 판단했다. 다음은 pom.xml에 기본 배포환경을 설정하고 settings.xml에는 인증위한 계정 설정를 하는 방식으로 구성했다.

pom.xml 설정에 배포 설정은 빌드 버전은 snapshotRepository을 사용하고 릴리즈 버전은 repository을 사용한다.

<distributionManagement>
    <snapshotRepository>
        <id>nexus</id>
        <name>maven-snapshots</name>
        <url>[http://nexus.example.org/repository/maven-snapshots/](http://nexus.example.org/repository/maven-snapshots/)</url>
    </snapshotRepository>
    <repository>
        <id>nexus</id>
        <name>maven-releases</name>
        <url>[http://nexus.example.org/repository/maven-releases/](http://nexus.example.org/repository/maven-releases/)</url>
    </repository>
</distributionManagement>

배포할 때에 해당 리포지토리에 대한 인증이 필요할 수 있다. 로컬 maven 설정인 settings.xml에 계정 정보를 추가해야한다.

<servers>
    <server>
        <id>nexus</id>
        <username>ospace</username>
        <password>supersecret</password>
    </server>
</servers>

리포지토리에 접근할 수 있는 계정에 정보를 username와 password에 입력한다. 주의할 부분은 pom.xml에 있는 id와 settings.xml에 id와 일치해야한다.

결론

외부 maven repository 캐싱처리로 초기 프로젝트 가져올 경우 성능 향상이 된다. 현재 private와 3rdparty 저장소만 있지만 더 다양하게 고려 가능하다. 구체적인 배포 절차 및 정책 고민 필요하고 배포서버(Jenkins)와 연계 처리에 대한 고민도 필요하다. 그리고 개발자에 따라서 환경이 달라질 수 있어 프로젝트에서 일괄적으로 구성보다 각 개발자 환경에 맞게 별도로 구성하는게 맞을 수 있다. 물론 특정 환경에서만 제약을 할 수도 있다. 배포인 경우 대부분 특정 시스템으로 배포하기 때문에 프로젝트 별로 설정하는게 적합하다.

부족한 글이지만 여러분에게 도움이 되었으면 합니다. ^^ 모두 즐거운 코딩생활되세요. ospace.

참고

[1] Sonatype Nexus Repository, https://help.sonatype.com/en/sonatype-nexus-repository.html

[2] Sonatype Nexus Repository Docker, https://hub.docker.com/r/sonatype/nexus3/

[3] Repository Management, https://help.sonatype.com/en/repository-management.html

[4] Maven Repositories, https://help.sonatype.com/en/maven-repositories.html

[5] Maven Settings Reference, https://maven.apache.org/settings.html

반응형

'4.개발 및 운영 환경' 카테고리의 다른 글

무중단 배포 전략 3가지  (0) 2024.03.27
아파치에서 여러 URL를 톰캣으로 연동하기  (3) 2024.03.19
가상화 솔루션 Proxmox-VE 사용  (0) 2024.03.15
VisualVM 소개  (2) 2024.03.15
CTIP 소개  (0) 2023.12.28