GCP로 이사가기 (2. Github Actions 자동 배포)

크리링·2025년 2월 1일
0

실무 트러블 슈팅

목록 보기
8/10
post-thumbnail

본인은 새로운 프로젝트를 진행중에 있다.
빨리 배포하고, 수정하고, 개선하여서 반영해줘야 다른 직무의 사람들도 나쁜 영향을 덜 받는다.
그래서 1편에 VM과 SQL을 올렸으니 바로 Github Actions 자동 배포를 붙여보자.






배경

본인은 자동 배포 툴을 여러개 사용해봤다.
Travis CI, AWS CodeBuild - Pipeline, Jenkins 등을 사용해봤다. 근데
모두 공통점은 EC2 서버에 배포하였고, 그렇기에 부득이하게 S3와 CodeDeploy를 사용했다.
하지만 이번에는 GCP의 Compute Engine에 배포하는거니 다를거라고 예상하고 시작해보자.

이번 자동 배포 툴은 Github Actions로 정했다.
이유는 세가지다.

  1. 배포를 위한 서버를 올릴 필요가 없다. (Jenkins 패)
  2. 코드 관리와 동시에 배포 정상 동작 확인을 한 플랫폼(Github) 에서 할 수 있다.(AWS패)
  3. 계산했을때 우리가 사용하는 정도면 무료로 사용 가능하다. (Travis CI 패)

이렇게 Github Actions로 정했다!!!



Github Actions와 GCP 자동 배포

기존

...
	  # 5. SSH를 통해 배포 스크립트 실행
	    - name: Run deployment scripts on GCP Compute Engine
	      uses: appleboy/ssh-action@v0.1.3
	      with:
	        host: ${{ secrets.GCP_RELEASE_INSTANCE_IP }}
	        username: ${{ secrets.GCP_RELEASE_SSH_USER }}
	        key: ${{ secrets.GCP_RELEASE_SSH_PRIVATE_KEY }}
	        port: 22
	        script: |
	          # 권한 부여
	          chmod +x /home/ubuntu/smile-server/scripts/*.sh
	          # stop.sh 실행
	          /home/ubuntu/smile-server/scripts/stop.sh
	          # start.sh 실행
	          /home/ubuntu/smile-server/scripts/start.sh
              
	  # 6. SSH를 통해 배포 스크립트 실행
      - name: Run deployment scripts on GCP Compute Engine
        uses: appleboy/ssh-action@v0.1.3
        with:
          host: ${{ secrets.GCP_RELEASE_INSTANCE_IP }}
          username: ${{ secrets.GCP_RELEASE_SSH_USER }}
          key: ${{ secrets.GCP_RELEASE_SSH_PRIVATE_KEY }}
          port: 22
          script: |
            # 권한 부여
            chmod +x /home/ubuntu/smile-server/scripts/*.sh
            # stop.sh 실행
            /home/ubuntu/smile-server/scripts/stop.sh
            # start.sh 실행
            /home/ubuntu/smile-server/scripts/start.sh
...

AWS의 CodeDeploy는 직접 jar 파일을 올리는게 불가능해서 어쩔 수 없이 S3를 파일에 옮기고 CodeDeploy에서 S3의 파일을 가져다가 파일을 실행시킨다.
GCP에서는 이런 과정이 없고, appleboy라는 라이브러리를 통해서 http 전송 방법이 아닌 scp를 사용해서 파일을 업로드한는 방식을 사용한다.

그리고 이후 CodeDeploy에서 동작했던 스크립트가 잘 동작할 수 있게 SSH를 통해서 배포 스크립트를 실행하는 것도 하나의 과정에 추가해준다.

스크립트 수정

name: Build and Deploy for miri_mart release server to AWS EC2

on:
  push:
    branches: [ release ]

jobs:
  deploy:
    name: Deploy to GCP
    runs-on: ubuntu-latest

    steps:
      # 1. Repository 체크아웃
      - name: Checkout code
        uses: actions/checkout@v3

      # 2. Java 환경 설정
      - name: Set up JDK
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      # 3. Gradle 빌드
      - name: Build project with Gradle
        run: ./gradlew clean build -x test

      # 4. Google Cloud SDK 설치
      - name: Set up Google Cloud SDK
        uses: google-github-actions/setup-gcloud@v1
        with:
          version: 'latest'
          service_account_key: ${{ secrets.GCP_RELEASE_SERVICE_ACCOUNT_KEY }}
          project_id: your-gcp-project-id

      # 5. SCP를 통해 빌드 결과물 및 스크립트 업로드
      - name: Deploy files to GCP Compute Engine
        uses: appleboy/scp-action@v0.1.3
        with:
          host: ${{ secrets.GCP_RELEASE_INSTANCE_IP }}
          username: ${{ secrets.GCP_RELEASE_SSH_USER }}
          key: ${{ secrets.GCP_RELEASE_SSH_PRIVATE_KEY }}
          source: |
            ./build/libs/*.jar
            ./scripts/
#            ./appspec.yml // 제거 (CodeDeploy의 유산)
          target: /home/ubuntu/smile-server
          rm: true

      # 6. SSH를 통해 배포 스크립트 실행
      - name: Run deployment scripts on GCP Compute Engine
        uses: appleboy/ssh-action@v0.1.3
        with:
          host: ${{ secrets.GCP_RELEASE_INSTANCE_IP }}
          username: ${{ secrets.GCP_RELEASE_SSH_USER }}
          key: ${{ secrets.GCP_RELEASE_SSH_PRIVATE_KEY }}
          port: 22
          script: |
            # 권한 부여
            chmod +x /home/ubuntu/smile-server/scripts/*.sh
            # stop.sh 실행
            /home/ubuntu/smile-server/scripts/stop.sh
            # start.sh 실행
            /home/ubuntu/smile-server/scripts/start.sh

actions 동작 확인

tar 압축 시에 해당 항목이 비는 문제

# 5. SCP를 통해 빌드 결과물 및 스크립트 업로드
      - name: Deploy files to GCP Compute Engine
        uses: appleboy/scp-action@v0.1.3
        with:
          host: ${{ secrets.GCP_RELEASE_INSTANCE_IP }}
          username: ${{ secrets.GCP_RELEASE_SSH_USER }}
          key: ${{ secrets.GCP_RELEASE_SSH_PRIVATE_KEY }}
          source: |
            ./build/libs/*.jar
            ./scripts/
            ./appspec.yml
          target: /home/ubuntu/smile-server
          rm: true

tar 압축을 하면 계속 생기는 문제
-> 분리

# 5. SCP를 통해 빌드 결과물 및 스크립트 업로드
- name: Upload JAR file
  uses: appleboy/scp-action@v0.1.3
  with:
    host: ${{ secrets.GCP_RELEASE_INSTANCE_IP }}
    username: ${{ secrets.GCP_RELEASE_SSH_USER }}
    key: ${{ secrets.GCP_RELEASE_SSH_PRIVATE_KEY }}
    source: ./build/libs/*-SNAPSHOT.jar
    target: /home/${{ secrets.GCP_RELEASE_SSH_USER }}/smile-server/jar
    overwrite: true
    rm: true

- name: Upload scripts
  uses: appleboy/scp-action@v0.1.3
  with:
    host: ${{ secrets.GCP_RELEASE_INSTANCE_IP }}
    username: ${{ secrets.GCP_RELEASE_SSH_USER }}
    key: ${{ secrets.GCP_RELEASE_SSH_PRIVATE_KEY }}
    source: ./scripts/
    target: /home/${{ secrets.GCP_RELEASE_SSH_USER }}/smile-server/scripts
    overwrite: true
    rm: true

key found error -> ssh key 수정

ssh 키에
-----BEGIN OPENSSH PRIVATE KEY-----
-----END OPENSSH PRIVATE KEY-----
까지 포함 시킴

확인하니
appspec.yml은 전송이 성공했지만
scripts와 jar파일은 어딘지 없음

overwrite : true
rm : true

제거

동일 오류

서버 확인

스크립트 경로 scripts/scripts 확인

Upload Scripts에서
target

target: /home/${{ secrets.GCP_RELEASE_SSH_USER }}/smile-server

으로 변경

초록불!

하지만 8080 실행되지 않고 있음
error 로그 확인 결과

jar 위치 변경된거 적용 안됨
start.sh script 수정

server.log 확인 결과

프로필별 application.yml이 제대로 빌드시에 동작 안함

# 2. Java 환경 설정
- name: Set up JDK
  uses: actions/setup-java@v3
  with:
    java-version: '17'
    distribution: 'temurin'

- name: Make main application.yml
  run: |
    mkdir -p ./src/main/resources-env/main
    touch ./src/main/resources-env/main/application.yml
    echo "${{ secrets.RELEASE_APPLICATION }}" > ./src/main/resources-env/release/application.yml
    cat ./src/main/resources-env/main/application.yml

- name: Grant execute permission for gradlew
  run: chmod +x gradlew

# 3. Gradle 빌드
- name: Build project with Gradle
  run: ./gradlew clean build -x test -Pprofile=release

빌드 전 github actions의 application.yml 불러오기 추가

connection timed out

GCP SQL 네트워크 추가

완료!




+++ ps
시간 설정

시간 변경

timedatectl list-timezones | grep Seoul	  # 시간 확인
sudo timedatectl set-timezone Asia/Seoul






추가적으로 기록하지는 못했지만 DNS 옮기는데 시간이 40분 정도 소요됐다.
그래서 전체를 옮기는데 약 50분 정도 소요됐다. 두명의 인원으로 진행했고,
진행전에 DB와 EC2 환경을 만들어 놓은 상태에서 해서 수월했다.

0개의 댓글