콘텐츠로 이동

Jenkins Build periodically 스케줄 문법과 H 키워드

Jenkins는 플러그인으로 빌드·테스트·배포 과정을 자동화하는 오픈 소스 CI 도구다. 잡 설정의 Build Triggers 항목에서 Build periodically를 체크하면 Schedule 입력 칸이 열린다. 여기에 시간을 적으면 그 시간마다 빌드가 돈다.

문법은 Linux crontab과 거의 같다. 한 줄에 다섯 필드를 탭이나 공백으로 구분해 적는다(Jenkins 도움말).

MINUTE HOUR DOM MONTH DOW
필드 의미 범위
MINUTE 분 0-59
HOUR 시 0-23
DOM 일 1-31
MONTH 월 1-12
DOW 요일 0-7 (0과 7이 일요일)

한 필드에 여러 값을 넣는 연산자는 다음과 같다.

  • *: 모든 값
  • M-N: 범위
  • M-N/X, */X: 범위 또는 전체에서 X 간격
  • A,B,...,Z: 값 나열

빈 줄과 #으로 시작하는 줄은 주석으로 무시한다.

H(hash)는 범위 안의 값 하나를 고르는 기호다. 무작위처럼 보이지만 잡 이름의 해시로 정하므로 같은 잡에서는 값이 바뀌지 않는다.

여러 잡을 0 0 * * *로 걸면 모두 자정에 동시에 돌아 서버 부하가 한 시점에 몰린다. H H * * *로 걸면 각 잡이 하루 한 번씩 돌되 실행 시각이 잡마다 흩어진다. 그래서 Jenkins 도움말은 가능한 곳마다 H를 쓰라고 권한다.

  • H(a-b): 범위 안에서 해시로 고른다. H H(0-7) * * *는 0시부터 7시 59분 사이 어느 한 시각이다.
  • H/X: 해시로 정한 시작점에서 X 간격으로 돈다. H/15 * * * *는 15분마다 돌고, 실제 분은 잡마다 다르다(예: 7, 22, 37, 52분).
  • 일(DOM) 필드의 해시는 항상 1-28 범위에서 고른다. 월마다 일수가 달라 */3, H/3 같은 짧은 주기는 월말에 간격이 고르지 않다.

@yearly, @annually, @monthly, @weekly, @daily, @midnight, @hourly를 쓸 수 있다. 별칭도 해시로 시각을 분산한다. @hourly는 H * * * *와 같고, @midnight는 0시부터 2시 59분 사이 어느 시각이다.

# 매 분
* * * * *
# 10분마다
H/10 * * * *
# 매일 3시 0분부터 30분까지 매 분 (하루 31번)
0-30 3 * * *
# 매월 10일과 11일, 5시부터 7시 사이에 30분마다
H/30 5,6,7 10-11 * *
# 매시 15분부터 45분 사이에 10분 간격
H(15-45)/10 * * * *
# 토요일과 일요일, 9시부터 15시까지 2시간마다 (9, 11, 13, 15시)
H 9-16/2 * * 6-7
# 1월을 빼고 매달 1일과 15일에 한 번
H H 1,15 2-12 *

0-30 3 * * *처럼 분 필드에 범위를 그대로 쓰면 범위 안의 매 분마다 돈다. 범위 안에서 한 번만 돌리려면 H(0-30) 3 * * *로 쓴다.

스케줄은 기본으로 Jenkins 컨트롤러 JVM의 시간대를 따른다. 다른 시간대로 돌리려면 입력 칸의 첫 줄에 TZ=와 시간대 ID를 적는다. TZ= 줄 다음 줄부터 스케줄을 쓴다.

TZ=Asia/Seoul
# 서울 시간 20시대에 한 번
H 20 * * *

쓸 수 있는 시간대 ID는 Jenkins가 도는 Java 런타임에 따라 다르다.

빌드처럼 무거운 잡은 출근 전 새벽 시간대에 범위를 주고 H로 흩어 돌린다. 시각은 해시가 고르므로 잡이 여러 개여도 같은 시각에 몰리지 않는다.

# 매일 0시부터 6시 59분 사이 어느 한 시각
H H(0-6) * * *