본인은 새로운 프로젝트를 진행중에 있다.
빨리 배포하고, 수정하고, 개선하여서 반영해줘야 다른 직무의 사람들도 나쁜 영향을 덜 받는다.
그래서 1편에 VM과 SQL을 올렸으니 바로 Github Actions
자동 배포를 붙여보자.
본인은 자동 배포 툴을 여러개 사용해봤다.
Travis CI
, AWS CodeBuild - Pipeline
, Jenkins
등을 사용해봤다. 근데
모두 공통점은 EC2 서버에 배포하였고, 그렇기에 부득이하게 S3와 CodeDeploy를 사용했다.
하지만 이번에는 GCP의 Compute Engine
에 배포하는거니 다를거라고 예상하고 시작해보자.
이번 자동 배포 툴은 Github Actions로 정했다.
이유는 세가지다.
- 배포를 위한 서버를 올릴 필요가 없다. (Jenkins 패)
- 코드 관리와 동시에 배포 정상 동작 확인을 한 플랫폼(Github) 에서 할 수 있다.(AWS패)
- 계산했을때 우리가 사용하는 정도면 무료로 사용 가능하다. (Travis CI 패)
이렇게 Github Actions로 정했다!!!
기존
...
# 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 환경을 만들어 놓은 상태에서 해서 수월했다.