✏ Jenkins pipeline 문법 종류
(1) Jenkins scriptive
(2) Declarative Pipeline (주로 사용하는 것)
🥁 Directive
Scripted 문법 별도의 기능을 지원
node
: Scripted 파이프라인을 실행하는 Jenkins 에이전트 최상단 선언 필요
dir
: 명령을 수행할 디렉토리 / 폴더 정의
stage
: 파이프라인의 각 단계, 이 단계에서 어떤 작업을 실행할지 선언하는 곳 (작업의 본문)
git
: Git 원격 저장소에서 프로젝트 Clone
sh
: Unix 환경에서 실행할 명령어 실행 윈도우에서는 bat
def
: Groovy 변수 혹은 함수 선언, Javascript의 var
같은 존재로 이해
node('worker') {
stage('Source') { // 스테이지 정의
// 스테이지에서 수행할 코드 작성
node
는 필수로 선언stage
를 정의해서 사용하면 된다.
✔ 정식 흐름
node {
def hello = 'Hello jojoldu' // 변수선언
stage ('clone') {
git 'https://github.com/jojoldu/jenkins-pipeline.git' // git clone
}
dir ('sample') { // clone 받은 프로젝트 안의 sample 디렉토리에서 stage 실행
stage ('sample/execute') {
sh './execute.sh'
}
}
stage ('print') {
print(hello) // 함수 + 변수 사용
}
}
// 함수 선언 (반환 타입이 없기 때문에 void로 선언, 있다면 def로 선언하면 됨)
void print(message) {
echo "${message}"
}
def
로 hello 변수 선언dir
로 clone 받은 프로젝트의 sample
디렉토리에서 명령어 수행을 지시sh
: shell 명령어 수행print
: def
로 선언한 메소드
✔ 예외 흐름
정상적인 명령 흐름 외에, 예외 처리가 가능하다.
특정 단계에서 어떤 이유로 실패할 경우 Exception을 던진다.
java와 같이 try/catch/finally
로 잡아 별도의 처리를 할 수도 있다.
node {
stage('Example') {
try {
sh 'exit 1'
}
catch (exc) {
echo 'Something failed, I should sound the klaxons!'
throw
}
}
}
✔ posts
stage의 끝이나 파이프라인 실행의 마지막에 실행되거나 확인돼야 할 step과 조건 값을 묶는다.
pipeline{
agent{ label "node" }
stages{ // 1️⃣ stages
stage("A"){
steps{
echo "========executing A========" // 2️⃣ steps
}
post{
always{
echo "========always========" // 2️⃣ steps
}
success{
echo "========A executed successfully========"
}
failure{
echo "========A execution failed========"
}
}
}
}
post{ // 3️⃣ posts
always{
echo "========always========"
}
success{
echo "========pipeline executed successfully ========"
}
failure{
echo "========pipeline execution failed========"
}
}
}
always
: 항상 블록을 실행changed
: 현재 빌드의 상태가 이번 빌드의 상태와 달라졌다면 블록의 step을 실행success
: 현재 빌드가 성공했다면 블록의 step을 실행failure
: 현재 빌드가 실패했다면 블록의 step을 실행unstable
: 현재 빌드의 상태가 불안하다면 블록의 step을 실행
🥁 Jenkins Global variable
env
:env
환경변수는env.VARNAME
으로 참조될 수 있다.
currentBuild
: 현재 빌드되고 있는 정보를 담고 있다. 보통 readonly 옵션인데 일부 writable한 옵션이 존재한다.
✔ BUILD_ID
stages {
stage('Hello') {
steps {
sh "echo ${env.BUILD_ID}"
}
}
}
✔ BUILD_NUMBER
dockerImage = docker.build repository + ":$BUILD_NUMBER"
와 같이 사용하면 된다. (tag
를 넣을 때 이렇게 하면 된다.)
BUILD_NUMBER
: build ID, 완료된 빌드에 대한 레코드의 ID이다. (현재 pipeline에서 실행되는 빌드의 번호)
BUILD_ID
와 BUILD_NUMBER
은 같은 것이다.
✔ JOB_NAME
stages {
stage('Hello') {
steps {
sh "echo ${env.JOB_NAME}"
}
}
}
foo
또는 foo/bar
와 같은 형식
✔ BRANCH_NAME
stages {
stage('Hello') {
steps {
sh "echo ${env.BRANCH_NAME}"
}
}
}
✔ JENKINS_URL
stages {
stage('Hello') {
steps {
sh "echo ${env.JENKINS_URL}"
}
}
}
✔ Jenkins URL
Jenkins
가 참조하는 default URL을 8000번으로 변경했다. (7777->8000)
✔ BUILD_URL
http://server:port/jenkins/job/foo/15/
와 같은 현재 build의 URL을 알려준다.
✔ JOB_URL
http://server:port/jenkins/job/foo/
와 같은 job의 URL을 알려준다
대표적인 currentBuild의 property
✔ number
build number
✔ docker commit
✔ docker build
Dockerfile
이라는 단순 텍스트 파일을 사용하여 image 생성한다.Dockerfile
은 지정된 문법을 지켜야 한다.Dockerfile
을 작성하고 공유하면 image의 구성을 쉽게 알 수 있다.
✔ docker build 명령어 두 가지를 사용한다.
dockerfile
: 텍스트 파일이고 build시 사용될 명령어들을 모아 놓은 것build
: PATH 또는 URL을 통해 지정된 다수의 파일을 갖는 경로docker build . # .이 현재 경로를 의미한다.
참고 자료