본 글은 아래의 목적을 위해 작성되었다.
- Jenkins Pipeline에 대해 간단히 알아본다.
- Jenkins Pipeline의 cron 옵션에 timezone을 추가한다.
- Jenkinsfile의 cron 옵션에 timezone을 추가한다.
Jenkins pipeline
젠킨스 파이프라인이 무엇일까?
젠킨스 파이프라인은 cd(지속적 전달) 파이프라인을 젠킨스에 구현하고 통합하는 것을 지원하는 플러그인 모음이다.
출처: https://www.jenkins.io/doc/book/pipeline/
젠킨스 파이프라인을 통해, 다양한 목적을 수행할 수 있다.
- 프로젝트의 자동화된 CI/CD 환경 구축
- 자동화된 배치 프로세스 구축
나 역시 Jenkins를 통해 지속적 통합을 위한 테스트 수행, 배포 프로세스 수행, 배치 자동화 등을 수행하고 있다.
이 중 배치 자동화는 특히나 편하게 쓰고 있는데, 인프런의 이동욱님이 쓰신 좋은 글이 있어 함께 링크를 남긴다.
https://jojoldu.tistory.com/489
Pipeline으로 배치 운영
위에서 설명한 파이프라인을 구축하는 예시를 하나 들어보자.
만약 매일 오후 1시에 사용자들에게 spring batch로 메일을 보내야 한다고 가정해 보자.
- 물론 spring boot 프로젝트 내에 배치 코드와 스케줄러 코드를 두고 운용할 수 있다.
- 그러나 이 경우, 배치 프로세스로 인해 프로젝트에 부하가 커질 수 있다.
- 그렇기 때문에, 배치 프로젝트는 일단 메인 프로젝트와 분리되어 관리된다고 가정한다.
- 배치+스케줄러를 독립 프로젝트로 만들어서 배포할 수 있다.
- 하지만 이 경우 상세한 관리가 어렵고, 실행 이력 등을 정리해서 관리하기 어렵다.
- 또한 실패시 메일 발송이나 특정 상황에서 수동 실행 등이 어렵다.
이때, 젠킨스를 사용하면 아주 편리해진다.
- 배치 프로젝트를 만들어 주고, 젠킨스에 해당 프로젝트를 실행시키는 파이프라인을 만든다.
- 파이프라인에 적절한 Trigger를 걸어 정해진 시간에 실행할 수 있도록 한다.
- 이제 Trigger에 의한 실행 외에도, 원할 경우 직접 빌드하여 배치 실행이 가능해진다.
- 또한 최근 배치 실행 이력 및 성공/실패 여부와 로그 확인이 모두 가능하다.
- 파이프라인에 메시지 기능을 추가해 메일 발송이나 다른 알림을 발송할 수 있다.
Pipeline cron
이러한 파이프라인을 만들었을 때, trigger로 cron을 설정해 두면 원하는 시간에 파이프라인 실행이 가능하다.
https://ko.wikipedia.org/wiki/Cron
나는 pipeline이 Git에 있는 Jenkinsfile을 바라보도록 설정해두고 있다.
해당 젠킨스 파일을 아래와 같이 적어둔다.
properties(
[
buildDiscarder(
logRotator(
daysToKeepStr: '10',
numToKeepStr: '10'
)
),
pipelineTriggers([cron('0 9 * * *')]),
disableConcurrentBuilds(),
],
)
runBatch ([
(...)
])
위와 같은 젠킨스 파일을 참조하여, 젠킨스가 프로젝트를 수행한다.
그런데, 아래와 같은 궁금증이 들 수 있다.
- 해당 cron 시간은 젠킨스에 설정된 timezone에 맞춰 실행된다.
- 그러면 글로벌 서비스를 운영하면서 국가별로 맞는 timezone에 실행되게 하려면 어떻게 하지?
물론 시간들을 하나의 timezone에 맞게 치환해서 쓰면 되지만, 이는 운영상 혼동의 여지가 크다.
cron에 timezone 넣기
다행히 젠킨스에서는 2016년 timezone을 cron에 넣는 기능을 추가하였다.
https://issues.jenkins.io/browse/JENKINS-13293
해당 이슈 내의 예제에서 보듯, 아래처럼 파이프라인의 cron에 값을 넣어주면 된다.
그런데, Jenkinsfile을 통해 파이프라인을 관리중이라면 값을 어떻게 넣으면 될까?
아래처럼 수정해서 넣어주면 된다.
pipelineTriggers([cron('TZ=Asia/Seoul\n0 9 * * *')])
개행을 바탕으로 TZ와 cron 값을 구분하는데, \n 을 넣어주지 않을 경우 cron 값까지 Timezone으로 인식하여 오류가 발생한다.
- 관련 stackoverflow link: https://stackoverflow.com/questions/63786302/timezone-in-triggers-at-pipeline-using-jenkins
마치며
최근 Jenkins를 여러 목적으로 사용하고 있는데, 꽤 만족스러운 경험을 얻고 있다.
다만 아직 능통하지는 못해서, 이렇게 조금씩 배워가며 개념들도 익히고 있다.
이 글도 중간중간 틀린 내용이 있을 수 있는데, 언제든 피드백을 부탁드립니다.
'프로그래밍 > 기타' 카테고리의 다른 글
Java 에서 다운로드받은 이미지의 타입 유추하기 (1) | 2024.04.12 |
---|---|
[Vue.js] QR code 만들기 (0) | 2024.01.11 |
개발자의 道 (1) | 2022.04.20 |
[Tips] 반복되는 값을 상수로 선언하자. (0) | 2022.04.11 |
팩토리 함수 이름짓기 (0) | 2022.04.03 |
댓글