Introduce
지난번에 gitlab과 jenkins를 연동하는 것까지 했으니 이제 script를 작성해서 gitlab에 코드가 push 됐을 때 spring 서버 이미지를 빌드할 수 있도록 해보겠습니다. sonarqube를 이용해 소스코드 취약점을 분석하고 harbor로 private한 이미지 저장소를 구축해 보았습니다.
Harbor 저장소 띄우기
이미지를 빌드해서 올릴 저장소를 먼저 띄워보겠습니다.
먼저 harbor 인증서를 생성해줍니다.
# Root CA의 비밀키 생성
$ mkdir -p ~/certs
$ cd ~/certs
$ openssl genrsa -out ca.key 4096
#Root CA의 비밀키와 짝을 이룰 공개키 생성
$ openssl req -x509 -new -nodes -sha512 -days 365 \
-key ca.key \
-out ca.crt
서버 인증서 생성하기
# Server의 비밀키 생성
$ openssl genrsa -out server.key 4096
# Server의 CSR 파일 생성
$ openssl req -sha512 -new \
-key server.key \
-out server.csr
CSR 파일을 가지고 서버의 인증키를 생성
$ vi v3ext.cnf
# 아래 내용 추가
subjectAltName = IP:127.0.0.1,IP: //서버IP 추가
//SAN 등록하는 작업
openssl x509 -req -sha512 -days 365 \
-extfile v3ext.cnf \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in server.csr \
-out server.crt
Docker에서는 .crt 파일을 CA (인증 기관)의 인증서라고 간주해서 .crt 형식이 아닌 .cert 형식으로 변환
//인증서 업데이트
$ openssl x509 -inform PEM -in server.crt -out server.cert
# Docker
# host의 이름을 server라고 했으므로, /certs.d/server로 생성합니다.
sudo mkdir -p /etc/docker/certs.d/{서버 도메인}
cp server.cert /etc/docker/certs.d/{서버 도메인}/
cp server.key /etc/docker/certs.d/{서버 도메인}/
cp ca.crt /etc/docker/certs.d/{서버 도메인}/
# Host
sudo cp ca.crt /usr/local/share/ca-certificates/harbor-ca.crt
sudo cp server.crt /usr/local/share/ca-certificates/harbor-server.crt
sudo update-ca-certificates
Harbor 설치하기
//Harbor 설치
# 홈 디렉터리로 이동합니다.
$ cd ~
# 설치 파일을 다운로드 합니다.
$ wget https://github.com/goharbor/harbor/releases/download/v2.2.2/harbor-offline-installer-v2.2.2.tgz
# 다운로드한 파일을 압축 해제 합니다.
$ tar xzvf harbor-offline-installer-v2.2.2.tgz
# 압축이 해제된 harbor 디렉터리로 이동하여 작업을 수행합니다.
$ cd ~/harbo
harbor.yml 수정하기
인증서와 서버 주소를 수정해줍니다.
hostnam
https.certificate: /etc/docker/certs.d/server/server.cert
https.private_key: /etc/docker/certs.d/server/server.key
배포하기
$ ./prepare
$ sudo ./install.sh
최초 로그인은 admin과 Harbor12345로 하시면 되고 접속하셔서 정보 변경하면 됩니다.
Harbor 프로젝트 생성하기
harbor에 접속해서 프로젝트 생성하면 됩니다.
jenkins에 harbor 자격증명 등록하기
jenkins 파이프라인에 환경변수 추가
script에 사용되는 환경변수를 여기에 등록해줍니다.
jenkins 컨테이너에 인증서 넣어주기
jenkins 컨테이너에서 harbor로 접속하려 할 때 인증서가 필요해서 jenkins 컨테이너에 harbor 인증서를 넣어 줍니다.
$docker cp /path/to/ca.crt jenkins:/usr/local/share/ca-certificates/harbor-cert.crt
$ docker exec -it {컨테이너명} /bin/bash
$ update-ca-certificates
$ exit
//컨테이너 재시작
$ docker restart jenkins
Jenkins 파일 작성하기
이제 파이프라인이 동작할 스크립트를 작성해줍니다.
pipeline {
agent any
environment {
// GitLab 저장소에서 소스 가져오기 위한 자격 증명
GITLAB_CREDENTIALS_ID = 'jenkins-gitlab'
// Harbor 레지스트리 관련 변수
HARBOR_URL = "${HARBOR_URL}"
HARBOR_REPOSITORY_NAME = 'olivesafety'
HARBOR_REPOSITORY_URI = "${HARBOR_URL}/${HARBOR_REPOSITORY_NAME}/olivesafety"
IMAGE_TAG = 'latest'
HARBOR_PASSWORD = "${HARBOR_PASSWORD}"
HARBOR_USERNAME = "${HARBOR_USERNAME}"
//spring 서버 환경변수
DB_DRIVER= 'com.mysql.cj.jdbc.Driver'
DB_PASSWORD= "${DB_PASSWORD}"
DB_URL= "${DB_URL}"
DB_USERNAME= "${DB_USERNAME}"
JWT_TOKEN_SECRET= "${JWT_TOKEN_SECRET}"
REDIS_HOST= "${REDIS_HOST}"
REDIS_PASSWORD= "${REDIS_PASSWORD}"
REDIS_PORT= "${REDIS_PORT}"
}
stages {
stage('Checkout') {
steps {
// GitLab 저장소에서 소스 가져오기
checkout([$class: 'GitSCM',
userRemoteConfigs: [[url: 'https://gitlab.com/olivesafety/project.git', credentialsId: "${env.GITLAB_CREDENTIALS_ID}"]],
branches: [[name: '*/main']]
])
}
}
stage('Gradle Jar Build') {
steps {
sh 'chmod +x gradlew'
sh './gradlew clean bootJar'
}
}
stage('Build and Push Docker Image') {
steps {
script {
// Docker 이미지 빌드
sh "docker build -t ${env.HARBOR_REPOSITORY_NAME}:${env.IMAGE_TAG} ."
// Docker 이미지 태그 추가
sh "docker tag ${env.HARBOR_REPOSITORY_NAME}:${env.IMAGE_TAG} ${env.HARBOR_REPOSITORY_URI}:${env.IMAGE_TAG}"
// Harbor 레지스트리에 로그인 및 Docker 이미지 푸시
withCredentials([usernamePassword(credentialsId: 'harbor', usernameVariable: 'HARBOR_USERNAME', passwordVariable: 'HARBOR_PASSWORD')]) {
sh "echo ${env.HARBOR_PASSWORD} | docker login ${env.HARBOR_URL} --username ${env.HARBOR_USERNAME} --password-stdin"
sh "docker push ${env.HARBOR_REPOSITORY_URI}:${env.IMAGE_TAG}"
}
}
}
}
}
}
빌드가 18번만에 성공한 것을 확인할 수 있습니다.
이미지가 정상적으로 올라오는 것을 확인했습니다.
Next
이제 이미지 올리는 것까지 성공했으니 이미지를 이용해서 k8s 환경에 argocd를 이용해 배포하고 sonarqube와 trivy를 이용해 취약점을 분석해보겠습니다.
'Ops' 카테고리의 다른 글
메트릭 모니터링 환경 구축하기 (0) | 2024.12.04 |
---|---|
Jenkins로 ci/cd 파이프라인 구축하기(3) (0) | 2024.12.04 |
Jenkins로 ci/cd 파이프라인 구축하기(1) (0) | 2024.12.04 |
k8s 환경에 내 서비스 띄워보기 (0) | 2024.12.04 |
kind 이용해서 k8s 다뤄보기 (0) | 2024.12.04 |