IT 최신 트렌드

[CI/CD] 사내저장소 Nexus repository

SDT Father 2019. 11. 22. 10:28

개요

프로젝트 진행 시 외부 리포지토리를 접속하기 어렵습니다. 그러므로 사내망에 프로젝트 진행 시 필요한 라이브러리를 다운받을수 있게 하는 것이 꼭 필요하다.
개발자들은 필요한 라이브러리를 동일하게 제공 받고 회사에서는 당사 중요 라이브러리를 자체적으로 관리할수 있기 때문에 필수 요소라고 할수있다.
- 회사/단체의 화이트 리스트로 인해 외부 리포지토리에 접속하기 어려운 경우 프록시 역활.
- 특히나 비상시 외부 인터넷이 느리거나 리포지토리가 다운되는등 여러 상황에서도 빠르게 받을 수 있다.
- 현재 메이븐에 올라와 있지 않은 자료들은 효율적으로 관리하기 위하여.
- 한번 다운로드 받은 디펜던시는 로컬에 저장되지만 컴퓨터를 포멧하거나 동료가 시작할때 설정을 해야한다.
- 서버에도 동일한 설정들을 해줘야함으로 서버 구조가 복잡할 수록 잔업도 늘어난다.
- 예외 파일로 인한 설정이 줄어들어 전체적인 일관성이 증가한다.

 

설치(ubuntu 18)

jdk

sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk
설치경로 
/usr/lib/jvm/java-8-openjdk-amd64/

 

nexus 3.19(사이트에서 다운받으세욤)

cd /opt
sudo cp /home/ubuntu/nexus-3.19.1-01-unix.tar.gz . >> opt 복사하기 하고 압축 풀기 완료  

nexus 설정 

vi bin/nexus.rc
run_as_user="nexus"  >> 사용자 지정 

vi /opt/nexus/bin/nexus 자바jdk 설치경로
INSTALL4J_JAVA_HOME_OVERRIDE=/usr/lib/jvm/java-8-openjdk-amd64
sudo useradd nexus
sudo passwd nexus
sudo chown nexus.nexus /home/nexus >> 권한주기
sudo chown -R nexus:nexus nexus-3.19.1-01  >> 권한주기
sudo ln -s /opt/nexus-3.19.1-01/bin/nexus /etc/init.d/nexus
cd /etc/init.d
sudo update-rc.d nexus defaults
sudo service nexus start

Nexus 3 버전 초기화면이다. (2버전에서는 Maven 저장소 걔념이 강했으나 3버전에서는 다양한 저장포맷을 제공한다)

- 토커이미지도 저장가능 대단!! 

Repository>>Blob Stores 
모든 저장소는 Blob Store를 지정해줘야 합니다. Blob Store는 실제 데이터가 저장되는 장소이며, sonatype-work의 하위 디렉토리와 매칭됩니다.
- blob store base directory /opt/sonatype-work/nexus3/blobs 기본경로

- 등록되거나 미러링 되는 모든 라이브러리 저장하는 곳으로 다양하게 경로를 지정할수 있다.

Browse 메뉴에서는 다양한 포맷의 저장소를 생성할수 있다. 위에그림은 기본으로 제공하는 저장소세팅이다.

Repository Type
1. Hosted : 기본 Type으로서 회사 내에서 개발한 jar 파일 또는 회사에서 제품개발을 하기 위해서 구입한 3rd party의 jar 파일을 관리하는 Repository가  이에 속합니다. 
Nexus에서 기본적으로 제공하는 Hosted Type Repository는 Snapshots(사내 개발용 repository), 

Releases(사내 제품 repository), 3rd party를 제공합니다.
2. Proxy : Global Repository처럼 외부 Repository에 대해서 proxy 역할을 합니다. 
maven의 Central Repository는 매우 느리고, 최신 버전이 올라오는 데 굉장히 오래 걸립니다. 
그래서 jboss, springsource 등에서 별도의 maven repository를 구축하여 운영하고 있습니다. 
이런 경우에 각 개발자들이 해당 maven repository에 대한 설정을 각각 할 수 있기 때문에 Remote Repository를 외부 오픈소스에  대한 Proxy 서버로서의 역할을 수행할 수 있습니다. 
Nexus에서 기본적으로 제공하는 Proxy Type Repository는 Google Code, java.net, Maven Central이 있습니다. 
3. Virtual : 서로 다른 타입의 Repository에 대해서 adapter 역할을 합니다. 
현재 Nexus는 maven1 repository와 maven2 repository에 대한 atapter 역할만 제공하고 있습니다.
4. Group : 여러 개의 Repository를 하나로 묶어주는 역할을 합니다.

 

Repository
①   Snapshots : 빌드등 수시로 릴리즈 되는 바이너리를 배포 하는 장소
②   Releases : 정식 릴리즈를 통해서 배포되는 바이너리를 저장하는 저장소
③   3rd party : 벤더등에서 배포하는 (Oracle,IBM등) 바이너리를 저장해놓는 장소로 특정 솔루션등을 사용할때, 딸려 오는 라이브러리등을 여기에 놓고 사용한다
④   Proxy Repository : 원격에 원본 repository가 있는 경우, Local에 캐쉬 용도로 사용한다.
⑤   Virtual Repository : Repository Group은 몇 개의 repository를 하나의 repository로 묶어서 단일 접근 URL을 제공한다.

 

개념 정리
- central의 경우 maven repository에서 라이브러리 목록을 index 캐싱 해오고, pom.xml을 통해 실행을 하는 경우에 proxy를이용해 라이브러리를 다운받아 놓는다
- third party repository는 사용자가가 제작한 라이브러리나 벤더에서 제공하는 라이브러리를 저장할 수 있다.
- public repository는 central 라이브러리와 3rd party 라이브러리를 통합하여 제공한다. 
따라서 pom.xml에 public 라이브러리를 등록하면 모든 라이브러리를 접근하여 사용할 수 있게 된다.

 

테스트를 위해 STS에 sample 프로젝트를 생성했다. maven 프로젝트로 java 모듈개발 프로젝트로 생각하면된다.

저장소의 설정은 보통 settings.xml(로컬PC) 설정한다. >> 어느 저장소를 바라봐라 

그러나 pom.xml 파일에 설정도 가능하나  프로젝트생성시마다 설정해야하는 번거로움이 있으므로 setting.xml설정을 추천하는 바이다.

 

 <profiles>
	<profile>
      <id>shinhanDs</id>
      <repositories>
        <repository>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>          
          <id>shinhanDs-central</id>
          <url>http://54.180.80.219:8081/repository/maven-central/</url>
        </repository>
        <repository>
          <id>shinhanDs-releases</id>
          <name>ShinhanDs Releases Repository </name>
          <url>http://54.180.80.219:8081/repository/maven-releases/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>        
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>shinhanDs-plugins-releases</id>
          <name>shinhanDs Releases Repository </name>
          <url>http://54.180.80.219:8081/repository/maven-releases/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </pluginRepository>
  		<pluginRepository>
          <id>shinhanDs-central</id>
          <url>http://54.180.80.219:8081/repository/maven-central/</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </pluginRepository>          
      </pluginRepositories>
    </profile>
  </profiles>
  <activeProfiles>
	<activeProfile>shinhanDs</activeProfile>
  </activeProfiles>

profile: 저장소의 묶음으로 보면되고 id는 저장소를 구분하는 unique 키 

repository: 몇개의 저장소를 추가할것인가 이다. 테스트로 central, releases 두가지 저장소를 구성해보았다.

activeProfiles: profile 지정해둔 저장소를 활성화 하려면 추가하면된다.

 

sts를 종료후 다시 기동하면 메이븐 저장소 정보를 확인할수 있다. 

 

- test 라이브러리는 테스트를 위해 jar 파일을 업로드하여 등록했다. ( nexus 하위버전에서는 upload기능이 없다) 

  따로 업로드 스크립트를 짜서 올려야 하지만 최신버전은 해당기능을 제공하고 있다.

- junit, hamcrest-core 경우는 캐싱 기능으로 다운을 1번이라도 받으면 자체 저장소에 자동 등록된다. 그러므로 외부에서 다시 해당라이브러리를 가져오는것이 아니라 자체저장소에 존재하므로 캐싱기능이 된다는 말이다.

test.jar파일의 관리정보를 확인할수 있다. nexus는 등록한 라이브러리 관리에 굉장히 유용하다 버전별로도 관리되고 사용법도 위와 같이 제공한다.

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.shds.pi</groupId>
  <artifactId>sample</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>sample</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
<dependency>
  <groupId>com.shds</groupId>
  <artifactId>test</artifactId>
  <version>1.0</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13-rc-1</version>
    <scope>test</scope>
</dependency>
  </dependencies>
</project>

 

위와같이 pom.xml 설정을 하게되면 사내저장소에서 라이브러리를 다운받을수 있다.

결론

보안이 중요해지고 당사 사용하는 라이브러리를 관리하고자 하면 꼭 필요한 기능이라고 생각합니다.