[Nexus] Nexus 설치 및 Repository 구축 방법 (Kubernetes)

Joseph's Engineering Blog·2023년 8월 31일
0
post-thumbnail

포스팅 이유

외부망 통신이 되지 않는 폐쇄망 환경에서 소스 빌드를 할 때 Dependency를 받아오지 못하는 문제가 있음
이런 환경에서는 보통 자체적으로 Nexus를 구축하여 Repository를 구성하여 운영함
이때 Repository를 어떻게 구축하는지 알아보기 위함


1. Nexus란?

오픈소스로 내부망 환경에서 사용할 수 있는 사설 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)

2. Nexus 설치 방법

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) 입니다.


3. Repository 구성 방법

먼저 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에 들어가 잘 들어갔는지 확인합니다.

profile
Kubernetes / DevOps / Git / Network / AWS / Terraform / Opensource / Java / Springboot

0개의 댓글