CI를 위한 pipeline 구성
젠킨스에서 하나의 CI/CD 프로젝트를 구축하기 위해서는 아이템(Item)을 생성하여야 한다.
하나의 젠킨스 서버에 여러개의 아이템을 만들 수 있고 각각의 아이템들은 개발자가 설정하는 것에 따라 다르게 동작한다.
젠킨스에서 아이템을 만드는 방법은 대표적으로 FreeStyle과 Pipeline이 존재한다.
Freestyle
- 장점
- 웹 기반의 GUI를 통해 여러 플러그인을 쉽게 사용할 수 있다.
- 단점:
- CI 파이프라인에 변경 사항을 만들기 위해서는 젠킨스에 로그인해 각각의 프리스타일 잡의 설정을 변경해야만 한다.
- CI/CD의 과정을 콘솔을 통해서만 확인할 수 있다.
- 각각의 과정들을 한번에 보기 어렵다.
Pipeline
- 장점:
- 파이프라인은 코드로 프로젝트 설정을 할 수 있어 프리스타일과 다르게 젠킨스 웹에 직접 접근하지 않아도 설정 변경이 가능하다. (웹을 통한 설정도 가능하다.)
- CI/CD 파이프라인 설정을 하나의 스크립트 파일(Jenkinsfile)로 프로그래밍을 통해 할 수 있다.
- Freestyle과 다르게 하나의 스크립트 파일(Jenkinsfile)을 통해 흐름 제어를 할 수 있다.
- 일반 코드처럼 버전 관리가 가능하게 된다.
- 아래와 같이 GUI를 통해 현재 어떤 과정을 진행중이고 평균적으로 얼마만큼의 시간이 걸렸는지 통계와 피드백을 준다.
이러한 Pipeline의 장단점으로 인해 pipeline을 사용해 CI/CD 를 구현하기로 하였다.
1. 우선 CI를 위한 Item을 Pipeline 으로 만든다.
Item name 같은 경우는 편한대로 작성하면 된다. 이미지에는 test 라고 적혀있지만 추후에 CI로 새로 생성하였다.
ok를 누르면 다음 페이지로 이동하게 된다.
이미지와 같이 Github project를 클릭 후 github repository명을 적어준다
github에 특정 브랜치에 push가 발생할경우 build 및 test 되게 할 예정이므로 해당 토글을 클릭한다.
build를 위한 pipeline이므로 필요한 script를 작성한다
사용한 pipeline 코드
pipeline {
agent any
stages {
stage('Checkout') {
steps {
// push가 발생했을 경우 실행시킬 branch
git branch: 'test/jenkins', url: 'https://github.com/Inswave-2nd-mini-project/4go8go.git'
}
}
stage('Build') {
steps {
withCredentials([file(credentialsId: 'properties', variable: 'SECRET_FILE')]) {
sh 'chmod +x ./gradlew'
sh '''
// SECRET_FILE 로 저장된 properties를 가져와 build
echo "[DEBUG] SECRET_FILE path: $SECRET_FILE"
./gradlew clean build --stacktrace -PsecretFile=$SECRET_FILE
'''
}
}
}
stage('Test') {
steps {
withCredentials([file(credentialsId: 'properties', variable: 'SECRET_FILE')]) {
sh '''
echo "[DEBUG] SECRET_FILE path: $SECRET_FILE"
head -20 $SECRET_FILE # 파일 내용 일부 출력
ls -l $SECRET_FILE
./gradlew test -i --stacktrace -PsecretFile=$SECRET_FILE -Dspring.config.additional-location=file:$SECRET_FILE
'''
}
}
post {
always {
archiveArtifacts artifacts: 'build/reports/tests/test/**', allowEmptyArchive: true
publishHTML(target: [
reportDir: 'build/reports/tests/test',
reportFiles: 'index.html',
reportName: 'Test Report',
alwaysLinkToLastBuild: true,
keepAll: true
])
}
}
}
// docker를 실행시킬 수 있도록 docker file들을 아카이브에 따로 저장
stage('Archive Docker Files') {
steps {
sh '''
tar -czvf docker-artifacts.tar.gz docker-compose.yml dockerfiles/
'''
archiveArtifacts artifacts: 'docker-artifacts.tar.gz', fingerprint: true
}
}
// build가 된 .jar 파일을 아카이브에 저장
stage('Archive') {
steps {
archiveArtifacts artifacts: 'build/libs/*.jar', fingerprint: true
}
}
}
post {
success {
echo 'Build succeeded!'
}
failure {
echo 'Build failed!'
}
}
}
이후 메인화면에 CI pipe가 생성된다
정상적으로 구현되었다면 위에서 지정해둔 브랜치 (test/jenkins) 에 push 요청 발생 시, 자동으로 CI pipeline 이 실행된다
build를 클릭 후, console output을 클릭하면 진행상황 및 예외발생 구간을 알 수 있다.
정상적으로 실행되었다면 .jar, docker file 및 기타 파일들이 정상적으로 아카이브에 저장됨을 확인할 수 있다
'CI\CD' 카테고리의 다른 글
Github, Jenkins, Docker를 활용한 CI/CD - 3 (0) | 2025.05.19 |
---|---|
Github, Jenkins, Docker를 활용한 CI/CD - 1 (0) | 2025.05.17 |
docker로 jenkins 설치 (0) | 2025.05.09 |
docker란?, docker 사용방법 (0) | 2025.04.24 |