
Jenkins 파이프라인에 테스트 단계를 추가해 코드 변경 시 자동으로 테스트를 실행하고, 결과를 Jenkins UI에서 확인 가능하게 구성한다.
stage('Run Tests')를 Source Build 다음에 추가post { always { junit ... } }로 테스트 리포트 수집stage('Run Tests') {
steps {
script {
if (isUnix()) {
sh "./gradlew test"
} else {
bat "gradlew.bat test"
}
}
}
post {
always {
junit '**/build/test-results/test/*.xml'
}
}
}
**/build/test-results/test/*.xml
하나의 Jenkinsfile로 여러 배포 시나리오를 처리하기 위해 빌드 파라미터를 사용한다.
parameters 블록을 최상단에 추가하면 UI에서 입력 폼이 자동 생성됨pipeline {
agent any
tools { ... }
environment { ... }
parameters {
choice(
name: 'DEPLOY_ENV',
choices: ['dev', 'stage', 'prod'],
description: '배포할 환경 선택'
)
string(
name: 'IMAGE_TAG',
defaultValue: 'latest',
description: 'Docker 이미지 태그'
)
}
stages { ... }
}
DEPLOY_ENV: 배포 환경 선택 (dev/stage/prod)IMAGE_TAG: Docker 이미지 태그 입력 (예: latest, 1.0.3)params.<이름>으로 접근def tag = params.IMAGE_TAG
if (params.DEPLOY_ENV == 'dev') {
echo "dev 환경"
}
stage('Container Build and Push') {
steps {
script {
withCredentials([usernamePassword(
credentialsId: 'DOCKERHUB_PASSWORD',
usernameVariable: 'DOCKER_USER',
passwordVariable: 'DOCKER_PASS'
)]) {
def imageName = "${DOCKER_USER}/test-pipe"
def tag = params.IMAGE_TAG
def fullImage = "${imageName}:${tag}"
if (isUnix()) {
sh "docker build -t ${fullImage} ."
if (params.DEPLOY_ENV == 'dev') {
echo "dev 환경: push 생략"
} else {
sh "docker login -u ${DOCKER_USER} -p ${DOCKER_PASS}"
sh "docker push ${fullImage}"
}
} else {
bat "docker build -t ${fullImage} ."
if (params.DEPLOY_ENV == 'dev') {
echo "dev 환경: push 생략"
} else {
bat "docker login -u %DOCKER_USER% -p %DOCKER_PASS%"
bat "docker push ${fullImage}"
}
}
}
}
}
}
parameters가 있는 Job은 Build With Parameters 버튼이 생성됨DEPLOY_ENV, IMAGE_TAG 입력 후 실행예시 입력
DEPLOY_ENV: prod
IMAGE_TAG: 1.0.3
Jenkins 빌드 성공/실패 결과를 Discord로 전송한다.
Slack/Email처럼 알림 채널을 붙이는 방식의 확장이다.
Jenkins에 Discord Notifier 플러그인 설치
Discord 서버에서 Webhook 생성 후 URL 확보
Jenkins Credentials에 Webhook URL 저장
discordwithCredentials로 Webhook URL을 안전하게 로드discordSend로 메시지 전송post {
always {
script {
if (isUnix()) {
sh 'docker logout'
} else {
bat 'docker logout'
}
}
}
success {
withCredentials([string(credentialsId: 'discord', variable: 'DISCORD')]) {
discordSend(
description: """
빌드 성공
제목: ${currentBuild.displayName}
결과: ${currentBuild.currentResult}
실행 시간: ${currentBuild.duration / 1000}s
링크: ${env.BUILD_URL}
""",
title: "${env.JOB_NAME} 빌드 성공",
webhookURL: "$DISCORD"
)
}
}
failure {
withCredentials([string(credentialsId: 'discord', variable: 'DISCORD')]) {
discordSend(
description: """
빌드 실패
제목: ${currentBuild.displayName}
결과: ${currentBuild.currentResult}
실행 시간: ${currentBuild.duration / 1000}s
링크: ${env.BUILD_URL}
""",
title: "${env.JOB_NAME} 빌드 실패",
webhookURL: "$DISCORD"
)
}
}
}
withCredentials: Jenkins에 저장된 민감정보를 코드에 직접 노출하지 않고 주입credentialsId: Jenkins Credentials에 등록한 ID와 동일해야 함discordSend: Discord Notifier 플러그인이 제공하는 전송 함수Run Tests 스테이지와 junit 리포트 수집으로 구성parameters + params.<name>로 환경/버전 선택형 파이프라인을 구현post에서 성공/실패 메시지를 전송