
Step 1) https://github.com/joneconsulting/cicd-web-project 에서 코드 가져와서 빌드
Step 2) 빌드 된 결과물을 docker-server로 전송
Step 3) docker-server에 전송 된 빌드 결과물(hello-world.war)을 이미지 생성
pipeline {
agent any;
tools {
maven 'maven3.8.8'
}
stages {
stage('git clone') {
steps {
git branch: 'main', url: 'https://github.com/joneconsulting/cicd-web-project';
}
}
stage('build') {
steps {
sh '''
echo build start
mvn clean compile package -DskipTests=true
''';
}
}
stage('transfer') {
steps {
sshPublisher(publishers: [
sshPublisherDesc(configName: 'docker-server',
transfers: [sshTransfer(
cleanRemote: false, excludes: '', execCommand: '',
execTimeout: 600000, flatten: false, makeEmptyDirs: false,
noDefaultExcludes: false, patternSeparator: '[, ]+',
remoteDirectory: '.', remoteDirectorySDF: false,
removePrefix: 'target', sourceFiles: 'target/*.war')],
usePromotionTimestamp: false, useWorkspaceInPromotion: false,
verbose: false)])
}
}
stage('image build') {
steps {
sshPublisher(publishers: [
sshPublisherDesc(configName: 'docker-server',
transfers: [sshTransfer(
cleanRemote: false, excludes: '',
execCommand: 'docker build --tag hello-world:test1.0 -f Dockerfile .',
execTimeout: 600000, flatten: false, makeEmptyDirs: false,
noDefaultExcludes: false, patternSeparator: '[, ]+',
remoteDirectory: '.', remoteDirectorySDF: false,
removePrefix: 'target', sourceFiles: 'target/*.war')],
usePromotionTimestamp: false, useWorkspaceInPromotion: false,
verbose: true)])
}
}
}
}

복잡하다. Jenkins에서 제공해주는 걸로 더 편하게 사용해보자
pipeline {
agent none
tools {
maven "maven3.8.8"
}
stages {
stage('Maven Install') {
agent any
when {
expression { params.MAVEN_BUILD == true }
}
steps {
git branch: 'main', url: 'https://github.com/joneconsulting/cicd-web-project'
sh 'mvn clean compile package -DskipTests=true'
}
}
stage('Docker Image Build') {
agent any
when {
expression { params.DOCKER_BUILD == true }
}
steps {
script {
if (params.DOCKER_IMAGE_TAG != "") {
echo "[docker image tag is not null]"
imageTag = params.DOCKER_IMAGE_TAG
} else {
echo "[docker image tag is null]"
imageTag = env.BUILD_NUMBER
}
}
// sh 'docker build -t edowon0623/cicd-web-project:$BUILD_NUMBER .'
// sh 'docker build -t edowon0623/cicd-web-project:' + imageTag + ' .'
echo 'docker build -t edowon0623/cicd-web-project:' + imageTag + ' .'
}
}
// stage('Docker Push') {
// agent any
// when {
// expression { params.DOCKER_PUSH == true }
// }
// steps {
// withDockerRegistry(credentialsId: 'harbor-user', url: 'https://192.168.0.41') {
// sh 'docker push 192.168.0.41/devops/cicd-web-project:$BUILD_NUMBER'
// }
// }
// }
}
}
when이면 step을 진행하라
when: 분기문
params: 가변 데이터
참이면 빌드 O 거짓이면 빌드 X
동적으로 imageTag명 변경할 일이 없어짐! good
jenkins server에서 docker build 해야하니 echo로 바꿈
매개변수 추가





console output

build-를 붙여보자


echo 대신 execCommand에 파라미터 넣어보기 🔽
pipeline {
agent none
tools {
maven "maven3.8.8"
}
stages {
stage('Maven Install') {
agent any
when {
expression { params.MAVEN_BUILD == true }
}
steps {
git branch: 'main', url: 'https://github.com/joneconsulting/cicd-web-project'
sh 'mvn clean compile package -DskipTests=true'
}
}
stage('Docker Image Build') {
agent any
when {
expression { params.DOCKER_BUILD == true }
}
steps {
script {
if (params.DOCKER_IMAGE_TAG != "") {
echo "[docker image tag is not null]"
imageTag = params.DOCKER_IMAGE_TAG
} else {
echo "[docker image tag is null]"
imageTag = env.BUILD_NUMBER
}
}
// sh 'docker build -t edowon0623/cicd-web-project:$BUILD_NUMBER .'
// sh 'docker build -t edowon0623/cicd-web-project:' + imageTag + ' .'
// echo 'docker build -t edowon0623/cicd-web-project:build-' + imageTag + ' .'
sshPublisher(publishers: [
sshPublisherDesc(configName: 'docker-server',
transfers: [sshTransfer(
cleanRemote: false, excludes: '',
execCommand: 'docker build --tag hello-world:' + imageTag + ' -f Dockerfile .',
execTimeout: 600000, flatten: false, makeEmptyDirs: false,
noDefaultExcludes: false, patternSeparator: '[, ]+',
remoteDirectory: '.', remoteDirectorySDF: false,
removePrefix: 'target', sourceFiles: 'target/*.war')],
usePromotionTimestamp: false, useWorkspaceInPromotion: false,
verbose: false)])
}
}
// stage('Docker Push') {
// agent any
// when {
// expression { params.DOCKER_PUSH == true }
// }
// steps {
// withDockerRegistry(credentialsId: 'harbor-user', url: 'https://192.168.0.41') {
// sh 'docker push 192.168.0.41/devops/cicd-web-project:$BUILD_NUMBER'
// }
// }
// }
}
}
배포 전략
cf) https://dev.classmethod.jp/articles/ci-cd-deployment-strategies-kr/

설명: 한 번에 전체 시스템을 새로운 버전으로 교체하는 방식
장점: 단순하고 빠르게 배포 가능
단점: 실패 시 전체 서비스 중단 위험 큼, 롤백 어려움
예시: 밤 12시에 전체 서비스 업데이트 후 새 버전 적용
설명: 서버나 인스턴스를 하나씩 순차적으로 새 버전으로 교체하는 방식
장점: 서비스 중단 최소화, 점진적 배포
단점: 배포 도중 구버전과 신버전이 공존 (호환성 이슈 가능)
예시: 10대 서버 중 2대씩 교체하면서 순차적으로 배포
설명: Blue(현재 운영 중)와 Green(새 버전) 두 개의 환경을 두고, 배포 후 트래픽을 Green으로 전환
장점: 빠른 롤백 가능, 배포 후 테스트 용이
단점: 두 개의 완전한 인프라 필요 (비용 증가)
예시: 새 버전 검증 후 트래픽을 Green 환경으로 스위칭
설명: 소수의 사용자에게만 새 버전을 먼저 배포 후 문제가 없으면 전체 배포
장점: 실사용자 대상 안정성 검증, 점진적 확대 가능
단점: 트래픽 분배 및 모니터링 시스템 필요
예시: 전체 유저 중 5%만 새 버전 사용 → 이상 없으면 100% 확대