EC2_HOST
, EC2_USER
, EC2_KEY
, SERVER_PORT
등JWT_SECRET
, SPRING_PROFILES_ACTIVE
등 Spring application.yml
에서 참조되는 값들.env
혹은 env.sh
파일로 관리하는 것이 적합# ~/env.sh
export SPRING_PROFILES_ACTIVE=dev
export JWT_SECRET=abc123
...
⸻
❌ 실패 1: .env 파일을 source 했지만 환경변수 인식 실패
✅ 해결 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 &
'
🔍 이유
✅ 최종 성공 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 &
'
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
방식 고려 가능