외부망 통신이 되지 않는 폐쇄망 환경에서 소스 빌드를 할 때 Dependency를 받아오지 못하는 문제가 있음
이런 환경에서는 보통 자체적으로 Nexus를 구축하여 Repository를 구성하여 운영함
이때 Repository를 어떻게 구축하는지 알아보기 위함
오픈소스로 내부망 환경에서 사용할 수 있는 사설 Repository입니다. 다양한 종류의 Repository의 기능을 할 수 있지만 현업에서는 주로 내부망에서 빌드 시 필요한 라이브러리를 받아오거나, 개발팀의 공통 라이브러리를 개발하여 저장하는 용도로 많이 사용하고 있습니다.
Dependency를 가져오는 과정
외부망 통신이 되는 환경에서는 gradle.build나 pom.xml에 넣은 Dependency들을 외부 maven-repository에서 받아오게 됩니다.
(gradle 기준으로 IntelliJ에서 gradle.build에 dependency를 추가하고 gradle refresh를 해주면 dependency들을 받아오는것을 확인할 수 있음)
이렇게 받아온 Dependency들은 로컬 PC (Window)에서 아래의 경로에 저장되어 관리됩니다.
${user.home}/.m2/repository (C:\Users\{유저디렉토리}\.m2\repository)
Nexus를 설치하는 방법으로는 VM에 설치를 하거나, Docker를 통해 배포하거나, K8s를 통해 배포하는 등 다양한 방법이 있습니다.
저는 K8s 환경에 Nexus Repository를 구성하였습니다.
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nexus-data
namespace: nexus
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi
storageClassName: nfs
volumeMode: Filesystem
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nexus
namespace: nexus
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: nexus-server
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nexus-server
spec:
containers:
- image: 192.168.178.11:5000/sonatype/nexus3:3.45.1 # 외부망 통신 되는 경우 192.168.178.11:5000/ 삭제
imagePullPolicy: IfNotPresent
name: nexus
ports:
- containerPort: 8081
protocol: TCP
resources: ## resource는 사용환경에 맞게 유동적으로 조절
limits:
cpu: 1.5
memory: 4Gi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /nexus-data
name: nexus-data
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: nexus-data
persistentVolumeClaim:
claimName: nexus-data
---
apiVersion: v1
kind: Service
metadata:
name: nexus-service
namespace: nexus
spec:
ports:
- name: web
port: 80
protocol: TCP
targetPort: 8081
- name: web-secure
port: 443
protocol: TCP
targetPort: 8081
- name: docker-registry
port: 12000
protocol: TCP
targetPort: 12000
selector:
app: nexus-server
sessionAffinity: None
type: ClusterIP
---
## Ingress의 경우 Ingress Controller가 설치 된 경우 사용
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nexus-ingress
namespace: nexus
spec:
rules:
- host: nexus.hc.ehddhks.com
http:
paths:
- backend:
serviceName: nexus-service
servicePort: 80
path: /
pathType: Prefix
해당 Yaml를 배포하여 Nexus를 설치합니다.
Nexus 초기 계정 정보는 (ID: admin / PW: admin123) 입니다.
먼저 Nexus에 접속하여 오르쪽 상단 Sign in 버튼을 눌러 로그인을 진행합니다.
로그인을 하게 되면 상단바에 설정 아이콘이 보입니다. 설정 페이지에 들어갑니다.
Repositories 페이지로 들어갑니다.
Create Repository로 Repository 생성 페이지로 들어갑니다.
다양한 종류의 Repository를 생성할 수 있습니다. 여기서 maven2(hosted)를 눌러 생성해줍니다.
Nexus 홈 화면에서 Browse 버튼을 눌러 Repository가 생성된 것을 확인합니다.
로컬 PC의 Dependency 저장 경로(${user.home}/.m2/repository)를 K8s 클러스터에서 하나의 노드로 복사해 줍니다.
해당 노드에서 복사한 경로에 들어가 다음 쉘 스크립트를 실행시킵니다.
#!/bin/bash
files="./files.out"
username="admin" ## Nexus ID
password="admin" ## Nexus Password
nexusurl="http://{ Nexus endpoint }/repository/{ Repository 명 }/"
find . -name '*.*' -type f | cut -c 3- | grep "/" > $files
while read i; do
echo "upload $i to $nexusurl"
curl -v -u $username:$password --upload-file $i "$nexusurl$i"
done <$files
스크립트가 다 돌면 Nexus 콘솔에서 생성한 Repository에 들어가 잘 들어갔는지 확인합니다.