2.Jenkins Declarative pipeline 튜토리얼(예제1:Shell, File, 다른 Job의 Artifact File 다루기)

프로필

2019. 2. 20. 0:03

이웃추가

- 이번 포스트는 Jenkins의 작업을 구성하는 방식 중 Declarative pipeline의 문법을 사용하여 1) Shell Script를 사용해보는것, 2) File을 생성하고 저장하는 것 , 3) Jenkins서버의 다른 Job에 저장된 파일을 가져오는 것 을 구현해보는 것을 포스팅 하려합니다.

- 실제로 해보니 너무 자료양이 많아 2장의 경우 2~3개 포스팅으로 나눠야 할지도 모르겠습니다 ㅜㅜ

1장. Docker Image로 Jenkins 설치 + Github연동 + Pipeline으로 Helloworld 출력

2장. pipeline 예제작성 + 실행

- 2-1 : Shell , File, Artifacted File

- 2-2 : parallel(build), parallel(master - slave) , JSON 다루기

- 2-3 : 조건문/반복문 , slack 보내기

3장. Blue Ocean으로 Hello world 출력

4장. Blue Ocean으로 pipeline 예제작성 + 실행

- 2-1 : Shell , File, Artifacted File

- 2-2 : parallel(build), parallel(master - slave) , JSON 다루기

- 2-3 : 조건문/반복문 , slack 보내기

5장. Master <-> Slave CI 환경 구축해보기

- 참고자료

https://standard.cbu.cloudbees.com/cloudbees-university-jenkins-pipeline-fundamentals

- 목차

1. 문법설명

2. Job List 만들기(View)

3. Shell Script 다루기

4. File 생성하기

5. File 생성 후 Jenkins 서버에 저장하기

6. Jenkins 서버에 저장된 다른 Job의 파일가져오기

----------------------------------------------------------------------------------------------------------------------------

1. 문법설명

- 이번 포스팅에서 사용할 Declarative Pipeline의 문법에 대해서 간단히 설명하겠습니다.

- Jenkins Pipeline에는 Declarative Pipeline과 Scripted Pipeline 2가지 방식이 존재합니다.

- 두 파이프라인 방식 모두 강력한 성능을 가지고 있지만, 좀더 정형화 되어있기에 Declarative Pipeline

쪽이 초보자가 익히기에 더 나은 것 같습니다.

- 개인적으로 양쪽다 공부해보고, 업무의 복잡도에 따라 어떤 방식을 선택할지 결정하는 것이 좋을 것 같습니다.

문법

의미

pipeline

젠킨스의 파이프라인 코드라는 것을 선언

agent

파이프라인을 빌드 할 곳을 선택

any : 추가적인 설정이 없다면 기본 설정된 master agent에서 실행된다.

none : 설정안함 -> 따로 설정해주어야함

stages

파이프라인의 작업의 단위인 stage를 위치시키는 블록

반드시 하나이상의 stage를 포함해야함

stage

파이프라인의 작업(Check out, Test, Build, Deploy등등..)의 단위

반드시 1개이상의 steps를 포함해야함

steps

stage에서 정의한 대로 작업을 정의하는 곳

echo

메시지를 출력함

ex : echo 'hello world'

※ 변수의 값을 출력할 경우

echo "여기는 ${VALUE} 입니다" -> "" 을 사용해서 감싼다

sh

shell script를 사용

writeFile

파일을 생성

${ VALUE }

변수의 값을 사용시

environment

환경변수 설정 블럭

parameters

변수 설정 블럭

post

작업이 모두 끝나고 나서의 처리

※ 자주 사용할 용어정리

node / agent : 젠킨스를 사용해서 파이프라인등을 빌드 할때, 빌드되는 곳의 PC 또는 도커 컨테이너

node의 경우 Scripted Pipeline의 문법과 표기가 겹치지만 여기선 다른 의미임

master : 젠킨스 서버가 설치된 PC 또는 도커 컨테이너를 의미함

slave : 젠킨스 서버(master)를 통해 리모트로 조작하는 PC 또는 도커 컨테이너

----------------------------------------------------------------------------------------------------------------------------

2. Job List 만들기(View)

1) Jenkins 서버에 접속하여 all 옆의 " + " 아이콘을 클릭합니다.

2) View name을 입력 -> List View 에 체크 -> OK버튼 클릭

3) View의 설정에서 View에 Job을 추가하거나, 제거할 수 있습니다.

4) Job이 추가된 것을 확인

5) View를 선택한 후 Job을 작성하게되면 자동으로 View에 Job이 추가됩니다.

- 3.에서 사용할 Job을 미리 만들었습니다.

- DeclarativePipelineList로 명명한 View에 Job이 자동으로 추가된 것을 확인 할수 있습니다.

----------------------------------------------------------------------------------------------------------------------------

3. Shell Script 다루기

- sh 는 "빌드 되어지는 곳"에서 shell script를 실행하는 문법이다.

1) 예제 코드

// 파이프 라인의 선언 pipeline { // 빌드되어질 곳을 any로 선언 agent any // 작업의 묶음인 stages 를 선언 stages { // 첫번째 작업('execute ls command')을 선언 stage('execute ls command') { // 작업의 세부 처리인 steps을 선언 steps { // 'execute ls command' 라는 메시지를 출력 echo 'execute ls command' // shell의 명령어 'ls -la'실행 sh 'ls -la' } } // 두번째 작업('Where do ls command execute?')을 선언 stage('Where do ls command execute?') { // 작업의 세부 처리인 steps을 선언 steps { // 'Here is default.' 라는 메시지를 출력 echo 'Here is default.' // shell의 명령어 'ls -la'실행 sh 'ls -la' // 'you can define where to execute command.' 라는 메시지를 출력 echo 'you can define where to execute command.' // 'For example, I want to view root directory' 라는 메시지를 출력 echo 'For example, I want to view root directory' // shell의 명령어 'ls -la /'실행 sh 'ls -la /' } } // 세번째 작업('Is there any other way?')을 선언 stage('Is there any other way?') { // 작업의 세부 처리인 steps을 선언 steps { // 'Maybe sh is independent' 라는 메시지를 출력 echo 'Maybe sh is independent' // sh 명령어 개별로 사용하여 cd / , pwd , ls -la 명령어를 실행 sh 'cd /' sh 'pwd' sh 'ls -la' // 'If you want to execute multiple commands in one sh.' 라는 메시지를 출력 echo 'If you want to execute multiple commands in one sh.' // sh 명령어를 묶어서 cd / , pwd , ls -la 명령어를 실행 sh '''cd / pwd ls -la''' } } } }

2) Job 생성

- 2에서 작업하였으므로 생략

3) Build 해보기

- 빌드의 결과는 Stage View 플러그인의 표시로 간단한 내용(성공인지?, 실패인지?, 로그,)을 시각적으로 확인 할 수 있습니다.

- 구슬모양 아이콘은 성공시 파란색 실패시 붉은색이 됩니다. 클릭시 Full 로그를 확인 할 수 있습니다.

- #+ 숫자는 빌드의 대략적인 정보를 표시합니다.

※ 로그 분석

- sh 명령어를 연습하면서 sh 명령어가 실행되는 기본적인 위치등을 알수 있도록 Stage를 선언했습니다.

(1) 첫번째 Stage

- sh 를 통해 shell 명령어를 실행하면 기본적으로 프로젝트의 root폴더의 위치에서 실행 된다는 것을 알 수 있습니다.

(2) 두번째 Stage

- 명령어가 실행되는 위치를 지정해서 명령어를 실행하면 다른 위치에서도 shell script를 실행 가능합니다.

(3) 세번째 Stages

----------------------------------------------------------------------------------------------------------------------------

4. File 생성하기

※ 이번 예제에서는 파일을 생성하고, Jenkins에서 파라미터를 사용하는 방법을 같이 설명하려합니다.

1) 예제 코드

pipeline { agent any stages { stage('create file') { steps { // FILE_NAME 변수 값이 이름인 파일을 생성, 내용은 OUTPUT_TEXT변수의 값 writeFile( file: "${FILE_NAME}.txt", text: "${OUTPUT_TEXT}") sh 'ls -la' echo 'I think it is one of the benefits when you use pipeline.' sh "cat ${FILE_NAME}.txt" } } } }

2) Job 생성

- Job 생성 시 나오는 설정 화면에서 -> "This project is parameterized" 체크하기

-> Add Parameter 클릭 -> "String Parameter" 선택

※ 여러 종류의 파라미터를 지정해서 빌드 할 수 있음. 이번 예제에서는 String 자료형의 파라미터를 사용합니다

- 다음과 같이 Name과 Default Value를 입력합니다. Description은 입력하지 않아도 빌드에 지장없음

3) Build 해보기

- Build 버튼의 위쪽에 파라미터를 확인 할 수 있습니다.

※ 이번 예제에서 사용되는 Pipeline의 경우 파라미터의 기본값설정등이 되어있지 않으므로 파라미터 설정없이 빌드 할 경우 빌드가 실패하게 됩니다.

※ 파라미터의 기본값을 설정하는 것은 추후 다시 설명예정

No such property 예외가 발생함!!

- 정상적으로 파라미터의 값을 설정하고 빌드 할경우

- 파라미터에 설정한 대로 파일이 생성되었고, 파일의 내용이 출력된 것을 확인 할 수 있습니다.

----------------------------------------------------------------------------------------------------------------------------

5. File 생성 후 Jenkins 서버에 저장하기

- writeFile 명령어를 통해 생성한 파일은 기본적으로 clone된 Pipeline프로젝트의 루트 디렉토리에 저장됩니다.

- 실무에서 Jenkins로 자동 배포되어지는 프로젝트라면 삭제되고 다시 생성되는 것이 하루에도 수십번 있을 수 있습니다. 만에하나 중요한 파일이라면 archiveArtifacts 명령어를 사용해 파일을 Jenkins 서버에 저장 할 수 있습니다.

- 이번 예제에서는 environment 로 Pipeline내에서 환경변수를 선언하는 방식, post로 빌드 후 처리에 대해서도 설명하겠습니다.

1) 예제코드

pipeline { agent any // 환경변수를 pipeline 내에서 선언하기 environment { // Jenkins Web UI에서 설정한 값을 fileName1 라는 변수에 저장 fileName1 = "${FILE_NAME}.txt" // fileName2 이라는 변수에 "AnotherFile.txt" 값을 저장 fileName2 = "AnotherFile.txt" // contentOfFile2 변수에 "Here is file2" 값을 저장 contentOfFile2 = "Here is file2" } stages { stage('create file') { steps { echo 'create file 1, 2' //파일 작성1 : 내부에서 선언한 환경변수 fileName1 = 파일명 , Jenkins Web UI에서 설정한 변수 = 파일내용 writeFile(file: fileName1, text: "${OUTPUT_TEXT}") //파일 작성2 : 내부에서 선언한 환경변수 fileName2 = 파일명 , contentOfFile2 = 파일내용 writeFile(file: fileName2, text: contentOfFile2) } } stage('archive artifacts') { steps { echo 'save file 1, 2' //Jenkins 서버에 파일 1,2를 저장 archiveArtifacts fileName1 archiveArtifacts fileName2 } } } // ※ 이 부분의 코드는 2번째 빌드에 추가했음 // 빌드가 끝난 후 처리 post { // 빌드가 성공시에 아래 명령어가 실행된다. success { // 워크스페이스 (clone된 프로젝트 폴더)가 삭제됨 cleanWs() } } }

2) Job 생성

- 파라미터를 설정하여 Job을 생성합니다

3) Build 해보기

- Build 버튼을 클릭하여 빌드를 실행합니다.

- #+숫자를 클릭합니다

- Jenkins Web UI에서는 다음의 화면에서 Jenkins 서버에 저장된 파일을 확인 할 수 있습니다.

- 텍스트파일은 다음과 같이 내용도 확인 가능함

※ 파일의 위치를 확인해보기 ( Docker Jenkins Container에 직접접속하여 확인했습니다.)

- 접속방법

# 컨테이너 값 확인 docker ps -a # 접속하기 docker exec -it {Jenkins Container ID 값} /bin/bash

- 기본적으로 생성된 파일은 워크스페이스의 클론된 프로젝트 폴더내에 생성됩니다.

- pipeline에 post를 선언하여, 성공시 클론된 프로젝트 폴더를 삭제하는 명령 cleanWs를 추가합니다

- 그 후 다시 빌드를 해도 여전히 생성한 파일을 확인 할 수 있습니다.

- 워크스페이스를 확인해보면 PipelineTest04는 삭제된 것을 확인 할 수 있습니다.

- 결과만 간단히 알아보면 아래 화면에 나타나있는 경로에 파일이 저장되는 것을 알 수 있습니다.

※ 혹시 Jenkins 서버의 디스크 용량이 부족하다면 첨부파일이 너무 많은 것은 아닌지?

workspace를 정리해도 디스크 용량이 여전히 부족하다면 "archive"폴더를 확인해보시기 바랍니다.

----------------------------------------------------------------------------------------------------------------------------

6. Jenkins 서버에 저장된 다른 Job의 파일가져오기

- PipelineTest04에서 저장한 파일을 이제부터 생성할 PipelineTest05에서 가져와 복사해 보도록 하겠습니다.

- 변수를 설정하는 parameters 와 Pipeline안에서 groovy 프로그래밍 언어를 사용 할 수 있게 해주는 script를 같이 설명하겠습니다.

1) 예제코드

pipeline { agent any // pipeline내에서 사용할 변수 를 설정할 수 있다. enviroment와 비슷함 parameters { // string 형태의 변수를 선언 string( // 변수명을 'COPY_SOURCE_PROJECT' name: 'COPY_SOURCE_PROJECT', // 기본값으로 "PipelineTest04"를 지정 defaultValue: "PipelineTest04", // 변수의 설명을 지정 description: 'Name of source project for copying of artifacts.' ) } stages { stage('delete workspace') { steps { //기존의 workspace를 정리합니다. deleteDir() } } stage('copy artifacts') { steps { // PipelineTest04의 파일을 복사합니다. copyArtifacts(projectName:"${params.COPY_SOURCE_PROJECT}") } } stage('find files') { steps { // 그루비를 사용합니다. script{ //files라는 변수에 findFiles라는 내장함수로 파일목록을 가져옵니다. files = findFiles(glob: '*.*') // 반복하여 파일 목록을 출력합니다. for ( file in files ){ echo file.name } } } } } }

2) Job 생성

- 이번에는 특별히 변수를 설정하지 않고 그냥 생성하면 됩니다.

3) Build 해보기

- Build 버튼을 클릭하여 빌드를 실행합니다.

- 이번에는 결과를 Stage View플러그인에서 확인해보겠습니다.

- Stage View 플러그인의 붉게 표시한 부분을 포커스 하시면, Logs 버튼이 표시됩니다.

- 로그 버튼을 클릭시 Jenkins Server UI의 윗쪽에 로그가 표시되는 것을 확인 할 수 있습니다.

----------------------------------------------------------------------------------------------------------------------------

이상으로 2장. pipeline 예제작성 + 실행 - 2-1 : Shell , File, Artifacted File 을 마치겠습니다.

다음은 - 2-2 : parallel(build), parallel(master - slave) , JSON 다루기를 포스팅 하도록 하겠습니다.

David
David

Here is my sword.