Jenkins pipeline

YOBY·2024년 10월 10일

CI/CD 파이프라인은 소프트웨어를 자동으로 통합, 테스트, 배포하는 과정입니다. 이를 통해 개발 속도를 높이고 오류를 줄일 수 있습니다. Jenkins는 이런 작업을 자동으로 처리하는 도구이며, 특히 파이프라인 스크립트를 이용해 쉽게 설정할 수 있습니다.


Jenkins Pipeline 구성 방식

  1. Pipeline script (Webadmin)
    일반적인 방식으로 Jenkins Pipeline을 생성해 Shell Script를 직접 생성하고 빌드

  2. Git SCM
    Git에 JenkinsFile을 작성하고, 빌드 시작 시 파이프라인 프로젝트에서 호출 실행

  3. Blue Ocean
    UI기반으로 시각적으로 파이프라인을 구성하면, JenkinsFile이 자동으로 생성되어 실행


Pipeline 구성 요소

  • I/CD 파이프라인은 소프트웨어 개발의 각 단계를 자동으로 처리
  1. 빌드(Build): 애플리케이션을 컴파일하는 단계
  2. 테스트(Test): 코드를 자동으로 테스트하는 단계
  3. 릴리스(Release): 애플리케이션을 저장소에 업로드하는 단계
  4. 배포(Deploy): 프로덕션 환경에 코드를 배포하는 단계
  5. 검증(Validation & Compliance): 이미지 보안 검사로 품질을 확인하는 단계

문법 구조


파이프라인 혹은 스테이지를 실행하기 위해 사용할 노드


기본 Declarative Pipeline

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building...'
                // 빌드 명령어 (예: sh 'mvn clean install')
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
                // 테스트 명령어 (예: sh 'mvn test')
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying...'
                // 배포 명령어 (예: sh 'deploy.sh')
            }
        }
    }
}
  • 세 가지 단계(빌드, 테스트, 배포)로 구성
  • steps : 블록 내에서 실행되는 명령어
  • agent any : 어떤 에이전트에서든 이 파이프라인을 실행할 수 있음

환경 변수 사용하기

pipeline {
    agent any

    environment {
        MY_ENV_VAR = 'Hello, World!'
    }

    stages {
        stage('Display Environment Variable') {
            steps {
                echo "The value of MY_ENV_VAR is: ${env.MY_ENV_VAR}"
            }
        }
    }
}
  • environment : 블록 내에 환경 변수를 정의
  • ${env.MY_ENV_VAR} : 통해 이 변수를 참조

병렬 실행 (Parallel Execution)

pipeline {
    agent any

    stages {
        stage('Build and Test') {
            parallel {
                stage('Build') {
                    steps {
                        echo 'Building...'
                    }
                }
                stage('Test') {
                    steps {
                        echo 'Testing...'
                    }
                }
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying...'
            }
        }
    }
}
  • parallel : 블록을 사용하여 빌드와 테스트 단계를 동시에 실행
  • parallel안의 stage두 단계가 독립적으로 실행

triggers

pipeline {
    agent any
    triggers {
        cron('H */4 * * 1-5')
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}
  • cron 표현식 { cron('H /4 * 1-5') }

입력 단계 (Input Step)

pipeline {
    agent any

    stages {
        stage('Approval') {
            steps {
                script {
                    input message: 'Proceed with deployment?', ok: 'Yes'
                }
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying...'
            }
        }
    }
}
  • input : 사용자가 'Proceed with deployment?'라는 메시지에 대해 승인을 요청합니다.
    사용자가 'Yes'를 클릭하면 배포 단계로 진행

공유 라이브러리 사용 (Using Shared Libraries)

@Library('my-shared-library') _

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                mySharedLibrary.build()  // 공유 라이브러리의 빌드 메서드 호출
            }
        }
    }
}
  • @Library 어노테이션을 사용하여 공유 라이브러리를 불러온다.
    이후 공유 라이브러리에서 정의한 메서드를 호출하여 사용

후속 작업 (Post Actions)

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building...'
            }
        }
    }

    post {
        success {
            echo 'Build succeeded!'
        }
        failure {
            echo 'Build failed!'
        }
        always {
            echo 'This runs regardless of the build result.'
        }
    }
}
  • post 블록을 사용하여 각 상태에 따라 실행할 작업을 정의
  • success, failure, always 등 다양한 상태를 설정

Docker를 이용한 빌드 (Building with Docker)

pipeline {
    agent {
        docker {
            image 'maven:3.6.3-jdk-8'
            args '-v /var/run/docker.sock:/var/run/docker.sock'  // Docker 컨테이너 내에서 Docker를 사용하려면 이 설정이 필요
        }
    }

    stages {
        stage('Build') {
            steps {
                sh 'mvn clean install'
            }
        }
    }
}
  • docker : 특정 Docker 이미지를 기반으로 파이프라인을 실행
  • 이 예제에서는 Maven 이미지를 사용하여 Java 애플리케이션을 빌드

파라미터화된 Pipeline

pipeline {
    agent any
    parameters {
        string(name: 'VERSION', defaultValue: '1.0', description: 'Version to deploy')
    }

    stages {
        stage('Deploy') {
            steps {
                echo "Deploying version: ${params.VERSION}"
                // 배포 명령어 (예: sh "deploy.sh ${params.VERSION}")
            }
        }
    }
}
  • 파라미터를 사용하여 사용자에게 입력을 요청
  • VERSION 파라미터는 배포할 버전을 정의하며, 기본값은 '1.0'

조건부 단계

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building...'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
            }
        }
        stage('Deploy') {
            when {
                expression { params.DEPLOY == 'true' }
            }
            steps {
                echo 'Deploying...'
            }
        }
    }
}
  • when : 사용하여 특정 조건이 만족될 때만 단계를 실행
  • DEPLOY 파라미터가 'true'일 때만 배포 단계가 실행

에러 처리

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                script {
                    try {
                        echo 'Building...'
                        // 빌드 명령어 (예: sh 'mvn clean install')
                    } catch (Exception e) {
                        echo "Build failed: ${e.message}"
                        currentBuild.result = 'FAILURE'
                    }
                }
            }
        }
        stage('Notify') {
            steps {
                echo 'Notifying...'
                // 알림 전송 명령어 (예: sh 'send-notification.sh')
            }
        }
    }
}
  • try-catch : 사용하여 빌드 단계에서 발생할 수 있는 에러를 처리

파일 아카이브

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building...'
            }
        }
        stage('Archive') {
            steps {
                archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true
            }
        }
    }
}
  • archiveArtifacts : 사용하여 빌드 결과물을 아카이브
  • target 디렉토리의 .jar 파일을 아카이브

0개의 댓글