Jenkins Pipeline 작성 (1) - 실행 조건에 따른 전체 pipeline 구조 설계

smallcherry's techlog·2024년 5월 27일
0
post-thumbnail

글 작성 계기

실행주기가 다르고, 실행 시 선행 job에 대해 의존관계가 있는 job들을 의도한대로 실행시키는 Jenkins pipeline을 작성하게 되었다.

단순한 예제는 많이 있었지만 내가 원하는 예제는 인터넷에서 찾기 어려웠어서 공식문서를 참고해가며 직접 다양한 실험을 통해 파이프라인을 완성할 수 있었다.

Jenkins pipeline 작성과 groovy 모두 처음 다뤄보는 입장에서, 몇 가지 어려웠던 점들이 있어서 그 부분들을 중심으로 기록을 남겨본다.

Jenkins pipeline 개요 이해하기

  • 이 부분은 Jenkins 공식 문서가 너무 잘 되어있는 편이라, pipeline을 작성하는 데에 핵심이 되는 문법들을 아래 사이트에서 먼저 학습하였다.
    https://www.jenkins.io/doc/book/pipeline/syntax/

  • 이후, 공식문서의 예제를 따라해보며 pipeline의 동작을 가볍게 이해해나갔다.

원하는 전체 Jenkins Job 실행 플로우

고려사항

  • 병렬 처리가 가능한, 데이터 간의 의존 관계가 없는 3가지 작업 묶음으로 구성
    1. [Parallel #1] Trending Statics Job 실행 블록
    2. [Parallel #2] Shorts Statistics Job 실행 블록
    3. [Parallel #3] Sequential Stages 블록

  • [Parallel #1], [Parallel #2] 는 각각 단일 Job을 독립적으로 실행하면 됨

  • [Parallel #3]의 경우, 순차적으로 실행되는 Job이 5개이고, 앞 작업 실행 결과에 따라 실행될 지 말 지가 결정됨

  • 모든 Job들은 각각이 필요한 특정 시점에만 트리거 되어야 함

작업 순서

  1. 실행 조건에 따른 전체 pipeline 구조 설계 (본 글)
  2. 이전 빌드의 실행 성공 여부에 따른 조건 넣기 (예정)
  3. Job 마다 다른 시간에 trigger하도록 하는 조건 넣기 (예정)

고려사항에 맞춘 pipeline 구조 설계

  • 아래는 고려사항에 맞춰, pipeline 블록의 구성만 나타내고 실질적인 실행 / 조건 코드는 주석으로만 작성해 둔 Jenkinsfile 코드다.
pipeline  {
	agent any
	triggers {
    	// 1
		cron('0,10,20,30,40,50 * * * *')
	}
	stages('Parallel Stages') {
		stage('Parallel Stage') {
        	// 2
			parallel {
        	    // 3
				stage("[Parallel #1] Trending Statistics Job") {
					// 실행: Trending Statistics Job 실행 
				}
                // 4
				stage('[Parallel #2] Shorts Statistics Job') {
					// 조건: 한 시간 마다
					// 실행: Shorts Statistics Job 실행
				}
                // 5
				stage('[Parallel #3] Sequential Stages') {
					// 조건: 한 시간 마다
					stages {
						stage('(1) Hourly Statistics Job') {
							// 실행: Hourly Statistics Job 실행
						}
						stage('(2) Daily Statistics Job') {
							// 조건: 자정이고, 이전 빌드 결과가 'success'이면
							// 실행: Daily Statistics Job 실행
						}
						stage('(3) Weekly Hot News Job') {
							// 조건: 토요일 자정이고, 이전 빌드 결과가 'success'이면
							// 실행: Weekly Hot News Job 실행
						}
						stage('(4) Total Statistics Job') {
							// 조건: 이전 빌드 결과가 'success'이면
                            // 실행: Total Statistics Job 실행
						}
						stage('(5) Daily Hot News Job') {
							// 조건: 7시 || 18시 이고, 이전 빌드 결과가 'success'이면 
							// 실행: Daily Hot News Job 실행
						}
					}
				}
			}
		}
	}
}
주석 번호설명
1전체 파이프라인 트리거
 - 시간 trigger의 가장 작은 단위인 10분마다 전체 파이프라인이 트리거되도록 설정함
2내부 세 개의 stage([Parallel #1], [Parallel #2], [Parallel #3])들이 병렬적으로 실행되도록 설정
310분마다 아무 의존관계 없이 실행하는 stage (Trending Statistics Job을 실행)
4한 시간 마다 아무 의존관계 없이 실행하는 stage (Shorts Statistics Job을 실행)
5stages 내부에 Job 간 실행 순서에 의존관계가 stage들 5개가 순차적으로 기입. stage들은 기입된 조건을 따라 실행됨
  • pipeline 컴포넌트들의 정의를 모르면 의문일 수 있는 것들
    • triggers: 전체 파이프라인 내에서 하나만 설정 가능해서, 가장 작은 trigger 단위인 10분 마다의 cron 으로 설정하고 세부 시간 조건은 별도로 설정함
    • parallel: stages 블럭이 아닌 stage 블럭 안에만 들어올 수 있기 때문에 외부에 stage 블럭으로 한번 감쌌다.
    • 이전 빌드 결과에 종속적이면 부정확할 수 있지 않나?
      • 특정 Job의 빌드 결과에 종속적이도록 설정이 불가능하다.
      • 그 대신, 위와 같이 parallel 내부에서 다른 stage 블록에 있어 다른 agent에서 실행된다면, 같은 agent에서 실행된 이전 실행결과에만 의존한다.
      • 따라서, 순차 실행과 그에 따른 의존성을 원하는 경우 stage('[Parallel #3] Sequential Stages') 내부의 stages 블럭에서 순서만 맞추면 의도대로 설정이 가능하다.

To Be Continued...

profile
Java Developer

0개의 댓글

관련 채용 정보