퍼블릭 클라우드

Spring Boot 프로젝트를 GitHub Actions를 이용해 배포 자동화하는 방법-작성중

변군이글루 2025. 1. 9. 20:50
반응형

Spring Boot 프로젝트를 GitHub Actions를 이용해 배포 자동화하는 방법

GitHub Actions와 Gradle을 활용하여 Spring Boot 프로젝트를 AWS EC2 인스턴스에 자동으로 배포하는 방법입니다.

1. AWS EC2 서버 준비

EC2 인스턴스 생성 및 보안 그룹 설정

  • SSH(포트 22) 및 Spring Boot 애플리케이션 포트(예: 8080) 열기

필수 소프트웨어 설치

  • Java 설치
sudo mkdir -p /app
cd /usr/local/src
wget -q --show-progress https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz
tar -xf jdk-21_linux-x64_bin.tar.gz
sudo mv jdk-21.0.5 /app/
sudo ln -sfn /app/jdk-21.0.5 /app/java
sudo ln -sf /app/java/bin/java /usr/bin/java
cat << 'EOF' | sudo tee /etc/profile.d/java.sh > /dev/null
# Java 21 Environment Variables
export JAVA_HOME=/app/java
export PATH=$PATH:$JAVA_HOME/bin
EOF
source /etc/profile.d/java.sh

2. Github에서 Spring Boot 프로젝트

프로젝트 생성

프로젝트 이름 : springboot-deployment-example

Actions secrets and variables 설정

  • Settings > Secrets and variables > Actions

Secrets

  • GHub_Token
  • AWS_EC2_SSH_KEY

Variables

  • AWS_EC2_HOST
  • AWS_EC2_USER

3. 스프링 부트 프로젝트 생성

로컬 PC에서 작업 디렉토리 생성 및 이동

sudo mkdir -p ~/workspace
mv ~/workspace

웹 페이지에서 스프링 부트 프로젝트 생성

spring_initializr

mv ~/Downloads/springboot-deployment.zip ~/workspace/.
unzip springboot-deployment.zip
cd springboot-deployment
$ ls
HELP.md  build.gradle  gradle  gradlew  gradlew.bat  settings.gradle  src

4. AppController 작성

vim src/main/java/com/example/springboot_deployment/AppController.java
package com.example.springboot_deployment;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AppController {

    private static final String APP_VERSION = "1.2.2";
    private static final String GREETING_MESSAGE = "Hello, world!";

    @GetMapping("/")
    public String home() {
        return buildGreetingMessage();
    }

    private String buildGreetingMessage() {
        return String.format("%s #Ver %s", GREETING_MESSAGE, APP_VERSION);
    }
}

5. GitHub Actions 워크플로우 작성

sudo mkdir -p .github/workflows
vim .github/workflows/deploy.yml
name: Deploy Spring Boot to AWS EC2

on:
  push:
    branches:
      - main # main 브랜치에 푸시될 때 실행

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      # 1. SSH 접속 및 애플리케이션 배포
      - name: Deploy Spring Boot to AWS EC2
        uses: appleboy/ssh-action@v1.2.0
        with:
          host: ${{ vars.AWS_EC2_HOST }} # Variables
          username: ${{ vars.AWS_EC2_USER }} # Variables
          key: ${{ secrets.AWS_EC2_SSH_KEY }} # Secrets
          script_stop: true
          script: |
            set -e  # 에러 발생 시 스크립트 중단
            
            echo "########## 2. GitHub 저장소 복제"
            if [ ! -d "$HOME/springboot-deployment-example" ]; then
              echo "클론을 시작합니다."
              git clone https://${{ secrets.GHub_Token }}@github.com/anti1346/springboot-deployment-example.git ~/springboot-deployment-example
            fi

            echo "########## 3. 디렉토리로 이동"
            cd $HOME/springboot-deployment-example || { echo "디렉토리로 이동 실패!"; exit 1; }

            echo "########## 4.GitHub 저장소 최신화 작업(Pull)"
            git fetch --all
            git reset --hard origin/main

            echo "########## 5. gradlew 실행 권한 부여"
            chmod +x gradlew

            echo "########## 6. Gradle 빌드"
            ./gradlew clean build -x test

            echo "########## 7. 애플리케이션 중지"
            sudo fuser -k -n tcp 8080 > /dev/null || true

            echo "########## 8. Spring Boot 애플리케이션 시작"
            nohup java -jar build/libs/*-SNAPSHOT.jar > app.log 2>&1 &

            echo "########## 9. 애플리케이션 상태 확인"
            sleep 10
            if curl --silent --fail http://localhost:8080 > /dev/null; then
              echo "애플리케이션이 정상적으로 실행 중입니다."
            else
              echo "애플리케이션 시작 실패."
              exit 1
            fi
더보기

---

name: Deploy Spring Boot to AWS EC2

on:
  push:
    branches:
      - main # main 브랜치에 푸시될 때 실행

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      # 1. SSH 접속 및 애플리케이션 배포
      - name: Deploy Spring Boot to AWS EC2
        uses: appleboy/ssh-action@v1.2.0
        with:
          host: ${{ vars.AWS_EC2_HOST }} # Variables
          username: ${{ vars.AWS_EC2_USER }} # Variables
          key: ${{ secrets.AWS_EC2_SSH_KEY }} # Secrets
          script_stop: true
          script: |
            set -e  # 에러 발생 시 스크립트 중단

            echo "Navigating to project directory..."
            cd ~/springboot-deployment-example || { echo "Project directory not found!"; exit 1; }

            echo "Pulling latest changes from GitHub..."
            git fetch --all
            git reset --hard origin/main

            echo "Building project with Gradle..."
            chmod +x gradlew
            ./gradlew clean build -x test

            echo "Stopping any processes running on port 8080..."
            PID=$(sudo lsof -t -i:8080 || echo "")
            if [ -n "$PID" ]; then
              echo "Killing process with PID $PID"
              sudo kill -9 $PID
            else
              echo "No process running on port 8080."
            fi

            echo "Starting Spring Boot application in the background..."
            nohup java -jar build/libs/*-SNAPSHOT.jar > app.log 2>&1 &
            echo "Application started successfully."

---

6. 작성한 코드를 GitHub 저장소에 커밋

echo "# springboot-deployment-example" >> README.md
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/anti1346/springboot-deployment-example.git
git push -u origin main

7. Github에서 Actions 확인

GitHub_Actions
GitHub_Actions

 

728x90
반응형