안녕하세요. 그린주입니다 ๑'ٮ'๑
오늘도 힘차게 시작해보겠습니다!
개요
이번 글에서는 Jenkins를 Batch Scheduler로 활용하는 방법을 공유하고자 합니다.
참고로 Jenkins가 서버에 연결되어있고 batchProject가 있다는 가정하에 진행하겠습니다.
목차
Spring Batch와 Scheduler
Spring Batch Project 생성
Jenkins에 batchJob 생성
Jenkins scheduler 설정하기
Spring Batch와 Scheduler
Spring Batch(배치)와 Scheduler(스케줄러)를 혼동하는 사람들이 종종 있는데 이것은 완전히 다른 개념입니다.
배치는 실시간으로 처리를 하는 것이 아닌 일괄 처리를 뜻하며 보통은 특정 시간에 행해집니다. 이 특정 시간을 정의해 주는 것이 스케줄러의 역할입니다.
Spring Batch Project 생성
Jenkins Scheduler 하기 전에 Spring Batch에 간단한 scheduleJob을 생성하겠습니다.
build.gradle
implementation 'org.springframework.boot:spring-boot-starter-batch'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
runtimeOnly 'mysql:mysql-connector-java'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.batch:spring-batch-test'
application.yml
spring:
batch:
job:
names: ${job.name:NONE}
datasource:
url: jdbc:mysql:********
username: ********
password: ********
jpa:
hibernate:
ddl-auto: update
show_sql: true
format_sql: true
use_sql_comments: true
logging.level.org.springframework.batch: DEBUG
ScheduleJob.java
@Slf4j // log 사용을 위한 lombok 어노테이션
@RequiredArgsConstructor // 생성자 DI를 위한 lombok 어노테이션
@Configuration
public class ScheduleJob {
private final JobBuilderFactory jobBuilderFactory; // 생성자 DI 받음
private final StepBuilderFactory stepBuilderFactory; // 생성자 DI 받음
@Bean
public Job scheduleJob() {
return jobBuilderFactory.get("scheduleJob")
.start(scheduleStep())
.build();
}
@Bean
public Step scheduleStep() {
return stepBuilderFactory.get("scheduleStep")
.tasklet((contribution, chunkContext) -> {
log.info("######## This is scheduleStep");
return RepeatStatus.FINISHED;
})
.build();
}
}
실행시켜보면 정상적으로 실행되는 것을 볼 수 있습니다.
그럼 scheduleJob을 이용해 Jenkins Scheduler를 진행해보겠습니다.
Jenkins에 batchJob 생성
batchProject를 Jenkins Item으로 만들어줍니다.
Command에는 sh 파일을 실행시켜줍니다.
#####-batch.sh 코드는 다음과 같습니다.
vi /home/ec2-user/#####-batch.sh
#!/bin/bash
rm -rf /home/ec2-user/#####-batch/batch.jar
cp -r /var/lib/jenkins/workspace/#####-batch/build/libs/#####_batch-0.0.1-SNAPSHOT.jar /home/ec2-user/#####-batch/batch.jar
echo " >>>>>>>>>>>>> schedule Job Start >>>>>>>>>>>>>"
cd /home/ec2-user/#####-batch
java -jar batch.jar --job.name=scheduleJob
echo " >>>>>>>>>>>>> schedule Job End >>>>>>>>>>>>>"
echo "*******************************************************"
완성된 batchJob을 Build Now 해줍니다.
빌드 완료가 되면 아래와 같이 파란 등이 나옵니다. 넘버나 날짜를 클릭합니다.
Console Output로 batchProject의 콘솔을 확인합니다.
Jenkins로 잘 실행되는 것을 볼 수 있습니다.
Jenkins scheduler 설정하기
젠킨스의 스케줄러는 cron표현식을 사용합니다. batchJob을 1분마다 실행시켜 보겠습니다.
jenkins batJob > 구성 > 빌드 유발 > build periodically
이렇게 만들었다면 테스트로 5분 뒤에 결과를 보도록 하겠습니다.
8분이 지났다.. ㅋㅋㅋ 아래와 같이 잘 실행되는 걸 확인할 수 있습니다.
성공!!
마무리
이렇게 Jenkins를 Batch Scheduler로 활용하는 방법에 대해 적어보았습니다.
다들 성공하셨을까요?? 끝까지 파이팅입니다!
Jenkins를 Batch Scheduler로 활용한다면 Job을 각각 만들어 주는 것을 추천합니다.
왜냐하면 Job 마다 돌리는 시간이 다 다를 수 있기 때문입니다. Jenkins의 Job을 각각 다 만든다 하더라도 Job의 이름과 Build > Command에서 export JOB_ID 부분만 해당 Batch Job ID로 바꿔주면 되기 때문에 큰 어려움은 없을 것입니다.
긴 글 봐주셔서 감사합니다!
오늘도 행복한 하루 보내세요 ✿'◡'✿
참고
https://madplay.github.io/post/a-guide-to-cron-expression
https://oingdaddy.tistory.com/8
https://helloino.tistory.com/60
https://oingdaddy.tistory.com/38
https://pjsprogram.tistory.com/87
'🌜 Server > Jenkins' 카테고리의 다른 글
sudo: no tty present and no askpass program specified ( Jenkins / Linux ) (0) | 2022.07.18 |
---|---|
AWS EC2(Amazon Linux 2)에 Jenkins 설치하기 ( AWS / EC2 / Linux / Jenkins ) _220713_업데이트 (4) | 2022.07.13 |