본문 바로가기
개발 고민

배치 서비스 매니저(스케줄러)를 젠킨스(jenkins)로 사용

by 냉동만두 2024. 2. 11.

요약

배치 서비스 스케줄 기능을 젠킨스로 사용 함.

 

문제

사내 배치 서비스는 python 으로 작성 되어 있고, 이를 실행 시키고 로그 관련 기능은 shell script로 작성 하여 운영 하고 있었다. 이 중 스케줄이 필요한 기능 (메일 발송, 데이터 검색 인덱싱, 리포트 생성) 은 linux crontab 에 등록 하여 운영 하고 있었다.  스케줄링이 필요 없는 기능은, 필요 시 배치서버 터미널에 접속 하여 실행 하고 결과를 다운로드 했다.

그런데, 서비스에 요구 사항이 늘어 남에 따라 배치 서비스 운영이 불편 했다. 어떤 이유로 배치 서비스가 비정상 종료 되거나, 실행 되지 못했을 때, 알기 어려웠고, 로그 확인을 터미널을 통해 로그 파일을 읽어야 했다. 배치 서비스가 어느 시점이 실행 되는지 관리도 어려웠다.

이러다보니, 배치 운영에 불필요한 시간이 많이 들고 터미널 사용이 많아 번거로웠으며, 작업에 대한 신뢰성과 정확성이 점점 떨어지기 시작 했다.

 

영감

문제점과 개선 방향을 정리 해보았고, 가장 중요한건, web ui로 crontab 관리 또는 설정한 일정에 따라 특정 명령어 실행(배치 명령어)를 실행 할 수있는 오픈소스를 찾기 시작 했다. 그러다 문득, 예전에 잠깐 찾아본 젠킨스 (jenkins) 가 떠올랐다. 스케줄링이 가능 한지 모르겠지만, 일단 편리한 web ui를 제공하고, 실행 기록을 web으로 확인 할 수 있었다. 심지어 실행 기록별로 stdout 을 볼 수 있던게 떠올랐다.

젠킨스를 오랜만에 다시 찾 던중, 스케줄링에 의한 빌드 실행 조건 "build periodically"이 있었다. crontab 비슷한 표현 식으로 스케줄링 설정이 가능 했고, 그 실행 조건에 맞춰  배치 스크립트를 실행 시킬 수 있었다. 답 찾음.

 

개념 증명

젠킨스를 다시 설치하여 둘러보면서 필요한 기능에 구현 가능 범위를 설정 해보고, 구현 및 설정 가능 한 내용을 정리 했다.

- web ui 있음

- crontab 같은 스케줄링이 가능 함

  - build periodically

- 실행 기록 주기 설정 또는 stodout 또는 로그 로테이트 설정 가능 함

  - Discard old build[Log Rotation]

- 명령어 실행 시 파라미터 주입 또는 파일 업로드 이후 경로 참조가 가능 함

  - This project is parameterized

- 명령어 실행 실패 시 이메일 알림이 가능 함

  - E-mail Notification Plugin

다만, 젠킨스에 대한 러닝 커브에 압도 당하기 싫으므로, 빌드 파이이프 라인은 사용 하지 않았으며, 다른 서비스 통합을 위한 플러그인은 최소 설치만 진행 했다.

 

 

기능 이전

필요한 기능을 충분히 증명 했다고 판단, 기존 배치 서비스를 젠킨스에서 실행 시키도록 변경 작업을 진행 했다. 쉘 스크립트를 통해 파이썬 실행 하는 로직은, 젠킨스 빌드 실행 스크립로 변경 했고, 불필요한 알림 기능이나, 로그 로테이트 기능도 변경 했다. 또한, 배치 서비스가 실패함을 젠킨스가 알 수 있어야 하므로, 배치 코드에서 예외 발생 시, 프로세스가 비정상 종료 하게끔(exit code 1)변경 했다. 또한, 배치 코드 내에 모든 로그는 콘솔 출력으로 변경 하여, 모든 로그는 젠킨스 내에서 확인 하도록 변경 했다. 

 

한계점 및 대응

젠킨스 사용으로 한계점도 분명 했다. 먼저, 젠킨스 서비스 자체가 내려가면, 모든 배치 서비스는 작동 하지 않게 된다. 다만, 시스템 자원 부족이 아닌 이상, 젠킨스 자체가 죽을일은 별로 없을 것으로 판단 했고, 내부 서비스 모니터링에 젠킨스도 추가 하여, 서비스 모니터링은 젠킨스와 독립적으로 실행 되게끔 변경 했다.

그리고 젠킨스 운영에 필요한 데이터는 모두 파일 기반이다. 특정 데이터베이스에 의존 하지 않고, 모든 데이터는 젠킨스 홈 디렉토리의 파일로 관리 되므로 데이터 정합성 주의가 필요 하다. 그래서 젠킨스 홈 디렉토리를, 주기적으로 백업 하는 스크립트를 추가 했고, 필요 시 원하는 시점으로 복원이 가능 하도록 대응 했다. 

 

 

결론 및 후기

진작 이렇게 바꿀걸. 배치 서비스 운영에 대한 신뢰성, 정확성, 신속성이 좋아졌다.

젠킨스 웹에서 스케줄링을 편리 하게 설정 가능 하고, 어떤 배치가 성공 실패 했는지 즉각 확인이 가능 했다. 또한, 스케줄링 없이 수동 실행이 필요한 로직들도 웹에서 편리하게 사용 가능 했고, 실행 시간 및 실행 기록까지 확인 할 수 있다. 로그 로테이트, 알림 등 대부분 젠킨스 자체 기능으로 운영이 가능 해서 서버에 터미널 접속 필요가 줄어들고, 배치 운영 난이도가 줄어들었다.