프레임워크/Spring

[Spring Boot] Github Actions를 사용한 GCP 배포 가이드

munsik22 2026. 5. 6. 18:03

목표

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

사전 준비

  • GCP Computer Engine (VM) 인스턴스 생성

[머신 구성] asia-northeast3 리전 및 E2 인스턴스 선택
[OS 및 스토리지] Ubuntu 22.04 LTS로 변경
[데이터 보호] 백업 없음 선택
[네트워킹] HTTP 및 HTTPS 트래픽 허용
[모니터링 가능성] 운영 에이전트 설치 선택 해제
[보안] 모든 Cloud API에 대한 전체 액세스 허용

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

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

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

  • 방화벽 규칙 생성

네트워크의 모든 인스턴스, 0.0.0.0/0, TCP 포트 8080 설정

  • 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 에 접속해 서버가 정상적으로 업데이트되었는지 확인