스케줄링 관련 변수 및 함수(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
}
stage 블럭에서, when.expression 구문 내에 return으로 커스텀 구현 한 함수를 호출해서 그 결과를 return 하기
stage('AStatisticsJob'){
when{
expression {
return isHourlyRun()
}
}
}
이전 빌드의 실행 성공 여부에 따른 조건 넣기 (스테이지 간 의존관계 설정)
& 다른 시간에 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의 발전과 개발자로서 일하는 방식의 변화를 많이 체감한다.