Jenkins Pipeline (선언형 vs 스크립트형)

Jenkins Pipeline (선언형 vs 스크립트형)

5️⃣ Jenkins Pipeline (선언형 vs 스크립트형)

1. Jenkins Pipeline 개념 및 필요성

Jenkins Pipeline은 Jenkins에서 CI/CD 프로세스를 자동화하기 위한 강력한 방법입니다. 파이프라인은 소스 코드의 빌드, 테스트, 배포 과정 등 여러 단계를 정의하고 자동으로 실행할 수 있게 해줍니다.

  • CI/CD 자동화: 소프트웨어 개발 라이프사이클을 자동화하여 개발자가 수동으로 작업할 필요를 줄여줍니다.
  • 일관된 빌드 프로세스: 파이프라인을 코드로 관리하기 때문에 빌드 과정이 일관되고 반복 가능합니다.
  • 버전 관리: Jenkinsfile을 코드로 저장하고 버전 관리 시스템에 포함시킬 수 있어 파이프라인의 변경 이력을 관리할 수 있습니다.

그림: Jenkins Pipeline 흐름

Jenkins Pipeline 흐름

2. Declarative Pipeline vs Scripted Pipeline

Jenkins에서는 두 가지 종류의 파이프라인 구문을 제공합니다: 선언형(Declarative) 파이프라인과 스크립트형(Scripted) 파이프라인입니다.

1. Declarative Pipeline

선언형 파이프라인은 더 간결하고 읽기 쉬운 형식으로, 구조화된 구문을 사용하여 파이프라인을 정의합니다. Jenkinsfile을 사용하여 파이프라인을 선언할 때 주로 사용됩니다. 선언형 파이프라인은 전체 파이프라인을 특정 블록 안에 작성하여 가독성을 높이고, 잘못된 구문을 방지합니다.

  • 주요 특징: 명확한 구조, 간결한 문법, 기본값 제공
  • 구조:
    • pipeline { ... }로 감싸서 정의
    • stages, steps, agent 등을 포함한 명확한 블록 구조

2. Scripted Pipeline

스크립트형 파이프라인은 더 유연하고 복잡한 동작을 정의할 수 있지만, 선언형 파이프라인보다는 상대적으로 복잡하고 가독성이 떨어질 수 있습니다. Groovy 스크립트를 기반으로 하며, 프로그래밍적인 자유도가 높습니다.

  • 주요 특징: 더 많은 유연성, 고급 스크립트 기능
  • 구조:
    • node { ... } 블록 안에 파이프라인 명령어를 작성

3. Jenkinsfile 기본 구조

Jenkinsfile은 Jenkins 파이프라인을 정의하는 파일로, 파이프라인의 모든 설정과 단계를 이 파일 안에서 정의합니다. Jenkinsfile은 보통 프로젝트 루트에 위치하며, Git과 같은 버전 관리 시스템에 저장됩니다.

기본 구조 (선언형 파이프라인)

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                echo 'Building...'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying...'
            }
        }
    }
}

기본 구조 (스크립트형 파이프라인)

node {
    stage('Build') {
        echo 'Building...'
    }
    stage('Test') {
        echo 'Testing...'
    }
    stage('Deploy') {
        echo 'Deploying...'
    }
}

4. Declarative Pipeline 예제 및 실습

예제: 기본적인 Declarative Pipeline

pipeline {
    agent any
    stages {
        stage('Checkout') {
            steps {
                checkout scm
            }
        }
        stage('Build') {
            steps {
                sh './build.sh'
            }
        }
        stage('Test') {
            steps {
                sh './test.sh'
            }
        }
        stage('Deploy') {
            steps {
                sh './deploy.sh'
            }
        }
    }
}
  • 이 예제에서는 Checkout, Build, Test, Deploy라는 4단계를 포함하는 간단한 파이프라인을 정의하고 있습니다. 각 단계에서는 셸 명령어를 실행합니다.

5. Scripted Pipeline 예제 및 실습

예제: Scripted Pipeline 사용

node {
    stage('Checkout') {
        checkout scm
    }
    stage('Build') {
        sh './build.sh'
    }
    stage('Test') {
        sh './test.sh'
    }
    stage('Deploy') {
        sh './deploy.sh'
    }
}
  • 이 예제는 스크립트형 파이프라인을 사용하여 동일한 빌드, 테스트, 배포 과정을 정의한 것입니다. 각 단계는 node 블록 내에서 stage로 구분되어 있습니다.

6. Pipeline 단계 (stages, steps, agent, post, environment)

1. stages

stages는 파이프라인에서 실행될 여러 단계를 정의합니다. 각 단계는 stage로 구분되며, 순차적으로 실행됩니다.

2. steps

steps는 각 stage에서 수행할 실제 작업을 정의합니다. 예를 들어, 빌드, 테스트, 배포 명령어 등을 여기서 지정합니다.

3. agent

agent는 파이프라인 또는 특정 stage가 실행될 에이전트를 정의합니다. 예를 들어, any는 모든 에이전트에서 실행을 의미합니다.

4. post

post 블록은 파이프라인 실행 후에 수행할 작업을 정의합니다. 예를 들어, 빌드가 성공적일 때나 실패할 때의 후속 작업을 설정할 수 있습니다.

5. environment

environment는 파이프라인 전체에서 사용될 환경 변수를 설정하는 데 사용됩니다.

7. Parallel Pipeline 및 Multistage Pipeline

1. Parallel Pipeline

병렬 파이프라인은 여러 작업을 동시에 실행할 수 있도록 정의합니다. 이를 통해 빌드 시간을 단축할 수 있습니다.

pipeline {
    agent any
    stages {
        stage('Build') {
            parallel {
                stage('Frontend') {
                    steps {
                        sh './build_frontend.sh'
                    }
                }
                stage('Backend') {
                    steps {
                        sh './build_backend.sh'
                    }
                }
            }
        }
    }
}

2. Multistage Pipeline

멀티스테이지 파이프라인은 여러 단계를 정의하여 복잡한 빌드 프로세스를 여러 단계로 나누어 관리할 수 있도록 합니다.

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh './build.sh'
            }
        }
        stage('Test') {
            steps {
                sh './test.sh'
            }
        }
        stage('Deploy') {
            steps {
                sh './deploy.sh'
            }
        }
    }
}

8. Jenkins Shared Library 활용

Jenkins Shared Library는 여러 파이프라인에서 공통으로 사용할 수 있는 스크립트 및 함수들을 관리하는 방법입니다. 이를 통해 코드 중복을 줄이고 파이프라인의 재사용성을 높일 수 있습니다.

  • 예시: vars 디렉터리 내에 공통적으로 사용할 함수를 정의하고, Jenkinsfile에서 @Library 어노테이션을 사용하여 호출합니다.

9. Pipeline 성능 최적화 (parallel, timeout, retry)

1. parallel

병렬 작업을 사용하여 여러 단계를 동시에 실행하여 빌드 시간을 단축할 수 있습니다.

2. timeout

작업이 특정 시간 내에 완료되지 않으면 자동으로 실패하도록 설정할 수 있습니다.

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                timeout(time: 30, unit: 'MINUTES') {
                    sh './build.sh'
                }
            }
        }
    }
}

3. retry

작업이 실패할 경우, 재시도할 수 있는 기능을 제공합니다.

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                retry(3) {
                    sh './build.sh'
                }
            }
        }
    }
}

Jenkins 파이프라인은 CI/CD 프로세스를 자동화하고, 빌드, 테스트, 배포 과정의 효율성을 높이는 중요한 도구입니다. 선언형스크립트형 파이프라인을 이해하고, 다양한 기능을 활용해보세요.

RSS Feed