Jenkins Pipeline (선언형 vs 스크립트형)
5️⃣ Jenkins Pipeline (선언형 vs 스크립트형)
1. Jenkins Pipeline 개념 및 필요성
Jenkins Pipeline은 Jenkins에서 CI/CD 프로세스를 자동화하기 위한 강력한 방법입니다. 파이프라인은 소스 코드의 빌드, 테스트, 배포 과정 등 여러 단계를 정의하고 자동으로 실행할 수 있게 해줍니다.
- CI/CD 자동화: 소프트웨어 개발 라이프사이클을 자동화하여 개발자가 수동으로 작업할 필요를 줄여줍니다.
- 일관된 빌드 프로세스: 파이프라인을 코드로 관리하기 때문에 빌드 과정이 일관되고 반복 가능합니다.
- 버전 관리: Jenkinsfile을 코드로 저장하고 버전 관리 시스템에 포함시킬 수 있어 파이프라인의 변경 이력을 관리할 수 있습니다.
그림: 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 프로세스를 자동화하고, 빌드, 테스트, 배포 과정의 효율성을 높이는 중요한 도구입니다. 선언형과 스크립트형 파이프라인을 이해하고, 다양한 기능을 활용해보세요.