Nexus 저장소 를 복사해 보자! #1

Table of Contents

[TOC]

[ 다음편보기→ ]

1. 개요

폐쇄망에서 프로젝트를 수행하다 보면 의존 라이브러리들이 필요한 경우가 있다.

인터넷이 되는 환경이었다면 그냥 npm install 명령 또는 build.gradle 파일을 수정하여 해결하겠지만.

공공/국방 또는 금융권 같은 폐쇄망 프로젝트에서는 외부통신을 사용할 수 없기 때문에 nexus서버를 구축해 사용하거나

node_modules, .m2 또는 .gradle 같은 의존 라이브러리들을 개발자 개개인 별로 폴더째 압축/복사해서 배포하는 방법을 주로 사용한다.

이번 포스팅에서는 nexus 저장소(서버)를 사용하는 경우를 다룰 예정이다.

폐쇄망에서 nexus 를 사용한다면 아마도 다음과 같은 상황이 있을 듯 하다.


  1. 고객사가 nexus 를 운영하고 있고 직접 관리권한이 없는경우

    이경우 아무것도 할수 없다. 없는거보단 나으니 그냥 고객사가 주는대로 개발하자.

  2. 고객사가 nexus 를 운영하고 있고 시행사에게 직접 관리권한을 제공해 주는 경우

    nexus 저장소를 복제한 후 BackupRestore 기능을 이용해 복원한다.

    또는 proxy chaining 을 사용해 repository 를 복제한다.

  3. 직접 nexus 를 설치할수 있는 경우 (고객사에서 서버 제공)

    모든걸 컨트롤 할 수 있으니 차라리 이편이 좋다. 위 경우와 마찬가지로 Backup, Restore 기능을 이용한다.


※ nexus를 구축하고나서 nexus 서버에 방화벽을 열 수 있는 상황이라면 적극 신청하자.

아래 두곳으로 outbound 만 열어두면 된다

https://repo1.maven.org/maven2
https://registry.npmjs.org

2. 준비 및 설치

nexus 사본 구축 전 단계 까지는 반드시 internet이 되는 환경에서 시작해야 한다.

nexus 저장소는 아래 주소에서 받자. 3.70.x 버젼을 기점으로 구버젼(Orient-DB 사용) 과 신버젼(H2-DB 사용) 으로 구분되며 상호 호환성이 없으므로 버젼에 맞게 준비하던지, 아니면 별도로 마이그레이션을 해 주어야 한다.

  • 구버젼 (Orient-DB : 3.70.x 까지버젼)

https://help.sonatype.com/en/orientdb-downloads.html

  • 신버젼 (H2-DB : 3.71.x 이후버젼)

https://help.sonatype.com/en/download.html

  • Orient-DB → H2-DB 변환기 (사용법은 아래 마이그레이션 항목 참고) (분량조절 문제로 2편에서 다룰 예정)

https://download.sonatype.com/nexus/nxrm3-migrator/nexus-db-migrator-3.70.2-01.jar

  • 설치는 일단 리눅스 기반으로 설명하겠다. (다른 플랫폼 및 자세한 사용방법은 sonatype 사이트 참고)

## 파일을 받는다 Java-11사용, 구버젼 (3.70.2-01)
$ wget https://download.sonatype.com/nexus/3/nexus-3.70.2-01-java11-unix.tar.gz

download.sonatype.com (download.sonatype.com) 해석 중... 54.183.95.129, 54.219.149.219
다음으로 연결 중: download.sonatype.com (download.sonatype.com)|54.183.95.129|:443... 연결했습니다.
HTTP 요청을 보냈습니다. 응답 기다리는 중... 200 OK
길이: 256209881 (244M) [application/x-gzip]
저장 위치: ‘nexus-3.70.2-01-java11-unix.tar.gz’
... 중략 ...
nexus-3.70.2-01-java11-unix.tar.gz                   100%[=====================================================================================================================>] 244.34M  9.91MB/s    / 23s      
2024-10-08 15:08:42 (10.5 MB/s) - ‘nexus-3.70.2-01-java11-unix.tar.gz’ 저장함 [256209881/256209881]

## 압축을 푼다
$ tar -pzxvf nexus-3.70.2-01-java11-unix.tar.gz

nexus-3.70.2-01/.install4j/9d17dc87.lprop
nexus-3.70.2-01/.install4j/MessagesDefault
nexus-3.70.2-01/.install4j/build.uuid
... 중략 ...
sonatype-work/nexus3/tmp/.placeholder

## nexus 를 구동한다.
$ ./nexus-3.70.2-01/bin/nexus start
Starting nexus

## 구동로그 조회. 8081 번 포트로 실행된걸 확인할 수 있다.
$ tail -n8 ./sonatype-work/nexus3/log/nexus.log 

2024-10-08 15:12:16,430+0900 INFO  [jetty-main-1]  *SYSTEM org.eclipse.jetty.server.AbstractConnector - Started ServerConnector@261ffc0c{HTTP/1.1, (http/1.1)}{0.0.0.0:8081}
2024-10-08 15:12:16,430+0900 INFO  [jetty-main-1]  *SYSTEM org.eclipse.jetty.server.Server - Started @41146ms
2024-10-08 15:12:16,430+0900 INFO  [jetty-main-1]  *SYSTEM org.sonatype.nexus.bootstrap.jetty.JettyServer - 
-------------------------------------------------
Started Sonatype Nexus OSS 3.70.2-01
-------------------------------------------------

이제 브라우저에서 http://localhost:8081 을 입력하면 아래와 같은 화며이 뜬다.

우상단의 Sign in 을 클릭하면

대충 실행시킨곳의 sonatype-work/nexus3/admin.password 라는 파일에 admin 비밀번호가 있으니 입력하라고 한다.

메모장으로 파일을 열어 Password 란에 복사 붙여넣기 하고 로그인 한다. (Username = admin)

Setup wizard 가 실행되면 새로운 비밀번호를 입력해 주고 Enable anonymous access 에 체크해 주고 완료한다.

3. 패키지 캐싱

자 이제 본격적으로 Repository 를 만들고 캐싱해 보자

3-1. Repository 생성하기

  • 우선 blob 저장소부터 생성해야 한다. ConfigurationBlob StoresCreate Blob Store 순으로 클릭한다.

  • TypeFile, Name 은 프로젝트명으로 설정하고 Save 클릭하여 Blob 저장소를 생성한다.

  • ConfigurationRepositoriesCreate repository 순서대로 클릭하여 새로운 Repository 를 생성한다.

  • npm (proxy) 를 클릭한다.

  • Name 항목에 프로젝트명-npm-proxy 같은 형식으로 Repository명을 작성하고

  • 하단의 Remote storage 항목에 https://registry.npmjs.org 를 입력한다.

  • 더 밑으로 가면 Blob store 항목이 나오는데 위에서 생성해 두었던 test-proj 를 선택한다.

  • Create Repository 버튼을 클릭하여 생성을 완료한다.

  • 같은 방법으로 (maven2 (proxy), https://repo1.maven.org/maven2) maven-proxy repository 를 생성한다.

  • Browse ContentBrowse → Repository 클릭해서 조회해 보면

  • No Component/assets found in repository 라는 메시지가 떠있다 (아무것도 없는 상황)

자 이제 이 텅 빈 저장소를 패키지로 채워보자

3-2. node-js 패키지 (npm) 캐싱

node-js 프로젝트를 생성하고 필요한 패키지들을 설치한다. (일단은 next-js 프로젝트를 예 로 들겠다.)

## next-app 생성
$ npx create-next-app test-proj-web

Need to install the following packages:
create-next-app@14.2.14
... 중략 ...
137 packages are looking for funding
  run `npm fund` for details
found 0 vulnerabilities
Initialized a git repository.
Success! Created test-proj-web at /home/lupfeliz/tmp/test-proj-web

## 경로 이동
$ cd test-proj-web
## 필요한 패키지들 설치
$ npm install crypto-js jquery jsencrypt lodash moment @reduxjs/toolkit {...기타 필요한 패키지들}

added 33 packages, and audited 395 packages in 8s
144 packages are looking for funding
  run `npm fund` for details
found 0 vulnerabilities

여기까지 하고나면 package.json, package-lock.json, node-modules 가 만들어져 있을것이다.

package-lock.json 파일의 네트워크 의존성을 제거해 주고. (네트워크에 의존하지 않는 package-lock.json 만들기 편 참고)

## 네트워크 의존성 제거 리눅스에서 아래와 같이 수행 가능하다.
cat package-lock.json | sed -e 's/^[ \t\r\n]*"resolved":.*[ \t\r\n]*$//g' > tmp.json && mv tmp.json package-lock.json

이제 nexus 에 캐싱해 보자, npmjs.com 사이트가 아닌 nexus 에서 패키지를 가져오도록 프로젝트 폴더에 다음 내용과 같이 .npmrc 파일을 만든다.

## .npmrc 파일. 저장소 주소 : "test-proj-npm-proxy" 는 위에서 생성한 repository 이름
registry=http://localhost:8081/repository/test-proj-npm-proxy/
## proxy를 거치게 되므로 제한시간을 되도록 길게 잡아 주어야 한다. (10초 이상)
timeout=60000

이제 프로젝트 내 node-modules 폴더와 사용자의 npm-cache 를 지워준다 (윈도우에서는 /Users/{계정명}/AppData/Local/npm-cache, 리눅스에서는 /home/{계정명}/.npm)

## 윈도우에서는 아래와 같이 삭제 가능하다f.
> rmdir /S .\node_modules %LocalAppData%\npm-cache\_cacache

계속하시겠습니까(Y/N)? y

## 리눅스에서는 아래와 같이 삭제한다.
$ rm -rf ./node-module ~/.npm

이후 npm install 명령을 수행하고 nexus를 browse 해보면

$ npm install

... 중략 ...
added 394 packages in 24s
144 packages are looking for funding
  run `npm fund` for details

아래와 같이 패키지 내용이 캐시(업로드)되어 진 걸 볼수 있다. (실제 바이너리 파일들도 다운받을수 있다.)

3-3. java 패키지 (maven, gradle) 캐싱

java 에서는 maven-central 대신 nexus 에서 패키지를 가져오도록 build.gradle, build.gradle.kts 또는 pom.xml 파일을 수정해 준다.

/** build.gradle 파일에서 repositories 항목을 아래와 같이 수정한다. */
repositories {
  /** 기본 mavenCentral 삭제(또는 주석처리) */
  // mavenCentral()
  /** 위에서 작성된 maven repository 주소, (이 부분만 남기고 나머지 repository 는 전부 지워준다) */
  maven(url = uri("http://localhost:8081/repository/test-proj-maven-proxy/")).isAllowInsecureProtocol = true
}
<!-- maven (pom.xml) 의 경우 settings 항목을 수정한다 -->
<settings>
  ... 중략 ...
  <mirrors>
    <mirror>
      <id>test-proj-nexus</id>
      <url>http://localhost:8081/repository/test-proj-maven-proxy/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>
  ... 중략 ...
</settings>

이제 프로젝트 내 build 폴더와 사용자의 .gradle.m2 폴더를 지워준다 (윈도우에서는 /Users/{계정명}/.gradle, 리눅스에서는 /home/{계정명}/.gradle)

## 윈도우에서는 아래와 같이 삭제 가능하다f.
> rmdir /S .\build %USERPROFILE%\.gradle %USERPROFILE%\.m2

계속하시겠습니까(Y/N)? y

## 리눅스에서는 아래와 같이 삭제한다.
$ rm -rf ./build ~/.gradle ~/.m2

이후 gradlew build 명령을 수행하고 nexus를 browse 해보면

$ gradlew build

... 중략 ...
BUILD SUCCESSFUL in 42s
10 actionable tasks: 6 executed, 4 up-to-date

마찬가지로 패키지가 업로드 되어있는걸 확인할 수 있다.

여기까지 했다면 인터넷 없이 nexus 만 가지고 'npm', 'maven' 등 프로젝트 의존 라이브러리들을 가져올 수 있다.

4. 이제 만들어진 캐시저장소를 복사만 하면 되는데....

...

이번글도 분량이 ...

터져버렸다..

호달달

...

뭐 ..... 그런고로 다음편에 마무리 하겠다. (쿨럭..)

[ 다음편보기→ ]

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다