목표
- GCP(Google Cloud Platform)에서 Computer Engine (VM) 인스턴스를 생성한다.
- Docker를 사용하지 않고 Spring Boot 프로젝트를 GCP VM에 직접 배포하는 GitHub Actions CD 파이프라인을 구축한다.
사전 준비
- GCP Computer Engine (VM) 인스턴스 생성






- SSH 키 생성하기
ssh-keygen -t rsa -f ./.ssh/KEY_NAME -C USERNAME -b 2048

- 생성한 SSH 키(pub 파일)를 CE에 등록한다.

- SSH 키 접속 테스트
ssh -i ./.ssh/KEY_NAME USERNAME@외부IP주소

- 방화벽 규칙 생성

- GCP VM에 SSH로 접속하여 프로젝트와 동일한 버전의 Java(JDK)를 설치한다.
sudo apt update
sudo apt install openjdk-17-jdk -y
- jar 파일을 저장하고 실행할 폴더(배포 디렉토리)를 만든다.
mkdir -p ~/app/deploy
- Github Actions 용 SSH 키를 따로 생성한다.
ssh-keygen -t rsa -f ./.ssh/deploy_key -m PEM -C "github-actions" -b 4096
- CE 메타데이터에 deploy_key.pub을 등록한다.

Github Repository Secrets 설정
Github 레포지토리의 Settings > Secrets and variables > Actions 메뉴로 이동하여 New repository secret을 클릭하고 다음 값들을 추가한다.
- GCP_HOST: GCP VM의 외부 IP 주소
- GCP_USERNAME: SSH 접속 계정명 (위에서 "github-actions"라고 설정했음)
- GCP_SSH_KEY: 앞서 생성한 deploy_key (개인키) 파일의 전체 내용

Github Actions workflow 작성
- .github/workflows/deploy.yml 생성
name: Spring Boot CD Pipeline to GCP
on:
push:
branches: [ "main" ] # main 브랜치에 push 될 때 실행
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
# 1. 코드 체크아웃
- name: Checkout Source Code
uses: actions/checkout@v6
# 2. JDK 환경 설정
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'corretto'
# 3. Gradle 실행 권한 부여
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# 4. Spring Boot 프로젝트 빌드 (테스트 제외)
- name: Build with Gradle
run: ./gradlew clean build -x test
# 5. 빌드된 jar 파일을 GCP VM으로 전달 (SCP)
- name: Copy jar file to GCP VM
uses: appleboy/scp-action@master
with:
host: ${{ secrets.GCP_HOST }}
username: ${{ secrets.GCP_USERNAME }}
key: ${{ secrets.GCP_SSH_KEY }}
source: "build/libs/*SNAPSHOT.jar" # 빌드된 jar 파일 경로
target: "~/app/deploy"
strip_components: 2 # build/libs/ 폴더 구조를 제외하고 파일만 전송
# 6. GCP VM에 SSH 접속하여 배포 스크립트 실행
- name: Deploy to GCP VM
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.GCP_HOST }}
username: ${{ secrets.GCP_USERNAME }}
key: ${{ secrets.GCP_SSH_KEY }}
script: |
cd ~/app/deploy
CURRENT_PID=$(pgrep -f "[j]ava.*SNAPSHOT.jar")
if [ -z "$CURRENT_PID" ]; then
echo "현재 실행 중인 애플리케이션이 없습니다."
else
echo "실행 중인 애플리케이션을 종료합니다. (PID: $CURRENT_PID)"
kill -15 $CURRENT_PID
sleep 10
fi
JAR_NAME=$(ls -tr *.jar | tail -n 1)
echo "배포할 JAR 파일명: $JAR_NAME"
nohup java -jar $JAR_NAME > app.log 2>&1 </dev/null &
echo "배포가 완료되었습니다."
파이프라인 테스트 및 확인
- main 브랜치에 merge 이후 Actions 탭에서 워크플로우가 잘 동작하는지 확인

- http://[GCP_HOST]:8080 에 접속해 서버가 정상적으로 업데이트되었는지 확인


'프레임워크 > Spring' 카테고리의 다른 글
| [Spring Boot] Github Actions CI Workflow 파일 (0) | 2026.05.12 |
|---|---|
| [Spring Boot] Spring CRUD 구현 - Day 5 : 댓글 기능 구현 (0) | 2026.03.16 |
| [Spring Boot] Spring CRUD 구현 - Day 4 : Spring Security + JWT (0) | 2026.03.13 |
| [Spring Boot] Spring CRUD 구현 - Day 3 (0) | 2026.03.12 |
| [Spring Boot] Spring CRUD 구현 - Day 2 (0) | 2026.03.11 |