코드 작성 → Git Push → 자동 빌드 → 자동 테스트 → 배포 → 모니터링
↓ ↓ ↓ ↓ ↓
개발자 CI 서버 테스트 통과 EC2 서버 로그/알림
로컬에서 소스코드 수정 -> Github main 브랜치에 push
Jenkins가 Poll SCM으로 감지 / Github Actions가 이벤트 감지
Gitbhub Actions에서 빌드 후 JAR + 스크립트 EC2로 전송
start.sh 실행 -> 이전 버전 종료 + 새 버전 실행
브라우저에서 EC2 Public IP:8080 접근!
-> 도커로 컨테이너를 띄우고, 인스턴스 생성까지 다시 해보았다.

Spring Boot 기본 포트는 8080이므로
EC2 인바운드 규칙에 TCP 8080, 소스 0.0.0.0/0을 혀용해야 브라우저로 접근할 수 있다.


CI/CD에서 배포 자동 실행 시점이 어떻게 결정되는지는 굉장히 중요한 개념이다.
내가 직접 겪으면서 이해한 것들을 요약해본다.
H/2 * * * *
- cron 스케줄
- 2분마다 Github repo의 상태를 확인한다.
+ Jenkins에서 H/2의 의미 :
H는 Jenkins가 job을 여러개 균등으로 분배하기 위해 사용하는 해시기반 랜덤시드!
/2는 2분마다 실행
-> Jenkins가 정한 특정 2분 간격
- 변경 사항이 있으면 build, 없으면 그냥 종료!
- githib Webhook 설정 없이도 동작하지만 딜레이가 생기고 서버가 Github에 접속해야하므로 트래픽이 낭비된다...
Github이 먼저 "변경됐어~! 실행해라!" 라고 알려주는 방식!
- 즉각 실행되고 Github 서버가 직접 이벤트를 발송하여 안정적이고 polling이 불필요하여 트래픽 낭비가 없다.
- 단순한 설정
on:
push:
branches: [ "main" ]
-> main에 푸시되자마자 자동 빌드 + 배포
-> Actions에서 한 실제 작업 흐름
1. 코드 checkout
2. JDK 21 환경 구성
3. Gradle 빌드
4. start.sh를 EC2로 업로드
5. JAR 업로드
6. SSH 접속해서 start.sh 실행 -> 배포
nohup: failed to run command '/usr/bin/java': No such file or directory
sudo dnf install java-21-amazon-corretto.x86_64 -y
java -version
start.sh = EC2에서 돌아가는 애플리케이션을 종료하고 새 버전으로 다시 실행하는 스크립트.
여기서 처음에 jar 이름이 잘못되어... 수정해주었다.
pkill -f bitcoinlion-0.0.1-SNAPSHOT.jar || echo "No app running" #이전 버전 종료
sleep 15 #안전하게 종료 대기
nohup /usr/bin/java -jar /home/ec2-user/bitcoinlion-0.0.1-SNAPSHOT.jar > /home/ec2-user/app.log 2>&1 & #새 버전 실행 + 백그라운드 실행, /home/ec2-user/app.log 기록
-> 깃 푸시 -> Jenkins 자동 빌드 -> EC2 성공 실행
