저장소 관리

넥서스를 사용하다 보면 새로 저장소를 추가하거나 변경할 일이 발생한다. 프록시 저장소는 추가할 일이 많지 않지만 호스트 저장소는 팀이나 프로젝트 별로 분리하여 운영하는 경우가 많으므로 자주 발생한다.

각 저장소 종류별 추가, 변경, 삭제하는 방법을 알아 보자.

 

저장소 추가

프록시 저장소 추가

먼저 프록시 저장소를 추가하는 방법을 알아 보자.  

거의 대부분의 아티팩트는 메이븐 중앙 저장소에 있기 마련이고 라이선스 문제로 중앙 저장소에 없는 아티팩트는 3rd party 저장소에 등록해서 사용하면 되지만 별도의 저장소를 제공하는 제품이 있을수 있다.

유명한 이슈 관리 시스템인 JIRA의 개발사인 atlassian 사의 경우에도 자사의 아티팩트를 별도의 공개 저장소를 통해서 제공하고 있다. 

메이븐 저장소의 URL은 https://maven.atlassian.com/public/ 이며 이 URL 로 프록시 저장소를 추가해 보자.

  1. 관리자로 로그인 한후에 좌측의 메뉴에서 Repositories 를 클릭하여 저장소 목록을 띄운다.
  2. 상단의 메뉴중 Add 를 클릭하고 저장소 종류에서 Proxy Repository 를 선택한다.
     
  3. 저장소 설정 화면을 다음과 같이 설정한다.
     
    Repository ID: maven 의 pom 파일등에 기술할 때 사용할 id 를 입력한다. 
    Repository Name: 저장소의 이름을 알아보기 쉽게 기술한다.
    Remote Storage Location: 원격 저장소의 URL 을 설정한다.
    Download Remote Indexes: 원격 저장소의 인덱스를 다운받을 지 여부이며 꼭 True로 설정하자.
    Auto Blocking Enabled: True 일 경우 원격 저장소를 사용할 수 없을 때 넥서스는 자동으로 프록시 저장소를 차단한다. 프록시 저장소가 차단되어도 로컬에 있는 캐쉬로 클라이언트에게 아티팩트를 제공하지만 로컬에 없을 경우 리모트에 연결하지는 않는다. 넥서스는 일정 시간 이후로 다시 연결을 시도하여 원격 저장소가 연결 가능하게 되면 프록시 저장소 차단을 해제한다.
  4. Save 를 클릭하여 설정을 저장한다. 
  5. 다시 좌측의 Repositories  를 클릭하면 저장소가 추가된 것이 보일 것이다.

 

이제 저장소가 추가되었으니 메이븐에서 여기 있는 아티팩트를 사용하려면 두 가지 방법이 있다.

  1. 메이븐의 pom 파일에 새로 추가된 저장소의 ID 와 URL 을 추가해 준다. pom 파일의 <repositories> 에 다음과 같은 저장소 설정이 추가되어야 한다.

    <repository>
    <id>atlassian-public</id>
    <name>atlassian public mirror Repository</name>
    <layout>default</layout>
    <url>https://nexus.example.com/content/repositories/atlassian-public/</url>
    </repository>

  2. 그룹 저장소에 새로 추가된 저장소를 추가한다. 

 

2번은 메이븐의 빌드 설정을 변경할 필요가 없고 넥서스 관리자가 설정만 변경하면 되므로 더 사용이 간편하다. 이 방법대로 그룹 저장소를 변경해 보자.

  1.  Repositories 를 클릭하여 저장소 목록을 띄운다.
  2. 저장소 목록에서 Public Repositories 를 클릭한다.
  3. 하단의 Available Repositoies 에서 새로 추가한 저장소를 클릭한 후에 아래의 화살표 버튼(Add) 을 클릭한다.

  4. 저장소가 추가되었으면 Save 를 눌러서 설정을 적용한다.

  5. 이제 그룹 저장소를 통해 외부의 아티팩트를 사용할 수 있다.
    좌측의 검색창은 원격지에서 인덱스를 받지 못했을 경우 제대로 동작하지 않는다. 기존 pom 파일의 <dependencies> </<dependencies> 사이에 다음 아티팩트를 추가하여 정상 동작 여부를 확인해 보자.

    <dependency>
    <groupId>com.atlassian.pom</groupId>
    <artifactId>atlassian-base-pom</artifactId>
    <version>39</version>
    <type>pom</type>
    </dependency>

    확인하려는 아티팩트는 jar 가 아닌 pom 파일이므로 type 에 pom 이라고 기술해 주어야 한다.

  6. 이제 maven compile 을 실행해서 확인해 보자. 다음과 같이 아티팩트를 다운로드 받으면 정상 설정된 것이다.



호스트 저장소 추가

프로젝트 팀마다 별도의 넥서스 서버를 사용할 수도 있겠지만 이는 그리 좋은 방법은 아니다. 회사에서 하나의 넥서스를 같이 사용하고 팀별로 저장소를 분리하는 게 관리 측면과 공유 차원에서 좋은 선택이다.

다른 저장소에 있는 아티팩트를 삭제하는 등의 실수를 방지하지 위해서는 저장소별, 그룹별로 권한을 나누어서 관리하는 게 유용하다.

이제 호스트 저장소를 생성해 보자.

  1. 저장소 목록에서 상단의 Add 를 누른후에 Hosted Repository 를 선택한다.
  2. 먼저 릴리스 저장소 정보를 입력해 보자.

    Repository ID: 저장소의 ID 이다. 유일한 id 를 적어주자.
    Repository Name: 저장소 목록에서 보이는 이름이니 식별 가능하게 적어주자.
    Repository Policy: 저장소가 릴리스인지 스냅샷인지 여부를 설정한다. 여기서는 릴리스를 선택하자.
    Deployment Policy: 릴리스 저장소일 경우 Disable Redeploy 로 설정한다.

  3. Save 를 눌러서 저장한다.
  4. 저장소 목록에서 상단의 Add 를 누른후에 Hosted Repository 를 선택한다.
  5. 스냅샷 저장소를 설정한다.

    Repository ID: 저장소의 ID 이다. 보통 릴리스와 스냅샷은 쌍으로 설정하므로 릴리스 저장소의 ID 에 -snapshots 을 붙여 준다.
    Repository Name: 저장소 목록에서 보이는 이름이니 식별 가능하게 적어주자.
    Repository Policy: 스냅샷 저장소이므로 스냅샷을 선택한다.
    Deployment Policy: 스냅샷 저장소는 동일한 버전으로 여러 번 디플로이 될 수 있으므로 Allow Redeploy 로 설정한다. 

  6. Save 를 눌러서 저장한다.
  7. 저장소 목록에서 추가된 두 개의 저장소가 표시될 것이다.

 

저장소 삭제

저장소 삭제는 저장소의 구분과 상관없이 단일 메뉴로 동작한다. 삭제는 저장소의 목록 화면에서 상단의 Delete 버튼을 누르면 진행된다.

  1. 먼저 테스트를 위한 저장소를 하나 추가해 보자. 필자는 test-repo 라는 이름으로 저장소를 추가했다.
  2. 저장소 목록을 표시한 후에 삭제할 저장소를 클릭하여 선택한다.
  3. 삭제할 저장소가 선택된 상태에서 상단의 Delete 버튼을 누른다.

  4. 확인창에서 Yes 를 누르면 저장소가 삭제되며 목록에서 제외된다.

삭제된 저장소에 있던 아티팩트는 클라이언트에서 다운로드 할 수 없으므로 기존에 다운받지 않은 클라이언트는 빌드시 에러가 발생하게 된다.

저장소는 실제 파일 시스템에서 바로 삭제되지 않으며 sonatype-work/nexus/trash/ 디렉터리 밑에 저장소 id로 이동된다. 삭제한 저장소 id 가 test-repo일 경우 sonatype-work/nexus/trash/test-repo 가 삭제된 저장소의 파일 시스템 경로이다.

 

저장소 복구

삭제된 저장소는 두 가지 절차를 거치면 복구할 수 있다.

먼저 sonatype-work/nexus/trash/ 경로에서 sonatype-work/nexus/storage/ 로 이동시킨다. 혹시 실수로 test-repo 를 삭제했을 경우 다음 명령어를 실행한다.

mv sonatype-work/nexus/trash/test-repo sonatype-work/nexus/storage/

아직은 저장소 목록에서 삭제된 저장소가 표시되지는 않는다. Add 를 눌러서 삭제한 저장소와 동일한 저장소 ID 를 갖는 저장소를 생성해 주자.

그러면 저장소가 표시되고 삭제한 아티팩트도 모두 표시되는 것을 확인할 수 있다.

 

저장소 완전 삭제

저장소를 파일 시스템에서도 삭제하려면 저장소 목록 화면에서 상단의 Trash 버튼을 클릭하면 된다. 이 방법은 파일 시스템에서도 삭제하므로 돌이킬 수 없으므로 주의해서 실행하자.

 

 

사용자와 권한 관리

넥서스는 권한 기반의 접근 통제(RBAC - Role-Based Access Control) 이 구현되어 있으므로 사용자 별로 세밀한 권한 조정이 가능하다.

 

이제 전사 공용으로 넥서스를 사용하는 경우를 생각해 보자. 공용 넥서스이므로 팀이나 프로젝트별로 저장소를 나누고 공유할 아티팩트가 있으면 여기에 디플로이 하면 된다.

이런 환경에서 사용하려면 다른 팀과 프로젝트는 자신의 저장소가 아니라면 다운로드와 보기만 가능해야 하며 타 팀의 저장소에는 디플로이가 안 되어야 한다.

 

이제 새로운 사용자를 생성하고 넥서스의 권한 관리 기능을 사용하여 이 사용자만 새로 추가된 호스트 저장소에 디플로이 가능하게 설정해 보자.

 

특권(Privileges)

특권은 리소스 읽기, 업데이트, 생성, 관리 및 특정 작업을 수행할 수 있는 권한이다. 

 넥서스는 기본적으로 변경할 수 없는 코어 특권 그룹을 내장하고 있으며 관리자는 저장소마다 세밀하게 권한과 역할을 사용자별로 설정할 수 있다.

 

Targets

 

특권은 자원이나 타겟과 연계되어 있다. 넥서스에서 타겟은 특별한 저장소 또는 저장소 그룹일수 있으며 이를 저장소 타겟이라고 부른다.

타겟을 사용하면 특정한 특권을 단일 그룹 id와 일치 시킬수 있다.


역할(Roles)

특권을 묶어서 역할로 관리하면 사용자 별로 허용할 자원이나 작업을 설정하지 않고 역할별로 설정 가능하므로 설정이 간편해 진다.

예로 저장소에 디플로이 하는 사용자는 저장소 ID 를 빼고는 비슷한 권한을 가져야 한다. 

역할은 한개 이상의 특권을 포함하며 다른 역할도 포함할 수 있다.


Users

사용자별로 특권이나 역할을 부여할 수 있다. 

Users can be assigned roles and privileges, and model the individuals who will be logging into Nexus and read, deploying, or managing repositories.


특권 설정

위에서 생성한 두 개의 호스트 저장소용 특권을 설정해 보자.  

  1. 좌측의 Security -> Privileges 를 클릭하면 특권 목록이 펼쳐진다. 여기에서 Add 를 누르고 Repository Target Privileges 를 클릭한다.

     

  2. 권한 설정 화면에서 NameDescription 을 설정한다. Repository 는 위에서 추가한 2개의 호스트 저장소중 릴리스를 선택한다.

     

  3. Save 를 눌러서 저장한다.
  4. 다시 Add 를 누르고 특권 생성 화면으로 들어간다. 
  5. 이번에는 스냅샷 저장소에 대한 정보를 설정한다.

     

  6. Save를 클릭한 후에  특권 목록 화면을 보면 브라우징 해보면 다음과 같이 CRUD(Create, Read, Update, Delete) 별로 특권이 생성된 것을 알 수 있다.

     

 

역할 설정

이제 특권을 묶어서 역할을 설정해 보자.  디플로이에 필요한 권한은 보통 비슷하므로 저장소만 다르게 설정하면 된다.

  1. 좌측의 Roles 를 클릭하고 역할 목록에서 상단의 Add 를 클릭한다.

     

  2. Nexus Role 를 선택한다.
  3. Role Id 와 Name, Description 을 설정한다.

     

  4. Role/Privileges Management 리스트 박스에서 Add 를 눌러서 세부적인 특권과 역할 설정 화면으로 들어간다.
  5. 상단의 필터에 Project 를 입력하고 필터를 적용한 후에 나온 모든 특권을 추가한다.

     

  6. Ok 를 누른 후에 역할을 저장한다.


사용자 생성 및 역할 부여

이제 저장소에 디플로이 할 수 있는 사용자를 생성하고 역할을 부여해 보자.


  1. 좌측의 Security -> Users 를 선택한후 상단의 Add 를 클릭하고 Nexus User 를 선택한다.

     

  2. 사용자의 ID 와 이름, 이메일과 암호를 설정한다. Status 는 Active 로 해야 한다.

     

  3. 하단의 Role managementAdd 를 클릭하여 역할 관리 화면으로 들어간다.
  4. 역할 목록에서 다음 세 가지 역할을 추가한다.
    Nexus Deployment Role
    Nexus Developer Role
    Project shared Repos Role

     

  5. OK 를 눌러서 저장을 마친다.


저장소에 디플로이

이제 사용자와 역할을 설정했으니 메이븐으로 해당 저장소에 디플로이 해보자.

디플로이용 프로젝트는 전 절에서 사용한 lib-hello 프로젝트를 사용하자.


먼저 디플로이를 위해 디플로이용 저장소를 설정해야 한다. .m2/settings.xml 의 <servers> 항목에 다음 내용을 추가하자.

<servers>
<server>
<id>project</id>
<username>project</username>
<password>proj123</password>
</server>
<server>
<id>project-snapshots</id>
<username>project</username>
<password>proj123</password>
</server>

</servers>


server 의 id 는 pom.xml 에 설정하는 id 와 일치해야 하므로 잘 기억해 두자.

이제 pom.xml 의 <distributionManagement> 에 다음과 같이 저장소 정보를 설정하자.

<distributionManagement>
<repository>
<id>project</id>
<url>https://nexus.example.com/content/repositories/shared/</url>
</repository>
<snapshotRepository>
<id>project-snapshots</id>
<url>https://nexus.example.com/content/repositories/shared-snapshots/</url>
</snapshotRepository>

</distributionManagement>


ID 는 settings.xml 과 일치해야 한다. URL 은 넥서스의 저장소 목록에서 보이는 URL 을 설정하면 된다.

이제 새로운 저장소로 디플로이하기 위한 모든 설정을 마쳤다. 메이븐으로 디플로이 해 보자.

maven deploy

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.208s
[INFO] Finished at: Sat Aug 30 12:15:35 KST 2014
[INFO] Final Memory: 8M/21M

릴리스에 정상적으로 디플로이 되었다면 이제 스냅샷에 디플로이 해보자. 스냅샷에 디플로이 하기 위해서는 pom.xml 의 <version> 을 수정해야 한다.

다음처럼 버전에 SNAPSHOT 이 들어 간다면 자동으로 스냅샷 저장소로 디플로이 한다.

<version>1.0-SNAPSHOT</version>


pom.xml 의 버전 항목을 위와 같이 수정했다면 이제 디플로이 해보자. 스냅샷은 동일 버전에 대해 여러 번 디플로이해도 에러가 발생하지 않는다.

maven deploy 를 마쳤으면 저장소 목록에서 해당 저장소를 브라우징 해보자.

다음과 같이 아티팩트가 디플로이 된 것을 확인할 수 있다.



디플로이 문제 해결

메이븐으로 디플로이 할때 가장 문제가 많이 발생하는 경우는 보통 다음과 같다. 혹시 디플로이가 안 되는 독자들을 위해 주요 원인을 알아 보자.

 

settings.xml 과 pom.xml 의 ID 불일치

settings.xml 에 <servers> 에 설정한 server ID와 pom.xml 의 <distributionManagement>의 <repository> 에 설정한 ID 가 일치하지 않는 경우이다.

가장 흔한 실수이며 이 경우 HTTP 401 Unauthorized 에러가 발생하게 되므로 메이븐이 빌드 결과 코드를 확인해 보자.

 

 

잘못된 ID와 암호

settings.xml 에 암호나 ID 를 잘못 설정한 경우이다. 이것도 위와 마찬가지로 HTTP 401 에러가 발생한다.

 

릴리스 저장소에 동일 버전으로 다시 디플로이

릴리스 저장소는 기본적으로 재 디플로이가 안 되게 설정되어 있다. 이미 디플로이되어 있는 버전을 다시 디플로이할 경우 실패하게 된다.

이 경우 HTTP 400  Bad Request 가 메이븐 결과 값으로 출력되므로 디플로이가 실패했다면 넥서스에 해당 버전이 있는지 확인해 보자.