[TOC]
[ 다음편보기→ ]
1. 개요
폐쇄망에서 프로젝트를 수행하다 보면 의존 라이브러리들이 필요한 경우가 있다.
인터넷이 되는 환경이었다면 그냥 npm install
명령 또는 build.gradle
파일을 수정하여 해결하겠지만.
공공/국방 또는 금융권 같은 폐쇄망 프로젝트에서는 외부통신을 사용할 수 없기 때문에 nexus
서버를 구축해 사용하거나
node_modules
, .m2
또는 .gradle
같은 의존 라이브러리들을 개발자 개개인 별로 폴더째 압축/복사해서 배포하는 방법을 주로 사용한다.
이번 포스팅에서는 nexus 저장소(서버)를 사용하는 경우를 다룰 예정이다.
폐쇄망에서 nexus 를 사용한다면 아마도 다음과 같은 상황이 있을 듯 하다.
-
고객사가 nexus 를 운영하고 있고 직접 관리권한이 없는경우
이경우 아무것도 할수 없다. 없는거보단 나으니 그냥 고객사가 주는대로 개발하자.
-
고객사가 nexus 를 운영하고 있고 시행사에게 직접 관리권한을 제공해 주는 경우
nexus 저장소를 복제한 후
Backup
과Restore
기능을 이용해 복원한다.또는
proxy chaining
을 사용해 repository 를 복제한다. -
직접 nexus 를 설치할수 있는 경우 (고객사에서 서버 제공)
모든걸 컨트롤 할 수 있으니 차라리 이편이 좋다. 위 경우와 마찬가지로
Backup
,Restore
기능을 이용한다.
※ nexus를 구축하고나서 nexus 서버에 방화벽을 열 수 있는 상황이라면 적극 신청하자.
아래 두곳으로 outbound
만 열어두면 된다
2. 준비 및 설치
nexus 사본 구축 전 단계 까지는 반드시 internet이 되는 환경에서 시작해야 한다.
nexus 저장소는 아래 주소에서 받자. 3.70.x 버젼을 기점으로 구버젼(Orient-DB
사용) 과 신버젼(H2-DB
사용) 으로 구분되며 상호 호환성이 없으므로 버젼에 맞게 준비하던지, 아니면 별도로 마이그레이션을 해 주어야 한다.
- 구버젼 (
Orient-DB
: 3.70.x 까지버젼)
- 신버젼 (
H2-DB
: 3.71.x 이후버젼)
- 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 저장소부터 생성해야 한다.
Configuration
→Blob Stores
→Create Blob Store
순으로 클릭한다.
Type
은File
,Name
은 프로젝트명으로 설정하고Save
클릭하여 Blob 저장소를 생성한다.
Configuration
→Repositories
→Create 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 Content
→Browse
→ 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. 이제 만들어진 캐시저장소를 복사만 하면 되는데....
...
이번글도 분량이 ...
터져버렸다..
호달달
...
뭐 ..... 그런고로 다음편에 마무리 하겠다. (쿨럭..)
[ 다음편보기→ ]