본문 바로가기
프로그래밍/기타

[Jenkins] cron시 timezone 추가하기

by 카프카뮈 2022. 7. 12.

본 글은 아래의 목적을 위해 작성되었다.

  • 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

 

Spring Batch 관리 도구로서의 Jenkins

Spring Batch는 아직까지 확실한 표준 관리 도구가 없습니다. 각 팀/회사마다 상이한 방법들을 사용하는데요. 대표적인 방법들은 아래와 같습니다. Cron 클라우드 서버리스 이를테면 AWS의 Lambda 에 배

jojoldu.tistory.com


Pipeline으로 배치 운영

위에서 설명한 파이프라인을 구축하는 예시를 하나 들어보자.

만약 매일 오후 1시에 사용자들에게 spring batch로 메일을 보내야 한다고 가정해 보자.

  • 물론 spring boot 프로젝트 내에 배치 코드와 스케줄러 코드를 두고 운용할 수 있다.
    • 그러나 이 경우, 배치 프로세스로 인해 프로젝트에 부하가 커질 수 있다.
    • 그렇기 때문에, 배치 프로젝트는 일단 메인 프로젝트와 분리되어 관리된다고 가정한다.
  • 배치+스케줄러를 독립 프로젝트로 만들어서 배포할 수 있다.
    • 하지만 이 경우 상세한 관리가 어렵고, 실행 이력 등을 정리해서 관리하기 어렵다.
    • 또한 실패시 메일 발송이나 특정 상황에서 수동 실행 등이 어렵다.

이때, 젠킨스를 사용하면 아주 편리해진다.

  • 배치 프로젝트를 만들어 주고, 젠킨스에 해당 프로젝트를 실행시키는 파이프라인을 만든다.
  • 파이프라인에 적절한 Trigger를 걸어 정해진 시간에 실행할 수 있도록 한다.
  • 이제 Trigger에 의한 실행 외에도, 원할 경우 직접 빌드하여 배치 실행이 가능해진다.
  • 또한 최근 배치 실행 이력 및 성공/실패 여부와 로그 확인이 모두 가능하다.
  • 파이프라인에 메시지 기능을 추가해 메일 발송이나 다른 알림을 발송할 수 있다.

Pipeline cron

이러한 파이프라인을 만들었을 때, trigger로 cron을 설정해 두면 원하는 시간에 파이프라인 실행이 가능하다.

https://ko.wikipedia.org/wiki/Cron

 

cron - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

나는 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

 

[JENKINS-13293] Add cron syntax to set Time Zone - Jenkins Jira

Whatever this is it's not that this doesn't exist, so please file a new issue.

issues.jenkins.io

해당 이슈 내의 예제에서 보듯, 아래처럼 파이프라인의 cron에 값을 넣어주면 된다.

그런데, Jenkinsfile을 통해 파이프라인을 관리중이라면 값을 어떻게 넣으면 될까?

아래처럼 수정해서 넣어주면 된다.

pipelineTriggers([cron('TZ=Asia/Seoul\n0 9 * * *')])

개행을 바탕으로 TZ와 cron 값을 구분하는데, \n 을 넣어주지 않을 경우 cron 값까지 Timezone으로 인식하여 오류가 발생한다.


마치며

최근 Jenkins를 여러 목적으로 사용하고 있는데, 꽤 만족스러운 경험을 얻고 있다.

다만 아직 능통하지는 못해서, 이렇게 조금씩 배워가며 개념들도 익히고 있다.

이 글도 중간중간 틀린 내용이 있을 수 있는데, 언제든 피드백을 부탁드립니다.

반응형

댓글