본문 바로가기

Build/Jenkins

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

Scripted 파이프라인 구문

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

흐름 제어

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

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 구문을 사용합니다.

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 블록 안에 포함됩니다.

node {

}

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

node('master') {

}

Steps/Stage

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

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 키워드를 사용하여 변수 또는 함수를 정의 할 수 있습니다. 변수를 정의하려면 다음과 같이 작성합니다.

def var = 1000;

node {
    stage("Test") {
        echo "${var}"
    }
}

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

1000

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

def var = 1000;

node {
    stage("Test") {
        var = 1234;
        echo "${var}"
    }
}

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

def func(param1) {
    return param1 + " with function"
}

node {
    stage("Test") {
        echo func("the comments will be shown")
    }
}

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

the comments will be shown with function

sh/bat

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

node {
    stage("Test") {
        sh "pwd"
    }
}

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

+ pwd
/var/jenkins_home/workspace/Example-Pipeline

dir

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

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

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

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