[Jenkins] Jenkins pipeline 확장

배창민·2025년 12월 16일
post-thumbnail

Jenkins 파이프라인 고도화 핵심 정리

1. 테스트 자동화 통합

Jenkins 파이프라인에 테스트 단계를 추가해 코드 변경 시 자동으로 테스트를 실행하고, 결과를 Jenkins UI에서 확인 가능하게 구성한다.

1-1. Run Tests 스테이지 추가

  • stage('Run Tests')Source Build 다음에 추가
  • Unix/Windows 환경을 분기해 Gradle 테스트 실행
  • 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'
        }
    }
}

1-2. JUnit 결과 파일 경로

  • Gradle 기본 테스트 결과 위치 기준
  • 필요 시 프로젝트 구조에 맞춰 패턴 조정
**/build/test-results/test/*.xml

1-3. 결과 확인 포인트

  • Jenkins Job 화면에서 Test Result(또는 테스트 결과) 메뉴로 확인
  • 실패 테스트가 있으면 실패 케이스/스택트레이스 확인 가능

2. 파라미터 빌드 (환경/태그 선택)

하나의 Jenkinsfile로 여러 배포 시나리오를 처리하기 위해 빌드 파라미터를 사용한다.

2-1. 사용 시나리오

  • dev/stage/prod 환경별로 배포 정책이 다를 때
  • Docker 이미지 태그(버전)를 선택해서 배포해야 할 때
  • CI는 자동, CD는 수동(선택 기반)으로 운영할 때

2-2. 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)

2-3. 파라미터 값 사용

  • 파이프라인 내부에서 params.<이름>으로 접근
def tag = params.IMAGE_TAG
if (params.DEPLOY_ENV == 'dev') {
    echo "dev 환경"
}

2-4. 예시: 환경에 따라 Push 정책 분기

  • 공통: 이미지 빌드 수행
  • dev: 빌드만 하고 push 생략
  • stage/prod: Docker Hub 로그인 후 push 수행
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}"
                    }
                }
            }
        }
    }
}

2-5. 파라미터 빌드 실행 방법

  • parameters가 있는 Job은 Build With Parameters 버튼이 생성됨
  • DEPLOY_ENV, IMAGE_TAG 입력 후 실행

예시 입력

DEPLOY_ENV: prod
IMAGE_TAG: 1.0.3

3. Discord Notifier로 빌드 결과 알림

Jenkins 빌드 성공/실패 결과를 Discord로 전송한다.
Slack/Email처럼 알림 채널을 붙이는 방식의 확장이다.

3-1. 사전 설정 개요

  • Jenkins에 Discord Notifier 플러그인 설치

  • Discord 서버에서 Webhook 생성 후 URL 확보

  • Jenkins Credentials에 Webhook URL 저장

    • Kind: Secret Text
    • Secret: Discord Webhook URL
    • ID: 예) discord

3-2. Jenkinsfile post를 Discord 알림으로 변경

  • withCredentials로 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"
            )
        }
    }
}

3-3. 핵심 포인트

  • withCredentials: Jenkins에 저장된 민감정보를 코드에 직접 노출하지 않고 주입
  • credentialsId: Jenkins Credentials에 등록한 ID와 동일해야 함
  • discordSend: Discord Notifier 플러그인이 제공하는 전송 함수

정리

  • 테스트 자동화는 Run Tests 스테이지와 junit 리포트 수집으로 구성
  • 파라미터 빌드는 parameters + params.<name>로 환경/버전 선택형 파이프라인을 구현
  • Discord 알림은 Webhook URL을 Credentials로 관리하고 post에서 성공/실패 메시지를 전송
profile
개발자 희망자

0개의 댓글