Jenkins pipeline 이 뭐냐?
- 젠킨스의 플러그인들 중 하나. 그러니까 플러그인
- 어떤 역할을 해주는 플러그인이냐?
- 연속적인 이벤트 또는 Job의 그룹을 실행시킬 수 있다고 한다. 그러니까 하나의 Job에서 여러 가지 일들을 할 수 있도록 도와주는거?
- 어떤 역할을 해주는 플러그인이냐?
왜 필요한거지?
- 단순한 Job들이 많아지는 경우 Job을 관리하기가 힘들어진다고 함. 그럴 것 같다
- 이걸 파이프라인으로 작성하여 하나의 Job으로 묶으면 관리도 편해지고 진행 상황도 알 수 있고 직관적인 파익이 가능하다고 함
- 젠킨스 공식 사이트에서의 소개하는 Jenkins 파이프라인에서 쉽게 모델링할 수 있는 CD 시나리오의 예
Pipeline Concept
- Pipeline
- Agent/Node
- Stage
- Step
어떻게 하는거야?
- pipeline 전용 DSL(Domain-Specific Language)로 작성된 스크립트 코드를 작성하면 됨
- Jenkinsfile 이라는 곳에다가 DSL 문법으로 뭔가를 작성하면 젠킨스가 그걸 실행함
파이프라인은 어떻게 만드는거니?
3가지 있다고 함
- WEB UI를 통ㅇ해서 Job 구성에서 직접 스크립트 코드 작성
- SCM을 이용해서 Jenkinsfile 에 스크립트 코드 작성 - github에 jenkinsfile을 만들어 두고 그걸 땡겨와서 젠킨스가 실행
- Blueocean 플러그인으로 UI를 통해서 스크립트 코드 작성 - github에서 관리
Jenkins 파일은 어떻게 작성하니?
2가지 타입으로 작성이 가능
- 2가지 타입 모두 Groovy Script로 작성
- Declarative Pipeline : 쉽게 작성이 가능, Groovy 문법 기반인데 몰라도 작성 가능하다고 함
- 최상단에 pipeline 이라고 되어 있으면 declarative 문법으로 작성된 것
- Scripted Pipeline : Groovy 문법 기반, Declarative 보다 효과적이고 많은 기능으로 포함해서 작성 가능한데 어렵다고 함.
- 최상단에 node 지시어가 있으면 scripted 문법으로 작성된 것
- 위 2개 문법을 짬뽕으로 사용할 수는 없음
- 장단점은 https://jojoldu.tistory.com/356?category=777282 를 참조
Groovy 문법은 뭐야?
- 동적 타이핑 프로그래밍 언어??
- http://groovy-lang.org/syntax.html
잘 모르겠고 Scripted Pipeline 으로 일단 해 보자
작성할 때 알아야하는 Directive(지시어)를 먼저 알아보자
- node : script 파이프라인을 실행하는 젠킨스 에이전트, 최상단에 선언해야 함, 젠킨스 마스터가 관리하는 서버? 프로그램? 정도로 이해됨
- dir : 명령을 수행할 디렉토리(폴더) 정의
- stage : 파이프라인 각 단계를 얘기하며, 이 단계에서 어떤 작업을 할 지 선언하는 곳, 그러니까 작업 내용을 작성하는 곳
- git : git 원격 저장소에서 프로젝트 clone
- sh : unix 환경에서 실행할 명령어 실행, 윈도우에서는 bat
- def : groovy 변수, 함수 선언 javascript로 치면 var
아래와 같은 포맷으로 작성
node('worker') { stage('source') { // 스테이지에서 수행할 코드 작성
- https://jojoldu.tistory.com/356?category=777282 여기서 그림 참조
- Scripted Pipleline에서는 별도의 step 지시어가 없다. stage의 실행되는 것이 step이라고 생각하면 된다고 함
샘플
jenkins에 job 등록하기(Webhook과 Poll SCM) 에서 사용한 깃허브 레파지토리를 그대로 사용한다는 가정
pipeline {
agent any
stages() {
stage('git clone') {
steps() {
git 'https://github.com/leeseok0916/jenkinsTest.git'
}
}
stage('Test') {
steps {
echo 'Testing..'
}
}
stage('execute sh') {
steps {
sh "chmod 774 ./project.sh"
sh "./project.sh"
}
}
}
}
혹은
node {
stage('git clone') {
git 'https://github.com/leeseok0916/jenkinsTest.git'
}
stage('Test') {
echo 'Testing....'
}
stage('execute sh') {
sh "chmod 774 ./project.sh"
sh "./project.sh"
}
}
Flow Control
- 공식문서
- if 문 사용 가능
node { stage('Example') { if (env.BRANCH_NAME == 'master') { echo 'I only execute on the master branch' } else { echo 'I execute elsewhere' } } }
- try/catch/finally 예외 처리 가능
node { stage('Example') { try { sh 'exit 1' } catch (exc) { echo '무엇인가 잘못됐어....' throw } } }
Pipeline을 만들어보자
Web UI에서 Jenkinsfile을 작성
- 젠킨스 대시보드에서 새로운 Item 선택 => 아이템 이름 쓰고 Pipleline 선택
- 설명 작성하고 Pipleline 탭 선택 => Definition에서 Pipeline script 선택 => 위에 샘플로 작성한 스크립트 넣고 저장
- Build Now 클릭해서 빌드 해봄
- Pipeline Syntax 를 클릭해보면 입력값들 작성하면 문법을 만들어 주는 기능을 사용할 수 있다
SCM을 이용해서 Jenkinsfile을 작성
- 테스트할 레파지토리에 Jenkinsfile을 생성하고 위의 샘플 코드를 작성해하고 push해 두자
- 젠킨스 대시보드에서 새로운 Item 선택 => 아이템 이름 쓰고 Pipleline 선택
- Definition에서 Pipeline script from SCM 선택 => SCM 항목에서 Git 선택 => 원격 저장소 넣어주고 => Credentials 에서 계정 선택 => Branches to build 에서 master 브랜치 작성 => Script Path 에서 Jenkinsfile 위치 작성, 최상단에 파일을 뒀으면 디폴드로 놔둬도 된다
- Build Triggers 항목에서 GitHub hook trigger for GITScm polling 체크해야 마스터 브랜치에 push 됐을 때 빌드 된다
- Build Now를 클릭해서 최초 1회는 빌드를 해줘야 한다
- 아무 파일 생성하거나 수정해서 원격 저장소의 마스터 브랜치에 push 하고 빌드되는지 확인
참고
'개발 > 젠킨스' 카테고리의 다른 글
Jenkins Global 환경변수 (0) | 2023.03.27 |
---|---|
Jenkins Pipeline에서 shell 사용하기 (0) | 2023.03.27 |
jenkins에 job 등록하기(Webhook과 Poll SCM) (0) | 2023.03.27 |
매개변수를 입력받는 Job (0) | 2023.03.27 |
원격 빌드 트리거(remote build trigger) (0) | 2023.03.27 |