Jenkins Pipeline 작성 (3) - Job 마다 다른 시간에 trigger하도록 하는 조건 넣기 (특정 주기로 job 실행하기)

smallcherry's techlog·2025년 8월 9일
0

How?

  1. 스케줄링 관련 변수 및 함수(boolean 반환) 를 groovy로 직접 구현

    //1. timezone 설정
    def tz = TimeZone.getTimeZone("Asia/Seoul")
    	
    //2. calendar instance 초기화
    def calendar = Calendar.getInstance(tz)
    calendar.time = buildDate
    
    // 3. currentMinute 초기화
    def currentMinute = buildDate.format("mm", timezone = tz).toInteger()
    
    // 4. 함수 정의
    def isHourlyRun = {
      return currentMinute == 0
    }
  2. stage 블럭에서, when.expression 구문 내에 return으로 커스텀 구현 한 함수를 호출해서 그 결과를 return 하기

    stage('AStatisticsJob'){
    	when{
    		expression {
     	return isHourlyRun()	
     		}
     }
    }

완성된 Jenkinsfile

이전 빌드의 실행 성공 여부에 따른 조건 넣기 (스테이지 간 의존관계 설정)
& 다른 시간에 trigger 되는 조건

-> 모두 혼합 적용한 결과 !!

def tz = TimeZone.getTimeZone("Asia/Seoul")

def calendar = Calendar.getInstance(tz)
calendar.time = buildDate

def currentHour = buildDate.format("HH", timezone=tz).toInteger()
def currentMinute = buildDate.format("mm", timezone=tz).toInteger()
def currentDayOfMonth = buildDate.format("dd", timezone=tz).toInteger()
def currentDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK)

// 매월 1일 00:00 실행
def isMonthlyRun = {
    return currentHour == 0 && currentDayOfMonth == 1
}

// 매시 정각 실행
def isHourlyRun = {
    return currentMinute == 0
}

// 토요일 00:00 실행
def isSaturdayMidnight = {
    return currentHour == 0 && currentMinute == 0 && currentDayOfWeek == 7
}

// 매일 00:00 실행
def isMidnight = {
    return currentHour == 0 && currentMinute == 0
}

// 매일 07:00 또는 18:00 실행
def is7oclockOr18oclock = {
    return (currentHour == 7 && currentMinute == 0) || (currentHour == 18 && currentMinute == 0)
}

pipeline  {
    agent any
    triggers {
        // 1. 매 10분마다 파이프라인 실행
        cron('0,10,20,30,40,50 * * * *')
    }
    stages('ParallelStages') {
        stage('ParallelStage') {
            parallel {
                // 3. 실행: JobA_Every10min
                stage('JobA_Every10min') {
                    steps {
                        echo 'Running JobA_Every10min'
                        build 'JobA_Every10min'
                    }
                }
                // 4. 조건: 한 시간 마다 실행 → JobB_Hourly
                stage('JobB_Hourly') {
                    when {
                        expression { return isHourlyRun() }
                    }
                    steps {
                        echo 'Running JobB_Hourly'
                        build 'JobB_Hourly'
                    }
                }
                // 5. 조건: 한 시간 마다 실행되는 순차 작업
                stage('SequentialJobs_Hourly') {
                    when {
                        expression { return isHourlyRun() }
                    }
                    stages {
                        // (1) 실행: JobC_Hourly
                        stage('JobC_Hourly') {
                            steps {
                                echo 'Running JobC_Hourly'
                                build 'JobC_Hourly'
                            }
                        }
                        // (2) 조건: 자정 && 이전 빌드 결과 success → JobD_Daily0000
                        stage('JobD_Daily0000') {
                            when {
                                expression { return isMidnight() && currentBuild.resultIsBetterOrEqualTo('SUCCESS') }
                            }
                            steps {
                                echo 'Running JobD_Daily0000'
                                build 'JobD_Daily0000'
                            }
                        }
                        // (3) 조건: 토요일 자정 && 이전 빌드 결과 success → JobE_WeeklySat0000
                        stage('JobE_WeeklySat0000') {
                            when {
                                expression { return isSaturdayMidnight() && currentBuild.resultIsBetterOrEqualTo('SUCCESS') }
                            }
                            steps {
                                echo 'Running JobE_WeeklySat0000'
                                build 'JobE_WeeklySat0000'
                            }
                        }
                        // (4) 조건: 이전 빌드 결과 success → JobF_OnSuccess
                        stage('JobF_OnSuccess') {
                            when {
                                expression { return currentBuild.resultIsBetterOrEqualTo('SUCCESS') }
                            }
                            steps {
                                echo 'Running JobF_OnSuccess'
                                build 'JobF_OnSuccess'
                            }
                        }
                        // (5) 조건: 07:00 또는 18:00 && 이전 빌드 결과 success → JobG_0700or1800
                        stage('JobG_0700or1800') {
                            when {
                                expression { return is7oclockOr18oclock() && currentBuild.resultIsBetterOrEqualTo('SUCCESS') }
                            }
                            steps {
                                echo 'Running JobG_0700or1800'
                                build 'JobG_0700or1800'
                            }
                        }
                    }
                }
            }
        }
    }
}

마무리하며

사실, 이 작업을 할 때만 해도 Chat GPT 3.5 가 최신인 시절이라.. 엄청난 삽질을 많이 했다
너무 늦은 기록이지만,, LLM이 그당시엔 파이프라인 코드는 잘 못짜줬어서 공유해주고 싶었다
그리고 직접 구글링해서 유입되지 않더라도 간접적으로 ai agent를 통해 좋은 소스로 쓰일 수 있지 않을까 싶어 업로드한다.
GPT5가 공개된 현 시점에서는 이런 소스 없이도 잘 짜 줄 수 있지만.ㅎ

지난 기록을 돌아보며, 새삼 LLM의 발전과 개발자로서 일하는 방식의 변화를 많이 체감한다.

profile
Java Developer

0개의 댓글