퍼블릭 클라우드
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
웹 페이지에서 스프링 부트 프로젝트 생성
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 확인
728x90
반응형