import java.text.SimpleDateFormat
def TODAY = (new SimpleDateFormat("yyyyMMddHHmmss")).format(new Date())
pipeline {
agent any
environment {
strDockerTag = "${TODAY}_${BUILD_ID}"
//strDockerImage ="계정명/프로젝트명:${strDockerTag}"
strDockerImage ="wombat1234/cicd_guestbook:${strDockerTag}"
//strGitUrl = "깃헙 레포"
strGitUrl = "https://github.com/wombatHero999/zenkins.git"
}
stages {
// 1. 깃헙 체크아웃(master)
stage('Checkout') {
steps {
git branch: 'master', url: strGitUrl
}
}
// 2. 소스코드 빌드
stage('Build') {
steps {
sh 'chmod +x mvnw'
sh './mvnw clean package'
}
}
// 3. 유닛테스트 수행
stage('Unit Test') {
steps {
sh './mvnw test'
}
// 결과 리포트 작성
post {
always {
junit '**/target/surefire-reports/TEST-*.xml'
}
}
}
// 4. 정적 테스트 수행
stage('SonarQube Analysis') {
steps{
echo 'SonarQube Analysis'
withSonarQubeEnv('SonarQube-Server'){
sh '''
./mvnw sonar:sonar \
-Dsonar.projectKey=guestbook \
-Dsonar.host.url=http://192.168.10.2:9000 \
-Dsonar.login=dfaa78e1a63c7ed61b65e00f5daa646c1666a11e
'''
}
}
}
// 5. 도커 이미지 빌드
stage('Docker Image Build') {
steps {
script {
oDockImage = docker.build(strDockerImage, "--build-arg VERSION="+strDockerTag+" -f Dockerfile .")
}
}
}
// 6. 도커 이미지 푸쉬
// - 여기 설정이 달라졌던거 같기도함. 확인필요
stage('Docker Image Push') {
steps {
script {
docker.withRegistry('', 'DockerHub_Credential') {
oDockImage.push()
}
}
}
}
// 7. 스테이징 서버(테스트)에 배포
stage('Deploy Staging') { // ← 기존 ssh 배포 → docker run으로 교체
steps {
sh '''
docker stop guestbookapp || true
docker rm guestbookapp || true
docker run --name=guestbookapp --rm -d \
-p 8081:10000 \
-e MYSQL_IP=host.docker.internal \
-e MYSQL_PORT=3306 \
-e MYSQL_DATABASE=guestbook \
-e MYSQL_USER=guestbook \
-e MYSQL_PASSWORD=education \
wombat1234/cicd_guestbook:1.0
'''
}
}
// 8. 테스트 완료 후 배포 승인 여부 확인
stage('Manual Approval for Production') {
steps {
// 'input' 스텝을 사용하여 사용자 입력을 기다립니다.
input {
message "스테이징 서버 테스트가 완료되었습니다. 프로덕션에 배포하시겠습니까?"
submitter 'admin' // 승인 권한이 있는 사용자
ok "배포 승인"
}
echo 'Approval received. Proceeding with production deployment.'
}
}
// 9. 프로덕션 서버에 배포
stage('Deploy Production') {
steps {
sshagent(credentials: ['Staging-PrivateKey']) {
sh "ssh -o StrictHostKeyChecking=no root@aws-public-ip docker container rm -f guestbookapp"
sh "ssh -o StrictHostKeyChecking=no root@aws-public-ip docker container run \
-d \
-p 8081:10000 \
--name=guestbookapp \
-e MYSQL_IP=172.31.0.120 \
-e MYSQL_PORT=3306 \
-e MYSQL_DATABASE=guestbook \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=education \
wombat1234/cicd_guestbook:1.0 "
}
}
}
}
// 8. 빌드 후 결과 노티
post {
success {
slackSend(tokenCredentialId: 'slack-token'
, channel: '#젠킨스-노티'
, color: 'good'
, message: "${JOB_NAME} (${BUILD_NUMBER}) 빌드가 성공적으로 끝났습니다. Details: (<${BUILD_URL} | here >)")
}
failure {
slackSend(tokenCredentialId: 'slack-token'
, channel: '#젠킨스-노티'
, color: 'danger'
, message: "${JOB_NAME} (${BUILD_NUMBER}) 빌드가 실패하였습니다. Details: (<${BUILD_URL} | here >)")
}
}
}