이 글은 Velog에서 이전한 글입니다. Velog 원문 보기
Github Actions로 EC2에 Spring Boot CI/CD 적용기 정리
✅ 목적
- GitHub Actions를 활용해 EC2 서버에 Spring Boot 애플리케이션을 자동 배포
- 환경 변수, SSH 배포, JAR 빌드, Secrets 관리 등 실무에서 마주치는 이슈 해결 기록
✅ 환경 변수 관리 전략
1. GitHub Actions에서 사용하는 변수 (EC2 접속 정보 등)
EC2_HOST,EC2_USER,EC2_KEY,SERVER_PORT등- GitHub Repository > Settings > Secrets and variables > Actions 에서 관리
2. EC2 내부에서 Spring Boot 앱 실행에 필요한 변수
JWT_SECRET,SPRING_PROFILES_ACTIVE등 Springapplication.yml에서 참조되는 값들- EC2 내부에
.env혹은env.sh파일로 관리하는 것이 적합
✅ 환경 변수 선언 예시 (EC2)
# ~/env.sh
export SPRING_PROFILES_ACTIVE=dev
export JWT_SECRET=abc123
...
⸻
실패 사례와 해결 과정
❌ 실패 1: .env 파일을 source 했지만 환경변수 인식 실패
- .env는 export 없이 선언된 값들이라 source만 해도 Java 프로세스에서 인식 안 됨
- set -a로 export 설정해도, GitHub Actions 내 SSH 세션에서는 적용되지 않음
✅ 해결 1: env.sh 파일 사용 + bash -c로 한 세션에서 실행
script: |
bash -c '
source /home/ubuntu/env.sh
cd /home/ubuntu/app
nohup java -jar app.jar --spring.profiles.active=$SPRING_PROFILES_ACTIVE > app.log 2>&1 &
'
🔍 이유
- bash -c 내부에서 source → cd → java까지 한 번에 실행해야 환경 변수 적용됨
✅ 최종 성공 YAML
name: Deploy to Dev EC2
on:
push:
branches: [ "dev" ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Grant execute permission for Gradle
run: chmod +x ./gradlew
- name: Build jar with Gradle
run: ./gradlew clean bootJar
- name: Rename jar to app.jar
run: |
mkdir -p deploy
cp build/libs/*.jar deploy/app.jar
- name: Copy app.jar to EC2
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_KEY }}
source: "deploy/app.jar"
target: "/home/ubuntu/app"
strip_components: 1
- name: Restart Spring Boot app on EC2
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_KEY }}
script: |
bash -c '
source /home/ubuntu/env.sh
echo "SPRING_PROFILES_ACTIVE=$SPRING_PROFILES_ACTIVE"
cd /home/ubuntu/app
nohup java -jar app.jar --spring.profiles.active=$SPRING_PROFILES_ACTIVE > app.log 2>&1 &
'
전체 CI/CD 흐름
Spring Boot 애플리케이션을 GitHub Actions와 EC2를 통해 자동 배포하는 전체 흐름
[1] GitHub Push 발생 (dev 브랜치) # main 브랜치 추가 예정
↓
[2] GitHub Actions 트리거
↓
[3] Gradle로 .jar 파일 빌드
↓
[4] app.jar를 EC2 서버로 전송 (SCP)
↓
[5] EC2에서 기존 실행 중인 앱 종료 (선택 - 무중단 배포 적용 예정)
↓
[6] env.sh 파일 로딩 후 app.jar 실행
↓
[7] Spring Boot 애플리케이션 정상 기동
🔄 흐름별 세부 설명
| 단계 | 설명 |
|---|---|
| 1. GitHub Push | dev 브랜치에 push되면 on: push 이벤트로 GitHub Actions가 실행됨 |
| 2. Actions 시작 | runs-on: ubuntu-latest 환경에서 실행 |
| 3. Gradle 빌드 | ./gradlew clean bootJar로 Spring Boot JAR 파일 생성 |
| 4. EC2 전송 | appleboy/scp-action을 통해 EC2의 /home/ubuntu/app/ 경로로 app.jar 전송 |
| 5. 앱 재시작 | 기존 앱 프로세스를 종료하고, 새로운 JAR 실행 (nohup) |
| 6. env.sh 로드 | EC2 내부에 있는 env.sh의 환경 변수를 로딩 (export 필수) |
| 7. 서비스 기동 확인 | 로그(app.log)로 기동 상태 확인 가능 |
🔧무중단 배포 고려 사항
- 현재 방식은
기존 프로세스 종료 → 새로 실행구조로 무중단은 아님 systemd,Nginx + 포트 스위칭,Docker + Blue/Green방식 고려 가능
✅ 핵심 정리
- GitHub Secrets: EC2 접근용 정보는 GitHub에 저장
- env.sh 방식: 환경 변수는 EC2에 미리 export 형태로 저장하고 source
- bash -c 사용: source → 실행까지 한 쉘 세션 안에서 처리해야 적용됨
- 실행 로그: tail app.log 추가 시 디버깅 쉬움
'Project > 척척학사' 카테고리의 다른 글
| [척척학사] 트러블슈팅: 포털 연동 시 이수 구분 오류 & 재수강 중복 문제 해결 (0) | 2026.08.02 |
|---|---|
| [척척학사] 🚨 PostgreSQL: duplicate key value violates unique constraint 에러 해결하기 (0) | 2026.08.02 |
| [척척학사] 디스크 용량 부족으로 인한 JVM 실행 실패 해결기 (0) | 2026.08.02 |
| [척척학사] 상반기 회고: 내가 척척학사에 합류한 이야기 (0) | 2026.08.02 |
| [척척학사] 복수전공생도 쓸 수 있게 만들기 (0) | 2026.08.01 |