Linux crontab๊ณผ ๊ฐ์ scheduler๋ฅผ Spring-boot์์ ๋ค๋ค๋ณด์.
๋ณธ ๋ฌธ์์์๋ ๋ค์๊ณผ ๊ฐ์ job scheduler๋ฅผ ๋ค๋ฃฐ ๊ฒ์ด๋ค.
์ต์ข ์ ์ผ๋ก Jenkins Scheduler๋ฅผ ์ด์ฉํด Spring-batch๋ฅผ ํธ๋ค๋ง ํ ๊ฒ์ด๋ค.
Spring-boot ์์ฒด์ ์ผ๋ก ์ง์ํ๋ Scheduler๋ก @EnableScheduling, @Scheduled
๋ง์ผ๋ก ๊ฐ๋จํ๊ฒ ๊ตฌํ ๊ฐ๋ฅํ๋ค.
๊ฐ๋จํ Job Scheduling์ ํ ๋ ์ฌ์ฉํ๋ฉด ์ข๋ค.
Spring-boot ์ง์
์ ์ @EnableScheduling
์ ์ ์ธํ๋ค.
DemoApplication.java
@EnableScheduling
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
์ฃผ๊ธฐ์ ์ผ๋ก ์คํ๋ Job์ ๊ตฌํํ๋ค.
SpringFrameworkScheduler.java
@Component
public class SpringFrameworkScheduler {
@Scheduled(fixedDelay = 1000)
public void printJob() {
System.out.println(new Date());
}
}
@Scheduled(fixedDelay = 1000)
fixedDelay
์ธ์๋ fixedRate, initialDelay, cron
๋ฑ ๋ค์ํ ์ต์
์ ์ฌ์ฉํ ์ ์๋ค.cron
์ ์ต์
์ด๋ค.(cron = "์ด ๋ถ ์ ์ผ ์ ์์ผ")
*
: all?
: nonem
: arraya-b
: a๋ถํฐ b๊น์งa/b
: a๋ถํฐ b๋ง๋ค. a, a+b, a+b+b, ..../gradlew build -x test
java -jar ./build/libs/*.jar
1000ms์ฃผ๊ธฐ๋ก ์ถ๋ ฅ์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์๋ฐ๋ก ๊ฐ๋ฐ๋ ์คํ์์ค Job Scheduling ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ณด๋ค ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Clustering๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์ฌ๋ฌ ํ๋ฌ๊ทธ์ธ์ ์ ๊ณตํ๋ค.
๋ค๋ง ์๋ฒฝํ Cluster๊ฐ ๋ก๋ ๋ถ์ฐ์ ์๋๋ค.
Quartz์์๋ Job์ ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ฝ์ง์๋ค.
์ ๋ฐ์ ์ธ scheduler๊ด๋ฆฌ๋ฅผ ์ํด ๊ด๋ฆฌ UI๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ผ ํ๋ค๋ฉด ๊ทธ๊ฒ๋ํ ํฐ ๊ณต์๊ฐ ๋ค์ด๊ฐ ๊ฒ์ด๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ํํ ์๊ณ ์๋ CI Tool, Jenkins๋ฅผ ์ ๊ทน ์ด์ฉํ ๊ฒ์ด๋ค.
Job
execute
์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.execute
๋ฉ์๋์ ๊ตฌํํ๋ฉด ๋๋ค.JobDataMap
JobDetail
Trigger
SimpleTrigger, CronTrigger
๋ก ์ง์ ํ ์ ์๋ค.Misfire Instructions
Listener
JobListener
TriggerListener
JobStore
RAMJobStore
๋ JDBCJobStore
๋ฐฉ์์ผ๋ก ์ ์ฅ ๊ฐ๋ฅํ๋ค.Jenkins๋ฅผ ํตํด ๋ฐฐ์น๋ฅผ ์คํํ ์ ์๋ค.
๋ง์ผ ์ด๋ฏธ Jenkins๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ๋ฐฐ์น Jenkins์ ๋ฐฐํฌ Jenkins๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
docker-compose.yaml
vim docker-compose.yaml
version: '2'
networks:
ci:
services:
jenkins:
container_name: jenkins
image: jenkins/jenkins
# ์ํ๋ ๊ฒฝ๋ก์ volume ๋ง์ดํธ
volumes:
- ~/jenkins/:/var/jenkins_home
networks:
- ci
docker-comopse up -d
# ํ์ธ
docker ps
docker logs -f jenkins
Jenkins๋ฅผ ์ฌ๋ฆฐ ์๋ฒ์ 8080ํฌํธ๋ฅผ ๋ค์ด๊ฐ์ Password๋ฅผ ์
๋ ฅํด์ผํ๋ค.
์ด๊ธฐ ํจ์ค์๋๋ ๋ค์ ๊ฒฝ๋ก์์ ํ์ธ ๊ฐ๋ฅํ๋ค.
# 1. docker log
docker logs -f jenkins
# 2. read password file
cat /var/jenkins_home/secrets/initialAdminPassword
ํจ์ค์๋๋ฅผ ์ ๋ ฅํ๊ณ ํ๋ฌ๊ทธ์ธ๋ค์ ๋ค์ด๋ฐ๊ณ ๋ค์๋จ๊ณ์์ ๊ณ์ ์ ์์ฑํ๋ฉด Jenkins ์ด๊ธฐ์ ํ ์ด ์๋ฃ๋๋ค.
ํฅํ Jenkins์์ ์ํ๋ ํ๋ฌ๊ทธ์ธ์ ๋ชจ๋ ๋ฐ์ ์ ์๋ค.
jar
fileJenkins๊ฐ ๊ตฌ๋๋๋ ์๋ฒ์ Spring-boot jar
ํ์ผ์ ์ฎ๊ธฐ๋ ์์
์ด๋ค.
Jenkins๋ ํด๋น jar
ํ์ผ์ ์ค์ ๋ ์ฃผ๊ธฐ๋ก ์คํ์์ผ์ฃผ๋ ์ญํ ์ ํ ๊ฒ์ด๋ค.
์๋๋ spring batch์ jar
ํ์ผ์ ๋ค๋ฃฌ๋ค.
๋ชจ๋ ์์ค๋ ํ์ด์ง ํ๋จ ๋งํฌ์ ์๋ค.
Spring-boot ํ๊ฒฝ์ ์๋ฒ์์ jar๋ฅผ ๋ง๋ ํ Jenkins์๋ฒ์ jarํ์ผ์ ์ฎ๊ธด๋ค.
##### Spring-boot Server #####
# ๋ค์์ ํตํด Spring batch๋ฅผ jar๋ก ๋ง๋ ๋ค.
./gradlew build
# Jenkins ์๋ฒ์ jarํ์ผ์ ๋ณต์ ํ๋ค.
scp ./build/libs/*.jar $USER@$JENKINS_SERVER:~
##### Jenkins Server #####
# Jarํ์ผ ์คํ
java -jar ~/*.jar
Jenkins์๋ฒ์์ jar
๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.
simpleStep1
์ด ์คํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด ์์ ์ Jenkins Scheduler๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํ์์ผ์ค ๊ฒ์ด๋ค!
์ด์ ์์์ ๋ง๋ jar
๋ฅผ Jenkins์์ ์ค์ผ์ค๋งํ์.
item์ ๋ง๋ค๋ฉด workspace๊ฐ ์์ฑ๋๋ค.
์๋ก์ด workspace์ jar
๋ฅผ ์ฎ๊ธฐ๊ธฐ ์ํ ์์
์ด๋ค.
์ ์ฅ์ ํ ํ, Build Now
๋ฅผ ํตํด ๋น๋๋ฅผ ํด์ค๋ค.
์๋๋ฅผ ๋ฐ๋ผ ๋ค์ด๊ฐ๋ฉด ๋ก๊ทธ๋ฅผ ๋ณผ ์ ์๋ค.
Build History
> #number
> Console Output
๋ก๊ทธ๋ฅผ ๋ณด์.
$PWD
๊ฐ jenkins agent์ Workspace์ธ๊ฒ์ ์ ์ ์๋ค.
์ค์ jenkins container๋ volume mount๊ฒฝ๋ก๋ฅผ ๋ณด๋ฉด ํ์ธํ ์ ์๋ค.
ํด๋น ๊ฒฝ๋ก์ jar
ํ์ผ์ ์ฎ๊ธด๋ค.
์ด์ jar
ํ์ผ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํ์์ผ์ฃผ๋ฉด ๋์ด๋ค.
๊ตฌ์ฑ
์ ๋๋ฌ ๋ฐฉ๊ธ ์์ฑํ item๋ฅผ ์์ ํ๋ค.
์ฃผ๊ธฐ๋ฅผ ์ ํด์ค๋ค. (ex. 1๋ถ๋ง๋ค)
์ ์คํฌ๋ฆฝํธ์ ๋ค์์ ์ถ๊ฐํด์ค๋ค.
java -jar demo-0.0.1-SNAPSHOT.jar
์ด์ Jenkins๊ฐ 1๋ถ๋ง๋ค ๋น๋๋ฅผ ํ๋๊ฒ์ ๋ณผ ์ ์๋ค.
๋ก๊ทธ๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ด์ Spring batch๋ฅผ Jenkins Scheduler๋ก ํธ๋ค๋งํ๋ ์์ ์ ํ ์ ์๊ฒ ๋์๋ค.
๋ชจ๋ ์์ค๋ ๊นํ๋ธ์ ์ฌ๋ ค๋์๋ค.