두둥 서비스에서는 스프링 배치 + 젠킨스 조합으로
스텝단위가 아닌 잡단위로 파이프라인을 구성해서 처리중이다.
이동욱 님께서 발표하신 내용기반으로
스프링 배치에서 스텝으로 나눈것이 아닌 잡 단위로 만들어서 젠킨스로 파이프 라인을 구성하고있다.
강의 내용중에 스프링 배치 어플리케이션의 버젼이 바뀐경우
항상 최신본을 실행시키기위해 app.jar 를 바라보게 한후에 readlink 로
v1 -> v2.jar 로 바뀌어도 실행 명령어의 변경없이 젠킨스 잡을 돌릴 수 있도록 구성하셨다.
필자는 Api 어플리케이션도 도커로 말아서 배포 중이므로,
배치 어플리케이션도 도커로 말아서 항상 최신본을 실행시킬수 있는 구성을 공유하고자한다.
목차
1. 배치 어플리케이션 도커로 세팅
2. 젠킨스 글로벌 환경변수 세팅
3. sh 커맨드로 젠킨스 잡 구성하기
1. 배치 어플리케이션 도커로 세팅
두둥 프로젝트에서는 멀티 모듈로 사용중이다
도메인 관련 오브젝트들을 API 어플리케이션에도 사용하고, Batch 어플리케이션 둘다 사용가능하다.
// 배치 어플리케이션 그래들
implementation project(':DuDoong-Domain')
implementation project(':DuDoong-Common')
implementation project(':DuDoong-Infrastructure')
위처럼 구성을했고, 배치 어플리케이션을 항상 실행시키는것이아니라,
spring:
profiles:
include:
- infrastructure
- domain
- common
# --job.name=<잡이름> 형태로 파라미터를 넘겨줘서 잡을 실행시킨다.
batch.job.names: ${job.name:NONE}
잡 단위로 실행시키기 때문에 application.yml을 위와 같이 구성했다.
FROM openjdk:17-alpine
EXPOSE 8080
COPY ./build/libs/*.jar app.jar
ARG PROFILE=dev
ENV PROFILE=${PROFILE}
ENTRYPOINT ["java","-Dspring.profiles.active=${PROFILE}", "-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Dockerfile은 위와같이 세팅했다.
Api 어플리케이션 도커파일과 같다.
도커를 말아올리는 ci는 github action을 사용중인데
태그기반으로 액션을 트리거 시키고있다.
on:
push:
tags:
- Api-v*.*.*
on:
push:
tags:
- Batch-v*.*.*
Api,Batch 두가지로 시작하는 태그에 반응하도록 하고있고,
RELEASE_VERSION_WITHOUT_V="$(cut -d'v' -f2 <<< ${GITHUB_REF#refs/*/})"
위와같이 Batch-v1.0.0 이라면
도커태그는 {user}/{project}:1.0.0 형식의 도커가 만들어지도록 하고 있다.
깃헙의 릴리즈를 사용해서 태그를 달아주고있다.
2. 젠킨스 글로벌 환경변수 세팅
이동욱님의 배치 어플리케이션 세미나를보면 실행에서 똑같은 부분은 환경변수로 만들어서
중복되는 코드들을 줄이고 있다.
두둥에서도 위와같이 프로덕션용과 스테이징용을 환경변수로 나누어서
실행시키고있다.
latest 태그로 항상 최신버젼을 가져오고있는데 이는 깃헙 action ci 단에서 버젼이 붙은 태그로도 배포하지만,
latest 태그도 항상붙여서 올리고있다.
sudo docker run --pull=always --env-file {환경변수 파일 위치} --net=host {도커이미지}:latest
sudo 를 젠킨스에서 붙일려면
위 내용을 참고하기 바란다.
3. sh 커맨드로 젠킨스 잡 구성하기
${BATCH_PROD_APP} --job.name=슬랙유저통계 date=${TODAY}
위처럼 간단하게 할 수 있다.
추가로 넣어야할 매개변수가 있는경우,
매개변수 추가하기로 넣을 수 있다.
간단하게, 도커로 배치 어플리케이션을 말아올려서,
젠킨스에서 사용하는 방법을 알아보았다.
배치 어플리케이션 관련소스는
두둥 프로젝트에서 확인하실 수 있다.
'스프링' 카테고리의 다른 글
[스프링] spring oauth Open ID Connect with kakao (16) | 2023.03.08 |
---|---|
[스프링] spring feign client wiremock test (1) | 2023.03.07 |
[스프링] spring thymeleaf to pdf 이미지,한글 적용하기 (1) | 2023.03.06 |
[스프링] spring rate limit 적용히기 bucket4j (2) | 2023.03.06 |
[스프링] spring 프록시 환경에서 HttpContentCache 적용 (0) | 2023.03.06 |