ETC.

[Jenkins] ํŒŒ์ดํ”„๋ผ์ธ(Pipeline) ๋ฌธ๋ฒ•

carsumin 2025. 10. 12. 12:06
ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ข…๋ฅ˜
  • ํ‘œ์ค€์€ Declarative Pipeline
๊ตฌ๋ถ„ Declarative Pipeline Scripted Pipeline
๋ฌธ๋ฒ• ๊ตฌ์กฐํ™”๋œ DSL (์ถ”์ฒœ ๋ฐฉ์‹) Groovy ๊ธฐ๋ฐ˜ ์ž์œ ๋„ ๋†’์Œ
๊ฐ€๋…์„ฑ ๋†’์Œ ๋‚ฎ์Œ
์œ ํ˜• ์„ ์—ฐํ˜• (Declarative) ๋ช…๋ นํ˜• (Imperative)
ํŒŒ์ผ ํ˜•์‹ Jenkinsfile Jenkinsfile
๋Œ€ํ‘œ ๊ตฌ๋ฌธ pipeline { ... } node { ... }

 

 

Declarative Pipeline ๊ธฐ๋ณธ ๊ตฌ์กฐ
pipeline {
    agent any       // ์‹คํ–‰ํ•  ๋…ธ๋“œ (any: ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅ)

    environment {   // ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
        JAVA_HOME = '/usr/lib/jvm/java-11'
        PATH = "${JAVA_HOME}/bin:${env.PATH}"
    }

    options {       // ๋นŒ๋“œ ์˜ต์…˜
        timeout(time: 30, unit: 'MINUTES')
        buildDiscarder(logRotator(numToKeepStr: '10'))
    }

    stages {        // ๋นŒ๋“œ ๋‹จ๊ณ„ ์ •์˜
        stage('Checkout') {
            steps {
                echo "Git ์ €์žฅ์†Œ์—์„œ ์†Œ์Šค์ฝ”๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ"
                checkout scm
            }
        }

        stage('Build') {
            steps {
                echo "๋นŒ๋“œ ์ค‘..."
                sh 'mvn clean package -DskipTests'
            }
        }

        stage('Test') {
            steps {
                echo "ํ…Œ์ŠคํŠธ ์‹คํ–‰"
                sh 'mvn test'
            }
        }

        stage('Deploy') {
            steps {
                echo "์„œ๋ฒ„์— ๋ฐฐํฌ ์ค‘..."
                sh './deploy.sh'
            }
        }
    }

    post {          // ๋นŒ๋“œ ํ›„ ์ฒ˜๋ฆฌ
        always {
            echo "๋นŒ๋“œ ์ข…๋ฃŒ ํ›„ ํ•ญ์ƒ ์‹คํ–‰"
        }
        success {
            echo "โœ… ๋นŒ๋“œ ์„ฑ๊ณต"
        }
        failure {
            echo "โŒ ๋นŒ๋“œ ์‹คํŒจ"
        }
    }
}

 

 

์ฃผ์š” ๊ตฌ๋ฌธ
  • pipeline {} : Declarative ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ฃจํŠธ ๋ธ”๋ก
  • agent any : ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰ํ•  Jenkins ๋…ธ๋“œ ์ง€์ • (label, docker, none ๋“ฑ ๊ฐ€๋Šฅ)
  • stages {} / stage('name') : ์—ฌ๋Ÿฌ ๋‹จ๊ณ„ ์ •์˜ (๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ๋“ฑ)
  • steps {} : ๊ฐ ๋‹จ๊ณ„์—์„œ ์ˆ˜ํ–‰ํ•  ๋ช…๋ น์–ด ๋ชฉ๋ก
  • environment {} : ํŒŒ์ดํ”„๋ผ์ธ ์ „์—ญ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
  • options {} : ํƒ€์ž„์•„์›ƒ, ๋นŒ๋“œ ์œ ์ง€ ๊ฐœ์ˆ˜ ๋“ฑ ํŒŒ์ดํ”„๋ผ์ธ ์˜ต์…˜ ์ง€์ •
  • post {} : ๋นŒ๋“œ ์„ฑ๊ณต, ์‹คํŒจ, ํ•ญ์ƒ ์‹คํ–‰ ์‹œ ์ฒ˜๋ฆฌ ๋กœ์ง ์ง€์ •
  • when {} : ์กฐ๊ฑด๋ถ€ ์‹คํ–‰

 

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ๊ธ‰๋ฌธ๋ฒ•
  • ํŠน์ • ๋ธŒ๋žœ์น˜์—์„œ๋งŒ ์‹คํ–‰ํ•˜๊ธฐ
stage('Deploy') {
    when {
        branch 'main'
    }
    steps {
        echo "๋ฐฐํฌ ์‹คํ–‰"
    }
}

 

  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋Œ€๊ธฐ
stage('Approval') {
    steps {
        input message: '๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?', ok: '๋ฐฐํฌ ์ง„ํ–‰'
    }
}

 

  • ๋ณ‘๋ ฌ ์‹คํ–‰ (parallel)
stage('Parallel Test') {
    parallel {
        stage('Unit Tests') {
            steps {
                sh 'mvn test'
            }
        }
        stage('Integration Tests') {
            steps {
                sh 'mvn verify'
            }
        }
    }
}

 

  • ๋งคํŠธ๋ฆญ์Šค ๋นŒ๋“œ (Matrix)
matrix {
    axes {
        axis {
            name 'JAVA_VERSION'
            values '8', '11'
        }
        axis {
            name 'OS'
            values 'ubuntu', 'centos'
        }
    }
    stages {
        stage('Build') {
            steps {
                echo "Building on ${OS} with Java ${JAVA_VERSION}"
            }
        }
    }
}

 

  • ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€ ์กฐ๊ฑด ์‹คํ–‰
stage('Optional Step') {
    when {
        expression { fileExists('Dockerfile') }
    }
    steps {
        echo "Dockerfile ์กด์žฌ — Docker ๋นŒ๋“œ ์‹คํ–‰"
        sh 'docker build -t myapp .'
    }
}

 

 

Scripted Pipeline ์˜ˆ์‹œ (Groovy ๊ธฐ๋ฐ˜)
  • Scripted ๋ฐฉ์‹์€ Groovy ๋ฌธ๋ฒ•์„ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๋ณต์žกํ•œ ์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ, ์—๋Ÿฌ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ด ๊ฐ€๋Šฅ
node {
    stage('Checkout') {
        checkout scm
    }

    stage('Build') {
        try {
            sh 'mvn clean package'
        } catch (err) {
            echo "Build failed: ${err}"
            currentBuild.result = 'FAILURE'
        }
    }

    stage('Deploy') {
        if (env.BRANCH_NAME == 'main') {
            sh './deploy.sh'
        } else {
            echo "๋ฐฐํฌ ์Šคํ‚ต (๋ธŒ๋žœ์น˜: ${env.BRANCH_NAME})"
        }
    }
}

 

 

Jenkins ํ™˜๊ฒฝ ๋ณ€์ˆ˜
  • env.BUILD_NUMBER - ๋นŒ๋“œ ๋ฒˆํ˜ธ
  • env.BRANCH_NAME - ํ˜„์žฌ ๋ธŒ๋žœ์น˜ ์ด๋ฆ„
  • env.JOB_NAME - Jenkins Job ์ด๋ฆ„
  • env.WORKSPACE - Jenkins ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ
  • env.GIT_COMMIT - ํ˜„์žฌ GIT ์ปค๋ฐ‹ ํ•ด์‹œ
  • env.BUILD_URL - Jenkins ๋นŒ๋“œ URL
  • params.PARAM_NAME - ์‚ฌ์šฉ์ž ์ •์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ ‘๊ทผ ์‹œ ์‚ฌ์šฉ