이번 게시글에서는 웹 개발자 성향 테스트프로젝트에서 진행했던, Jenkins를 이용한 Spring Batch 실행 방법에 대해 설명하고자 한다.
Spring Boot 3.0부터 DefaultBatchConfiguration 클래스나 @EnableBatchProcessing 어노테이션을 선언할 경우 Batch가 자동으로 실행되지 않는다. 이를 해결하기 위해서는 JobLauncherApplicationRunner를 직접 등록해주어야 한다.
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.batch.job", name = "enabled", havingValue = "true", matchIfMissing = true)
public JobLauncherApplicationRunner jobLauncherApplicationRunner(JobLauncher jobLauncher, JobExplorer jobExplorer,
JobRepository jobRepository, BatchProperties properties) {
JobLauncherApplicationRunner runner = new JobLauncherApplicationRunner(jobLauncher, jobExplorer, jobRepository);
String jobNames = properties.getJob().getName();
if (StringUtils.hasText(jobNames)) {
runner.setJobName(jobNames);
}
return runner;
}
- JobLauncherApplicationRunner를 등록하여 Batch가 자동으로 실행되도록 설정한다.
- 호돌맨님의 블로그 : SpringSpringBatch에서 @EnableBatchProcessing때문에..
spring:
profiles:
default: local
batch:
job:
name: statisticJobNew
enabled: true
application.yml 파일에 자신이 등록한 job의 이름을 설정한다. 이렇게 하면 Spring Batch를 빌드하여 실행할 때 자동으로 Batch가 실행된다.
이제 jenkins로 해당 batch를 실행하면 끝이다.
Batch 코드가 변경되는 것을 반영하기 위한 여러 방법이 있지만, 나는 GitHub Repository에서 Jenkins가 실행될 때마다 Clone 하는 방법을 선호한다. 이 방법은 구현이 쉽고 안전하며, Commit 메시지를 확인할 수 있다는 장점이 있다. Jenkins에서 소스 코드를 Clone 해온 뒤, Docker를 이용하여 빌드하고 실행한다.
Jenkins에서 Docker를 실행하기 때문에 [공부정리] Jenkins의 Docker In Docker 문제 해결하기 게시글을 참고하여 Jenkins를 먼저 세팅하는 것을 추천한다.
Jenkins를 실행하고 기본 설정을 마친 후 파이프라인 생성 화면으로 이동하면 아래와 같은 화면이 나타난다.
해당 화면에서 Build Triggers -> Build periodically에서 Cron 표현식을 입력하면 된다.
Cron 표현식을 쉽게 생성하거나, 검증 하고 싶다면 [공부정리] Cron 표현식 생성 & 검증 방법 을 참고하길 바란다.
그리고 아래의 파이프라인 코드를 입력하면 된다.
pipeline {
agent any
environment {
IMAGE_NAME = "jeyongsong/webti_batch"
CONTAINER_NAME = "webti_batch"
BRANCH = "main"
EXECUTE_PROFILE = "dev"
SERVICE = "batch"
}
stages {
stage('Git Clone') {
steps {
git branch: env.BRANCH, url: 'https://github.com/team-meot-ppo/webti_backend.git'
withCredentials([GitUsernamePassword(credentialsId: 'submodule_security_token', gitToolName: 'Default')]) {
sh 'git submodule update --init --recursive'
}
}
}
stage('Display Directory Structure') {
steps {
sh 'ls -R'
}
}
stage('Docker Image Build') {
steps {
sh "docker build --build-arg SERVICE=${env.SERVICE} -t ${env.IMAGE_NAME}:latest ."
}
}
stage('Run Docker Container') {
steps {
sh "docker run -e PROFILE=${env.EXECUTE_PROFILE} ${env.IMAGE_NAME}:latest"
}
}
}
}
GitHub 서브 모듈을 사용하기 때문에 서브 모듈까지 포함하여 소스 코드를 clone 해오는 코드이다. 이후 Docker를 이용하여 Spring Batch를 빌드하고 실행한다.
참고로 나는 웹 개발자 성향 테스트 프로젝트 에서 매시 정각에 사용자들의 검사 결과를 통계 정보로 변환해주는 Batch를 실행하도록 설정하였다.
매시 정각에 batch가 잘 실행되는 모습이다.
또한 Changes에서는 github의 commit을 확인할 수 있다.
[공부정리] SCDF를 이용하여 Batch Job 결과 모니터링에서 아쉬웠다고 이야기한 것처럼, Spring Cloud Data Flow는 Batch 모니터링 도구로는 오버헤드가 크다고 생각하여 이번 프로젝트에서는 Jenkins를 사용하여 Batch 실행 및 모니터링을 하였다. Jenkins 하나로 Quartz와 Spring Cloud Data Flow를 대체할 수 있었기 때문에 구현이 쉬웠고 모니터링하기도 쉬웠다. Jenkins의 아쉬운 점은 Batch 작업의 실패는 Jenkins의 실행 로그에 직접 접근해야 볼 수 있다는 점이 있다.
다음에는 Spring Cloud Data Flow만을 이용하여 이러한 단점도 해결해보고 싶다. Batch 작업은 정말 재미있다고 생각한다. 내 적성에 맞을지도?