[CI/CD] Jenkins Pipeline 정리

김진회·2023년 4월 13일
0

CI/CD

목록 보기
6/7

0. 개요

CI/CD 파이프라인은 신버전의 SW를 제공하기 위해 수행해야 할 일련의 단계로 통합 및 테스트 단계와 배포 단계의 모니터링 및 자동화를 도입하여 개발 프로세스를 개선한다. CI/CD 구성 툴로 대표적인 jenkins의 파이프 라인 구성은 크게 3가지가 있으며, 그 중 대표적인 Pipeline script(Webadmin) 방식을 중점으로 소개한다.


1. Jenkins Pipeline 구성 방식

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

2. Pipeline 구성 요소

CI/CD 파이프라인의 단계는 각기 다른 테스크 하위 집합으로 이루어져 있으며 이를 파이프라인 단계(stage)라고 부른다. 일반적인 파이프라인 단계는 다음과 같다.

  • 빌드(Build)
    • 애플리케이션을 컴파일하는 단계
  • 테스트(Test)
    • 코드를 테스트하는 단계. 이 단계를 자동화하여 효율성을 높일 수 있다.
  • 릴리스(Release)
    • 애플리케이션을 레포지토리에 제공하는 단계
  • 배포(Deploy)
    • 코드를 프로덕션에 배포하는 단계
  • 검증 및 컴플라이언스(Validation & compliance)
    • 해당 조직의 필요에 따라 결정. Clair와 같은 이미지 보안 스캔 툴을 사용하여 알려진 취약점(CVE)과 비교하는 방법으로 이미지의 품질을 보장

2. Pipeline script 문법

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

※ 문법 구조 이미지

* Scripted 문법의 경우 별도의 Step 단계를 두고 있진 않고, 실행되는 흐름을 의미한다.
* Declarative 문법에서의 빨간 박스는 필수 요소이다.

많은 분들이 심플한 Declarative Pipeline을 사용하고,
본인 또한 이 방법을 사용하기에 이 포스트에서는 해당 문법만 정리하겠다.

3. Declarative Pipeline

* 젠킨스 문법의 자세한 설명은 Docs를 참고하자 👉 젠킨스 Docs

Main) pipeline*

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

1) agent*

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

파라미터설명예시
any사용가능한 어떤 agent에서도 실행될 수 있음agent any
none파이프라인을 실행하는 동안 어떤 global agent도 할당되지 않음agent none
label제공된 label을 이용해 파이프라인 실행agent {label 'exmaple'}
nodelabel과 유사. 추가적인 옵션 추가 가능agent {node{label'example'}}
docker도커 기반 파이프라인 제공예시 링크1
dockerfile도커파일 기반 파이프라인 제공Docs 링크2

2) environment

파이프라인 환경 변수를 지정하는 디렉티브이다.

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

3) tools

파이프라인을 빌드할 때 필요한 도구들을 참조할 수 있는 디렉티브이다.
agent none으로 설정했다면 tools를 활성화 시킬 노드나 에이전트가 없기 때문에 동작하지 않는다.

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

4) options

파이프라인 블록 안에서 한 번만 정의할 수 있음. 옵션을 선택적으로 포함한다.

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

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'
            }
        }
    }
}

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}"
            }
        }
    }
}

7) libraries

공유 라이브러리는 파이프라인에서 동작하게 하기 위해 빌드한 코드의 묶음으로 파이프라인 밖의 소스코드 저장소에서 저장된다. 이 공유 라이브러리를 불러와서 코드가 이를 호출하고 사용한다.

8) stages*

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

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

8-1) steps*

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

8-2) post

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

  • always: 항상 실행
  • changed: 현재 빌드의 상태가 이번 빌드의 상태와 달라졌다면 실행
  • success: 현재 빌드가 성공했다면 실행
  • failure: 현재 빌드가 실패했다면 실행
  • unstable: 현재 빌드의 상태가 불안하다면 실행

4. 그 외

선언적 파이프라인에서 선언적으로 표현할 수 없는 일이 생기면 해결하기 어려운데 이를 간단하게 해결하는 방법은 아래와 같다.

  • 플러그인 확인
  • 공유 라이브러리 생성
  • 코드를 파이프라인 밖에 위치시키기
  • script 문장 👉 가장 간단한 방법

Reference

젠킨스 및 Scripted 파이프라인 소개
: https://wiki.kicco.com/space/JEN/33391927
젠킨스 및 요소
: https://www.redhat.com/ko/topics/devops/what-cicd-pipeline
젠킨스 환경 변수 (Global variable)
: https://jayy-h.tistory.com/43
젠킨스 Agent 및 그 외
: https://jayy-h.tistory.com/32
: https://jojoldu.tistory.com/356
Declarative 소개 및 그 외
: https://velog.io/@seunghyeon/Jenkins-선언적Declarative-파이프라인

profile
SSAFY 7기. HMG. 협업, 소통, 사용자중심

0개의 댓글