현재 구축중인 시스템에 마땅한 job scheduler가 없다.
airflow등 몇가지 시스템 검토하다 가장 익숙하고 간단하게 구현 가능한 jenkins pipeline으로 결정했다.
우선 필요한 구성은 아래 그림과 같다.
각각의 batch task가 있고, 그것들이 선/후행 작업으로 연결되면 된다.
일부는 병렬도 실행가능한것들도 있다.
고려해야 할 사항은 아래와 같다.
node {
stage('A job') {
sh 'echo "A 작업"'
}
stage('B job') {
parallel 'Build-test-1' : {
sh 'echo "병렬1 작업"'
} , 'Build-test-2' : {
sh 'echo "병렬2 작업"'
} , 'Build-test-3' : {
sh 'echo "병렬3 작업"'
}
}
stage('C job') {
sh 'echo "C 작업"'
}
stage('D job') {
sh 'echo "D 작업"'
}
}
위 스크립트를 실행하면 아래와 같이 처리된다.
batch 작업은 대부분 선후 작업이 연관관계가 있다.
에러 발생시 대부분 다음 작업을 멈추어야 한다.
하지만, 에러가 발생해도 다음 작업을 수행하되, 해당 내용에 대해서 알림만 받고 싶은경우가 있다.
jenkins script에서 예외를 사용할수 있다.
기본적으로 아래 내용중 catch절을 활용한다.
try { 작업내용 } catch(e) { 예외시 작업 }
예외시 작업에는 slack, email등 알림작업이 들어가고,
멈추어야 하는경우는 예외를 다시 throw 한다.
반대로 멈출 필요없는 경우는 throw를 하지 않는다.
node {
stage('A job') {
sh 'echo "A 작업"'
}
stage('B job') {
parallel 'Build-test-1' : {
sh 'echo "병렬1 작업"'
} , 'Build-test-2' : {
sh 'echo "병렬2 작업"'
} , 'Build-test-3' : {
try {
sh 'exit 255'
} catch(e) {
print('이 예외는 무시 됩니다.')
}
}
}
stage('C job') {
try {
sh 'exit 255'
} catch(e) {
print('이 예외는 작업을 중단합니다.')
throw e
}
}
stage('D job') {
sh 'echo "D 작업"'
}
}
이 작업을 실행하면 결과는 아래와 같다.
로그를 보면, B작업에서 에러가 발생했으나 C작업으로 진행된것을 확인할수 있다.
jenkins build trigger에 보면 "Build periodically"라는 항목이 존재한다.
해당 항목에 batch job이 실행될 시간을 입력하면 된다.