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

2026. 8. 2. 01:48·Project/척척학사

이 글은 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 등 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 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
'Project/척척학사' 카테고리의 다른 글
  • [척척학사] 트러블슈팅: 포털 연동 시 이수 구분 오류 & 재수강 중복 문제 해결
  • [척척학사] 🚨 PostgreSQL: duplicate key value violates unique constraint 에러 해결하기
  • [척척학사] 디스크 용량 부족으로 인한 JVM 실행 실패 해결기
  • [척척학사] 상반기 회고: 내가 척척학사에 합류한 이야기
pp8817
pp8817
공부한 내용, 개발 관련 지식, 트러블 슈팅 등을 기록합니다. 이전 블로그: https://velog.io/@pp8817/posts
  • pp8817
    끄적이는 개발 log
    pp8817
  • 전체
    오늘
    어제
    • 분류 전체보기 (273)
      • Project (71)
        • 척척학사 (29)
        • Book (23)
        • Saynow (3)
        • YAPP 27기 (4)
        • 나의 작은 프로젝트 (10)
        • Landit (2)
      • Backend (88)
        • Spring (13)
        • Spring MVC (13)
        • Spring Security (4)
        • JPA (26)
        • Database (19)
        • HTTP·Web (13)
        • Architecture (0)
      • Language·CS (59)
        • Java·Kotlin (5)
        • CS Interview (17)
        • Backend Interview (5)
        • Concepts (32)
      • Algorithm (25)
        • Algorithm (24)
        • 소마 알고리즘 스터디 (1)
      • Infra (8)
      • Troubleshooting (11)
      • Retrospective (6)
      • Etc (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Algorithm
    트러블슈팅
    Python
    interview
    Book
    개념 정리!
    Spring
    척척학사
    나의 작은 프로젝트
    http
    OS
    Spring MVC
    java
    게시판
    jpa
    CS Interview
    HTTP WEB 기본 지식
    object
    BOJ
    Project
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
pp8817
[척척학사] CI/CD 적용 과정 With GitHub Actions
상단으로

티스토리툴바