[공부정리] Jenkins를 이용한 Spring Batch 실행

jeyong·2024년 7월 17일
0

공부 / 생각 정리  

목록 보기
101/120
post-custom-banner


이번 게시글에서는 웹 개발자 성향 테스트프로젝트에서 진행했던, Jenkins를 이용한 Spring Batch 실행 방법에 대해 설명하고자 한다.

1. 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;
    }
spring:
  profiles:
    default: local

  batch:
    job:
      name: statisticJobNew
      enabled: true

application.yml 파일에 자신이 등록한 job의 이름을 설정한다. 이렇게 하면 Spring Batch를 빌드하여 실행할 때 자동으로 Batch가 실행된다.

이제 jenkins로 해당 batch를 실행하면 끝이다.

2. Jenkins 설정

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을 확인할 수 있다.

3. 느낀점

[공부정리] SCDF를 이용하여 Batch Job 결과 모니터링에서 아쉬웠다고 이야기한 것처럼, Spring Cloud Data Flow는 Batch 모니터링 도구로는 오버헤드가 크다고 생각하여 이번 프로젝트에서는 Jenkins를 사용하여 Batch 실행 및 모니터링을 하였다. Jenkins 하나로 Quartz와 Spring Cloud Data Flow를 대체할 수 있었기 때문에 구현이 쉬웠고 모니터링하기도 쉬웠다. Jenkins의 아쉬운 점은 Batch 작업의 실패는 Jenkins의 실행 로그에 직접 접근해야 볼 수 있다는 점이 있다.

다음에는 Spring Cloud Data Flow만을 이용하여 이러한 단점도 해결해보고 싶다. Batch 작업은 정말 재미있다고 생각한다. 내 적성에 맞을지도?

profile
노를 젓다 보면 언젠가는 물이 들어오겠지.
post-custom-banner

0개의 댓글