2.1.1.3 Jenkins와 파이프라인 구축

파이프라인 구축을 위한 Jenkinsfile 작성 방법

Jenkins 파이프라인은 소프트웨어 배포 과정에서 중요한 역할을 합니다. Jenkinsfile을 사용하면 빌드, 테스트, 배포 등의 과정을 코드로 정의하여 버전 관리할 수 있으며, Jenkins가 이를 자동으로 실행하도록 설정할 수 있습니다.

기본 Jenkinsfile 구조

Jenkinsfile은 Groovy 언어로 작성되며, 기본적으로 다음과 같은 구조를 가집니다.

pipeline {
    agent any // 실행 환경 지정
    stages {
        stage('Build') { // 빌드 단계
            steps {
                // 빌드 명령어 실행
            }
        }
        stage('Test') { // 테스트 단계
            steps {
                // 테스트 명령어 실행
            }
        }
        stage('Deploy') { // 배포 단계
            steps {
                // 배포 명령어 실행
            }
        }
    }
}

Jenkinsfile 작성 팁

  1. agent 지정: agent 지시어를 사용하여 파이프라인이 실행될 환경을 지정할 수 있습니다. agent any는 Jenkins가 파이프라인을 실행할 수 있는 모든 노드에서 실행될 수 있음을 의미합니다. 특정 노드나 Docker 이미지를 지정할 수도 있습니다.

  2. 환경 변수 사용: environment 블록을 사용하여 파이프라인 전체에서 사용할 환경 변수를 정의할 수 있습니다. 이는 빌드나 배포 스크립트에서 중요한 설정 값을 관리하는 데 유용합니다.

environment {
    MY_VARIABLE = "some-value"
}
  1. 조건부 실행: when 지시어를 사용하여 특정 조건을 만족할 때만 단계를 실행하도록 설정할 수 있습니다. 예를 들어, 특정 브랜치에서만 배포가 이루어지도록 할 수 있습니다.
stage('Deploy') {
    when {
        branch 'master'
    }
    steps {
        // 배포 명령어 실행
    }
}
  1. 병렬 실행: parallel 지시어를 사용하여 여러 단계를 동시에 실행할 수 있습니다. 이는 빌드 시간을 단축하는 데 도움이 됩니다.
stage('Test') {
    parallel {
        stage('Unit Test') {
            steps {
                // 단위 테스트 실행
            }
        }
        stage('Integration Test') {
            steps {
                // 통합 테스트 실행
            }
        }
    }
}
  1. 에러 처리: post 블록을 사용하여 파이프라인의 실행 결과에 따라 추가 작업을 수행할 수 있습니다. 예를 들어, 실패한 경우 알림을 보낼 수 있습니다.
post {
    failure {
        // 실패 시 알림
    }
}

실용적인 예시

다음은 실제 프로젝트에서 Jenkinsfile을 사용하여 Java 애플리케이션을 빌드, 테스트, 배포하는 간단한 예시입니다.

pipeline {
    agent any
    environment {
        JAVA_HOME = "/usr/java/latest"
    }
    stages {
        stage('Checkout') {
            steps {
                checkout scm // 소스 코드 체크아웃
            }
        }
        stage('Build') {
            steps {
                sh './gradlew build'
            }
        }
        stage('Test') {
            steps {
                sh './gradlew test'
            }
        }
        stage('Deploy') {
            steps {
                sh 'scp build/libs/myapp.jar user@server:/path/to/app'
            }
               }
    }
    post {
        success {
            // 빌드 성공 시 실행할 작업
            echo 'Build, Test and Deployment steps completed successfully.'
        }
        failure {
            // 빌드 실패 시 실행할 작업
            echo 'The build failed. Please check the console output for more details.'
        }
    }
}

Jenkinsfile 예시는 전체적인 자바 애플리케이션 빌드 프로세스를 보여줍니다. 각 stage는 소프트웨어 개발 생명주기의 주요 단계를 나타냅니다:

  1. Checkout: 소스 코드를 SCM(Source Code Management) 시스템으로부터 체크아웃합니다.
  2. Build: 애플리케이션을 빌드하기 위해 Gradle이나 Maven과 같은 빌드 도구를 사용합니다.
  3. Test: 유닛 테스트 및/또는 통합 테스트를 실행하여 코드의 정확성을 검증합니다.
  4. Deploy: 빌드된 아티팩트(예: jar 파일)를 서버에 배포합니다.

post 블록에서는 빌드의 성공 또는 실패 여부에 따라 추가적인 단계를 정의할 수 있습니다. 이를 통해 빌드 과정의 성공 여부를 팀원들에게 알리거나, 실패 원인을 분석하기 위한 로그를 수집하는 등의 작업을 자동화할 수 있습니다.

알아두면 좋은 팁

  • 스크립티드 파이프라인과 선언적 파이프라인: Jenkins는 두 가지 유형의 파이프라인 구문을 지원합니다. 스크립티드 파이프라인은 전통적인 방식으로 더 세밀한 제어가 가능하나 복잡할 수 있으며, 선언적 파이프라인은 가독성이 높고 구조화된 방식을 제공합니다.
  • 파라미터화된 빌드: 파이프라인에 파라미터를 추가하여 빌드 시 다양한 옵션을 선택할 수 있도록 할 수 있습니다. 이는 다양한 환경에서의 빌드나 특정 테스트 케이스를 실행하는 데 유용합니다.
  • 환경 분리: 개발, 테스트, 프로덕션 환경을 분리하여 각 환경에 맞는 파이프라인 스테이지를 구성함으로써 보안과 안정성을 높일 수 있습니다.

Jenkins와 Jenkinsfile을 활용한 파이프라인 구축은 개발 팀의 CI/CD 프로세스를 자동화하고 효율화하는 강력한 방법입니다. 초기 설정에 시간을 투자하면, 장기적으로 보다 안정적이고 빠른 소프트웨어 개발 및 배포 프로세스를 구현할 수 있습니다.

source: DevOps/2.Continuous_Integration_(CI)/2.1.Jenkins_TravisCI_GitHubActions/2.1.1.Jenkins/2.1.1.3.md