이번 글에서는 Jenkins를 사용하여 VM 환경에 샘플 애플리케이션을 배포하는 실습을 다룬다.
배포는 'Freestyle'과 'Pipeline' 두 가지 방법을 사용한다.
- Freestyle : GUI를 통해 간단하게 빌드, 테스트, 배포 단계 설정할 수 있어 간단한 동작을 구성할 때 적합하다.
- Pipeline : 스크립트 형태로 정의하여 빌드, 테스트, 배포 파이프라인을 구성할 수 있어 복잡한 동작을 구성할 때 적합하다.
샘플 애플리케이션은 단순하게 ' Maven Project'라는 문구를 출력하는 애플리케이션이다.
- 배포할 샘플 애플리케이션 : spring boot
- 애플리케이션 빌드 : Maven
배포 구조는 다음 그림과 같다.
젠킨스 파이프라인을 수행하면 다음과 같은 절차로 진행된다.
- git 저장소에서 소스 코드를 받아온다.
- Maven 컴파일 > 테스트 > 빌드가 진행된다.
- 빌드된 결과파일(*. jar)을 원격 VM에 전송하고, 실행 스크립트가 실행되어 애플리케이션을 실행한다.
구성 환경
- EKS 클러스터
구성 버전
- Jenkins Helm Chart 버전 : 4.11.1
- Jenkins Helm APP 버전 : 2.426.2
전제 조건
- [Jenkins 구성]
- 샘플 Spring boot 애플리케이션
- Github 계정 & Personal Access token
1. 플러그인 설치
빌드된 파일 전송 및 명령 실행을 자동화하는 데 사용되는 'Publish Over SSH' 플러그인을 설치한다.
플러그인 설치 화면으로 이동하여 아래 플러그인을 설치 후 확인한다.
- 대시보드 > Jenkins 관리 > Plugins
git 저장소에 있는 소스 코드를 사용하여 빌드를 진행해야 하기 때문에 git 플러그인을 설치한다.
'Publish Over SSH' 플러그인 설치가 완료되었으면 Jenkins 프로젝트에서 사용할 수 있게 설정한다.
빌드된 결과 파일을 SSH로 전송할 대상 노드의 IP 주소, 유저, 비밀번호를 기입 후 저장한다.
- 대시보드 > Jenkins 관리 > System
2. Maven tool 설정
젠킨스 프로젝트에서 빌드할 때 Maven으로 빌드를 진행할 예정이라 빌드 전 Maven이 다운로드되도록 설정해야 한다.
젠킨스 tools 설정으로 이동하여 다음과 같이 이름과 설치될 버전 지정 후 저장한다.
- 대시보드 > Jenkins 관리 > Tools
3. Credentials 설정
젠킨스에서 빌드 전 git 저장소에 있는 소스 코드를 받아야 하기 때문에 git 저장소에 접근할 수 있는 자격 증명을 설정한다.
git 저장소에 접근할 수 있는 정보를 입력 후 저장한다. 여기서는 Password의 github의 access token을 입력하였다.
- 대시보드 > Jenkins 관리 > Credentials > System > Global credentials > Add Credentials
정상 등록되었는지 확인한다.
4. Project 생성
빌드 배포를 위한 Freestyle project를 생성한다.
소스 코드 관리
소스 코드 관리 설정에서 git 저장소를 입력하고 앞전에 생성한 Credentials을 선택한다.
정상이면 Repository URL 아랫부분에 아무런 문구가 뜨지 않고, 문제가 있으면 문구가 생긴다.
Build Steps
- Maven Version : 앞전에 생성한 Tools 설정에서 추가한 maven을 선택한다.
- Goals : mvn 빌드 진행할 명령어를 입력한다.
- 고급 > POM : pom.xml 파일의 위치를 입력한다.
빌드 후 조치
- Name : 앞전에 'Publish Over SSH' 플러그인 설치 후 설정했던 이름을 선택한다.
- Source files : 빌드 후 생성되는 jar 파일 위치를 입력한다.
- Remove prefix : SSH 원격서버에 jar 파일을 생성하는데, 디렉터리 포함하여 생성되기 때문에 디렉터리는 제거한다.
- Remote directory : 빌드 파일을 전송할 원격 서버의 디렉터리 이름을 입력한다. 디렉터리가 없는 경우 생성된다.
- 'deploy-maven'으로 입력했기 때문에 원격 서버의 홈디렉터리 아래 deploy-maven 디렉터리이다.
- Exec command : 빌드 파일이 전송된 후 원격 서버에서 실행될 명령어를 입력한다.
- 애플리케이션 실행을 위한 스크립트를 실행하는 명령어를 입력하였다.
Github 저장소에 소스 코드의 디렉터리 구조는 다음과 같다.
deploy-maven.sh 스크립트 내용은 다음과 같다.
- 원격 서버의 파일 위치
- ${HOME}/deploy-maven/deploy-maven.sh
#!/bin/bash
# JAR 파일 경로
JAR_FILE="demo-0.0.1-SNAPSHOT.jar"
# 로그 파일 경로
LOG_FILE="demo.log"
# 백그라운드에서 JAR 파일 실행
nohup java -jar $JAR_FILE >> $LOG_FILE 2>&1 &
5. 빌드 & 배포
다음과 같이 '지금 빌드'를 클릭하여 빌드를 진행하고 'Console Output'을 통해 결과내용을 확인한다.
프로젝트 생성 시 설정한 내용대로 빌드 & 배포가 진행된 걸 확인할 수 있다.
자세한 수행 절차는 그림을 통해 참고한다.
실제 원격 서버에 접근하여 확인해 보면 정상적으로 애플리케이션이 실행된 걸 확인할 수 있다.
웹브라우저에서 애플리케이션을 호출해 보면 정상 접근되는 걸 확인할 수 있다.
6. 파이프라인으로 빌드 & 배포
앞서 진행한 'Freestyle project'에서 진행한 결과와 동일하게 파이프라인으로 빌드 & 배포하려면 다음과 같이 진행하면 된다.
먼저 파이프라인 프로젝트를 생성한다.
파이프라인 부분에서 'Pipeline script' 선택 후 Script에 파이프라인 스크립트를 작성한다.
참고
'Pipeline script from SCM'을 사용하면 git 저장소에서 젠킨스 스크립트 파일을 저장하여 사용할 수 있다.
파이프라인 스크립트는 다음과 같이 작성 후 저장한다.
- environment에 각 환경에 맞게 적절한 값을 입력한다.
pipeline {
agent any
environment {
REMOTE_USER = '{HOST_USER}'
REMOTE_HOST = '{HOST+IP}'
REMOTE_DIR = 'deploy-maven'
PRJ_NAME = 'demo-project/maven-project'
JAR_FILE = "${PRJ_NAME}/target/*.jar"
POM = "${PRJ_NAME}/pom.xml"
GIT_CREDENTIAL = 'maven-credential'
GIT_URL = '{GIT_REPO_URL}'
}
tools {
maven 'maven'
}
stages {
stage('Build') {
steps {
git branch: 'main', credentialsId: "${GIT_CREDENTIAL}", url: "${GIT_URL}"
sh 'mvn -f "${POM}" clean package'
}
}
stage('Transfer') {
steps {
sshPublisher(publishers: [
sshPublisherDesc(
configName: 'test',
transfers: [
sshTransfer(
sourceFiles: "${JAR_FILE}",
removePrefix: "${PRJ_NAME}/target",
remoteDirectory: "${REMOTE_DIR}",
execCommand: 'cd deploy-maven; /bin/sh deploy-maven.sh',
flatten: false
)
]
)
])
}
}
}
}
위 파이프라인을 빌드하면 'reestyle project'로 빌드한 것과 동일한 결과를 확인할 수 있다.
실제 원격 서버에 접근하여 빌드된 파일이 전송되고, 스크립트가 정상 실행 되었는지 확인한다.
실행 log를 확인한다.
추가로 Github 플러그인을 설치하여 "GitHub hook trigger for GITScm polling" 기능을 사용하면, Github 저장소의 소스 코드 변경사항이 발생할 때마다 Github Webhook을 통해 Jenkins 파이프라인이 자동으로 트리거 되도록 구성할 수 있다.
'CICD > Jenkins' 카테고리의 다른 글
Jenkins란? 개념부터 설치 실행까지 (쿠버네티스 환경) (0) | 2023.12.23 |
---|
댓글