[척척학사] CI/CD 적용 과정 With GitHub Actions

박상민·2025년 8월 2일
0

척척학사

목록 보기
13/15
post-thumbnail

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 등 Spring application.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 Pushdev 브랜치에 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 추가 시 디버깅 쉬움

0개의 댓글