본문 바로가기

Build/Jenkins

[Infrastructure/Jenkins] Scripted 파이프라인 기본 구문

Scripted 파이프라인 구문

Scripted 파이프라인은 범용 사용성을 위해 Groovy 문법을 준수하는 DSL로 작성됩니다. 따라서 Groovy 언어에서 사용 가능한 대부분의 구문을 스크립트에서 그대로 사용 할 수 있습니다.

흐름 제어

Groovy 또는 다른 언어의 실행 방식과 마찬가지로 Jenkinsfile의 맨 위에서부터 아래로 순차 실행됩니다. 따라서 스크립트의 흐름을 제어하려면 다음과 같은 구문(e.g. 조건문)에 의존합니다.

shell
닫기
node { ​​​​stage('Example') { ​​​​​​​​if (env.BRANCH_NAME == 'master') { ​​​​​​​​​​​​echo 'I only execute on the master branch' ​​​​​​​​} else { ​​​​​​​​​​​​echo 'I execute elsewhere' ​​​​​​​​} ​​​​} }

또 다른 방법은 예외 처리 구문을 사용하는 것입니다. 어떤 이유에서 Steps가 실패하면 예외가 발생합니다. 예외 처리를 위해서는 try-catch-finally 구문을 사용합니다.

shell
닫기
node { ​​​​stage('Example') { ​​​​​​​​try { ​​​​​​​​​​​​sh 'exit 1' ​​​​​​​​} ​​​​​​​​catch (error) { ​​​​​​​​​​​​echo 'Something failed, I should sound the klaxons!' ​​​​​​​​​​​​throw error ​​​​​​​​} ​​​​} }

Node

Node는 Jenkins의 분산 처리 아키텍처의 일부로서, 작업 수행에 따른 부하를 다른 여러 개의 에이전트 노드(Agent Node)에 전가 할 수 있습니다.

  • Master Node
    마스터 노드는 사용자 환경에서의 모든 작업을 처리합니다.
  • Agent Node
    에이전트 노드는 마스터 노드로부터 전가 받은 특정 노드 블록의 작업을 수행합니다.

Jenkinsfile에서 첫 번째로 정의되는 Node 블록은 다음과 같이 node 키워드로 시작합니다. 이어서 작성되는 내용은 Node 블록 안에 포함됩니다.

shell
닫기
node { }

만약 Jenkins가 Master-Slave로 구성되어 있다면 node 키워드의 인자로 master 또는 slave를 지정 할 수 있습니다. 인자가 생략되어 있다면 자동으로 master로 처리되며, Jenkins가 단일 머신으로 구성되어 있다면 마찬가지로 인자를 생략해도 무관합니다.

shell
닫기
node('master') { }

Steps/Stage

steps는 Jenkins가 실질적으로 처리해야하는 어떤 작업에 대한 단계를 정의합니다. 다음은 Declarative 파이프라인에서 steps 키워드를 사용하는 예시입니다.

shell
닫기
pipeline { ​​​​agent any ​​​​stages { ​​​​​​​​stage('Build') { ​​​​​​​​​​​​steps { ​​​​​​​​​​​​} ​​​​​​​​} ​​​​​​​​stage ('Test') { ​​​​​​​​​​​​steps { ​​​​​​​​​​​​} ​​​​​​​​} ​​​​} }

Declarative 파이프라인과 달리 Scripted 파이프라인에서는 steps 키워드를 사용하지 않습니다. 대신 stage 키워드를 나열하여 Jenkins가 처리해야 하는 작업의 단계를 결정합니다.

node { ​​​​stage ('Build') { ​​​​ ​​​​} ​​​​stage ('Test') { ​​​​ ​​​​} }

stages 키워드는 하나의 Stage 블록을 구현합니다. 각각의 Stage 블록은 파이프라인에서 수행해야 할 단계별 작업을 그룹화합니다. 일반적인 파이프라인에서는 다음 작업 그룹들을 개별 Stage 블록에서 구현합니다.

  • 깃 리포지토리에서 소스 코드를 Pull
  • 소스 코드를 빌드
  • 배포 전 테스트 수행
  • 애플리케이션 배포 등

def

def 키워드를 사용하여 변수 또는 함수를 정의 할 수 있습니다. 변수를 정의하려면 다음과 같이 작성합니다.

shell
닫기
def var = 1000; node { ​​​​stage("Test") { ​​​​​​​​echo "${var}" ​​​​} }

예시의 실행 결과는 다음과 같습니다.

shell
닫기
1000

변수는 블록 내 또는 다른 블록에서 재정의 될 수 있습니다.

shell
닫기
def var = 1000; node { ​​​​stage("Test") { ​​​​​​​​var = 1234; ​​​​​​​​echo "${var}" ​​​​} }

만약 함수를 정의하려면 다음과 같이 작성합니다. 함수는 파라미터 및 리턴을 사용 할 수 있습니다.

shell
닫기
def func(param1) { ​​​​return param1 + " with function" } node { ​​​​stage("Test") { ​​​​​​​​echo func("the comments will be shown") ​​​​} }

예시의 실행 결과는 다음과 같습니다.

shell
닫기
the comments will be shown with function

sh/bat

sh 키워드를 사용하여 CLI 명령을 지정합니다(젠킨스가 Windos에서 동작 중이라면 bat 키워드를 사용합니다).

shell
닫기
node { ​​​​stage("Test") { ​​​​​​​​sh "pwd" ​​​​} }

예시의 실행 결과는 다음과 같습니다. CLI 명령과 표준 출력 결과가 Console Output에 나타납니다.

shell
닫기
+ pwd /var/jenkins_home/workspace/Example-Pipeline

dir

작업이 수행되는 디렉토리 경로를 지정합니다. 상대 경로를 사용 할 수 있습니다.

shell
닫기
node { ​​​​stage("Test") { ​​​​​​​​dir ('/var/jenkins_home/workspace') { ​​​​​​​​​​​​sh "ls -l" ​​​​​​​​} ​​​​} }

예시의 실행 결과는 다음과 같습니다.

shell
닫기
Running in /var/jenkins_home/workspace + ls -l total 8 drwxr-xr-x 2 jenkins jenkins 4096 Apr 12 06:48 Example-Pipeline drwxr-xr-x 2 jenkins jenkins 4096 Apr 12 07:36 Example-Pipeline@tmp