dayne의 블로그

Jenkins Pipeline 개념 및 문법 정리 본문

CI CD/Jenkins

Jenkins Pipeline 개념 및 문법 정리

dayne_ 2024. 10. 29. 11:23

목차

1. 젠킨스 파이프라인 구성 방식

2. 파이프라인 스크립트 문법

3. Declarative Pipeline 상세 설명

 

 


1. 젠킨스 파이프라인 구성 방식

대표적인 젠킨스 파이프라인 구성 방식은 아래와 같이 3가지 방식이 있습니다.

  • Pipeline script (Webadmin)
    • 일반적인 방식으로 Jenkins Pipeline을 생성해 Shell Script를 직접 생성하고 빌드
  • Git SCM
    • Git에 JenkinsFile을 작성하고, 빌드 시작 시 파이프라인 프로젝트에서 호출 실행
  • Blue Ocean
    • UI 기반으로 시각적인 파이프라인을 구성하면, JenkinsFile이 자동으로 생성되어 실행

 

 


2. 파이프라인 스크립트 문법

출처 : https://velog.io/@kku64r/pipeline

  • Scripted Pipeline
    • 더 많은 절차적인 코드 작성이 가능하며, 커스텀한 작업이 가능해 유연성 높음
    • 기존 파이프라인 문법이라 친숙하고 이전 버전과 호환 가능
    • 엄격한 Groovy 언어 기반으로 제한된 구문 검사
    • 더 복잡하며 많은 프로그래밍이 필요하고, 작성 난이도가 높은 편
    • 전통적인 젠킨스 모델과는 맞지 않음
  • Declarative Pipeline
    • 비교적 쉽게 작성 가능
    • Groovy 기반이긴 하지만, Groovy 문법이 익숙하지 않아도 작성 가능
    • 이전 버전과 호환 안될 가능성 있음

 

※ 문법 구조 이미지

출처 : https://velog.io/@kku64r/pipeline

Scripted 문법의 경우 별도의 Step 단계를 두고 있진 않고, 실행되는 흐름을 의미합니다.

Declarative 문법에서의 빨간 박스는 필수로 작성되어야 하는 요소들입니다.
많은 분들이 심플한 Declarative Pipeline을 사용하기도 하고, 저 또한 해당 방법으로 파이프라인을 구성했기 때문에 이번 포스트에서는 해당 문법을 정리하도록 하겠습니다.

 

 


3. Declarative Pipeline 상세 설명

출처 : https://velog.io/@kku64r/pipeline

3.0 pipeline

선언형 파이프라인 전체를 pipeline 블록으로 정의합니다.

 

3.1 agent

파이프라인 혹은, 스테이지를 실행하기 위해 사용할 노드를 지정합니다.

 

agent의 대표적인 값들

any 사용 가능한 어떤 agent에서도 실행 가능 agent any
none 파이프라인을 실행하는 동안, 어떤 global agent도 할당되지 않음
이때, 각 stage 블록에 agent가 선언되어야 합니다.
agent none
label 제공된 label을 이용해 파이프라인 실행 agent {label 'example'}
node label과 유사하며, 추가적인 옵션을 지정하는 것이 가능 agent {node{label'example'}}
docker 도커 기반 파이프라인 제공  
dockerfile 도커 파일 기반 파이프라인 제공  

 

※ docker

제공된 컨테이너를 이용해 도커 기반의 파이프라인 실행을 제공합니다.

이는 args 파라미터를 이용하여, docker run 호출 시 제공할 파라미터를 줄 수 있습니다.

또한 alwaysPull 옵션을 사용하면, 이미지가 이미 존재하더라도 docker pull을 강제로 수행합니다.

 

추가적으로 registryUrl, registryCredentialsId 옵션을 통해 Docker Registry와 이에 필요한 Credential을 명시할 수 있도록 지원합니다.

registryCredentialsId 는 Docker Hub의 private repository를 위한 기능입니다.

 

<예시>

agent {
    docker {
        image 'myregistry.com/node'
        label 'my-defined-label'
        registryUrl '<https://myregistry.com/>'
        registryCredentialsId 'myPredefinedCredentialsInJenkins'
    }
}

 

 

※ dockerfile

source repository(GitHub ...)에 존재하는 Dockerfile을 사용해해 pipeline을 실행합니다.
이를 위해서는 
Jenkinsfile 'Multibranch pipeline' 또는 'Pipeline from SCM'을 이용해 로딩되어야 합니다.

 

Dockerfile의 최상단에는 agent { dockerfile true }이 정의되어 있어야 합니다.

dir 옵션을 통해 Dockerfile의 경로를 지정하는 것이 가능합니다.

filename을 통해 Dockerfile의 이름(Dockerfile이 아닌 경우)을 지정할 수 있습니다.

additionalBuildArgs 옵션을 통해 docker build 명령에 들어가는 추가적인 인자를 설정할 수 있습니다.

dockerfile 또한 docker와 마찬가지로 registryUrl, registryCredentialsId 옵션을 사용할 수 있습니다.

 

agent {
    dockerfile {
        filename 'Dockerfile.build'
        dir 'build'
        label 'my-defined-label'
        registryUrl '<https://myregistry.com/>'
        registryCredentialsId 'myPredefinedCredentialsInJenkins'
    }
}

 

3.2 environment

파이프라인에서 사용할 환경 변수들을 지정하는 디렉티브입니다.

pipeline {
    agent any
    environment { 
        CC = 'clang'
    }
    stages {
        stage('Example') {
            environment { 
                AN_ACCESS_KEY = credentials('my-predefined-secret-text') 
            }
            steps {
                sh 'printenv'
            }
        }
    }
}

 

 

3.3 tools

파이프라인을 빌드할 때, 필요한 도구들을 참조할 수 있는 디렉티브입니다.

agent의 값을 none으로 설정했을 경우, tools를 활성화 시킬 노드나 에이전트가 없기 때문에 동작하지 않습니다.

pipeline {
    agent any
    tools {
        maven 'apache-maven-3.0.1' 
    }
    stages {
        stage('Example') {
            steps {
                sh 'mvn --version'
            }
        }
    }
}

 

 

3.4 options

파이프라인 블록 안에서 한 번만 정의할 수 있습니다.

옵션을 선택적으로 포함합니다.

pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

 

 

3.5 triggers

어떤 종류의 트리거가 파이프라인의 빌드를 시작시킬 수 있을지 설정합니다.

ex. cron 표현식 {cron('H */4 * * 1-5)}

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

 

 

3.6 parameters

매개변수를 지정합니다.

지정된 매개변수는 사용자 혹은 API 호출을 통해 입력됩니다.

호출 방식 : params.매개변수명

pipeline {
    agent any
    parameters {
        string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
        text(name: 'BIOGRAPHY', defaultValue: '', description: 'Enter some information about the person')
        booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')
        choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
        password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'Enter a password')
    }
    stages {
        stage('Example') {
            steps {
                echo "Hello ${params.PERSON}"
                echo "Biography: ${params.BIOGRAPHY}"
                echo "Toggle: ${params.TOGGLE}"
                echo "Choice: ${params.CHOICE}"
                echo "Password: ${params.PASSWORD}"
            }
        }
    }
}

 

 

3.7 libraries

공유 라이브러리는 '파이프라인에서 동작되기 위해 빌드한 코드의 묶음'으로, 파이프라인 밖의 소스코드 저장소에서 저장됩니다.

해당 공유 라이브러리를 불러와서 코드가 이를 호출하고 사용합니다. 

 

 

3.8 stages

step들을 정의하는 디렉티브입니다.

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
    post { //stage 뒤에 써도 됨
        always { 
            echo 'I will always say Hello again!'
        }
    }
}

 

※ steps

stage에서 동작할 작업을 정의합니다.

 

※ post

파이프라인이나 stage에서 조건부로 사용할 수 있는 하나의 섹션입니다.

  • always : 항상 실행
  • changed : 현재 빌드의 상태가 새로운 빌드의 상태와 달라졌을 경우 실행
  • success : 현재 빌드가 성공했다면 실행
  • failure : 현재 빌드가 실패했다면 실행
  • unstable : 현재 빌드의 상태가 불안정할 경우 실행

 

 


참고

https://velog.io/@kku64r/pipeline

 

[CI/CD] Jenkins Pipeline 정리

CI/CD 파이프라인은 신버전의 SW를 제공하기 위해 수행해야 할 일련의 단계로 통합 및 테스트 단계와 배포 단계의 모니터링 및 자동화를 도입하여 개발 프로세스를 개선한다. CI/CD 구성 툴로 대표

velog.io

 

https://jayy-h.tistory.com/32

 

Jenkins pipeline - Declarative pipeline 기술

Pipeline이란? : Jenkins Pipeline은 CD(Continuous Delevery)를 지원하는 플러그인의 집합이다. 이 과정에서 소프트웨어를 빌드하고 여러 단계의 테스트, 배포를 진행한다. Pipeline은 Pipelie Domina Specific Language라

jayy-h.tistory.com