GitHub Action으로 Google App Engine 배포 자동화하기

송은·2023년 6월 13일
0

CI/CD

목록 보기
2/2
post-thumbnail

미니 프로젝트를 다루다가 Google App Engine으로 배포하고, GitHub Action으로 CI/CD 를 구현하고 싶어서 GitHub Action에 대해서 알아보게 되었다.
근데 참고하는 글들이 예전 버전으로 되어있어서 업데이트한 버전으로 다시 알아두려고 정리해보았다.🤔

Google App Engine에 배포하는 과정도 애먹었었는데 이 과정은 다음 글에서 다시 정리해두어야 할 것 같다.
이번 글에서는 Google App Engine에는 배포되었다는 전제로 GitHub Action workflow에 대해서만 다룰 예정이다.

Google App Engine 배포 방법은 이전 글에서 확인할 수 있다.


GitHub Actions?

GitHub에서 제공하는 workflow 자동화 툴로 빌드, 테스트, 배포 등의 CI/CD를 해줄 수 있도록 도와주는 기능이다.

GitHub Actions를 이용하면 내 프로젝트 저장소에 push 하는 것만으로도 서비스에 배포할 수 있어 시간도 절약되고 좋다.


사용법

1. Github Actions 시작하기

먼저 레포지토리를 새로 만들거나, 배포 할 레포지토리를 선택한다.

  • GitHub 저장소 내 Actions 탭을 눌러서 미리 정의된 workflow들을 볼 수 있다. 여기서는 완전히 customize 된 workflow를 만들 수 도 있다.
  • 하지만 보통은 미리 정의된 것을 사용하는 것이 편하다.
    - GitHub Marketplace에서 'app-engine'에 관해 검색하면 app-engine과 관련된 workflow actions 목록들을 확인할 수 있다.
    - 그중 Marketplace 내 app engine 관련 가장 많은 star를 받은것을 참고해서 만드는 것을 추천한다.

Github Actions Tab

위 사진에서 set up a workflow yourself 링크로 들어가면 해당 저장소의 main.yml 파일을 설정하는 곳으로 연결된다.

이곳에 GitHub Actions에 관한 코드를 작성해주면 된다!

Github Actions 코드 작성 부분


2. GitHub Action Workflow 작성

위에 Market place에서 참고한 코드는 다음과 같다.

name: deploy GAE

on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v2

      - name: Initialize Google Cloud SDK
        uses: zxyle/publish-gae-action@master
        with:
          service_account_email: ${{ secrets.GCP_SA_EMAIL }}
          service_account_key: ${{ secrets.GCP_SA_KEY }}
          project_id: ${{ secrets.PROJECT_ID }}
      - name: Publish app to Google App Engine
        run: |
          # This client-secret.json is converted by GCP_SA_KEY.
          gcloud auth activate-service-account ${{ secrets.GCP_SA_EMAIL }} --key-file=client-secret.json
          gcloud config set project ${{ secrets.PROJECT_ID }}
          gcloud -q app deploy app.yaml --promote

          # Suppose you need a cron task.
          # gcloud -q app deploy cron.yaml

아직 secret에 키를 등록하지 않은 상태에서 workflow를 작성 후에 [Start commit] 버튼을 누르면 푸시는 되었으나 커밋 내역에 ❌ 표시가 뜨면서 build 되지 않았다고 뜰 것이다. 당황하지 말고 다음 내용에서 이어지는 키를 마저 추가해주고 새로운 푸시를 해주면 build 되면서 배포가 된다.


3. 레포지토리 내 secrets 추가하기

이 때 Workflow의 코드 내에는 사용자 개인의 Access key 라거나, 이메일, 프로젝트 아이디 등 중요한 키 값들이 포함되어 있다.

이들이 코드에 들어가면 보안상 리스크가 생기므로 이 값들을 코드가 아닌, 레포지토리의 secrets에 추가해주어야 한다.

❓ secrets key 추가 방법
레포지토리 - Settings - Actions - New repository secret 버튼을 눌러서 새로운 키를 추가할 수 있다.

New repository secret button

secrets key의 이름과 key값 작성하는 부분

Name에는 설정할 키 이름, Secret에는 해당 키에 설정할 값을 작성해주면 된다.

그리고 이렇게 레포지토리에서 생성한 secret 키는 변수명처럼 코드 내에서 다음과 같이 사용할 수 있다.

${{ secrets.secrets에저장한KEY이름 }}

이번에 우리가 작성할 workflow에서 필요한 것은 세가지 이다.

  • 프로젝트 아이디 (PROJECT_ID)
  • 서비스키 (GCP_SA_KEY)
  • 이메일 주소 (GCP_SA_EMAIL)

3-1. 프로젝트 아이디

프로젝트 아이디는 말 그대로 프로젝트 선택창에 나오는 아이디이다.
✅ 이 값이 PROJECT_ID가 된다.


3-2. 서비스키

서비스키는 다음 주소를 통해 주소 끝에 자신의 프로젝트 이름으로 수정해서 확인할 수 있다.
계정이 본인 것이 맞는지, 프로젝트가 해당 프로젝트인지 꼭 확인을 잘 해야한다!

https://console.cloud.google.com/apis/library/cloudresourcemanager.googleapis.com?project=자신의프로젝트이름

내 프로젝트 화면

[사용] - [프로젝트 선택] 하면 해당 프로젝트의 API 및 서비스 링크로 넘어간다.

API 및 서비스 화면

[사용자 인증 정보] - [사용자 인증 정보 만들기] - [서비스 계정] 으로 계정을 하나 생성해준다.

서비스 계정 선택창

서비스 계정 이름은 원하는 것으로 아무거나 작성해주고, [만들고 계속하기] 를 눌러 진행한다.

서비스 계정 세부정보 작성란

🚨 여기서 서비스 계정에 관한 권한/역할을 부여해주어야 하는데 이것은 배포 환경마다 역할이 다양하기 때문에 다음 공식 문서들을 참고해서 역할들을 추가해준다.

App engine 애플리케이션 배포할 경우 위와 같은 권한들이 필요하다고 안내되어 있다.

🚨 +) 나는 4가지 설정 이외에도 push 했을 때 cloud build 관련 오류가 나서 'Cloud 빌드 서비스 계정' 에 관한 권한도 함께 넣어주었더니 해결되었다.

cloud build 관련한 오류 화면

결과적으로 다음과 같은 권한을 주었다.

서비스 계정 액세스 권한 부여

권한을 설정해준 뒤, [계속] - [완료] 를 통해 계정이 생성되면 서비스 계정에서 확인할 수 있다.

해당 이메일을 눌러 링크로 들어가보면 키 탭에서 [새 키 만들기] 를 통해 키를 발급받을 수 있다.

보틍은 JSON 버전을 권장한다고 하니 JSON으로 선택하고 확인하면 키 파일이 자동으로 다운 받아진다.

키 파일이 다운로드 된 내 컴퓨터의 폴더로 가서 아래 처럼 입력해준다.

cat [다운받은 본인의 키].json | base64

✅ 문자가 엄청 길게 나오는데, 이 출력된 문자가 GCP_SA_KEY가 된다.


3-3. 이메일 주소

Github 계정 주소 X, 구글 이메일 주소 X

✅ 구글 App engine에서 발급받은 키의 서비스계정 이메일 주소를 입력해준다. 이 값이 GCP_SA_EMAIL이 된다.

👉 이 세 가지를 Github Actions Secrets에 키와 값을 잘 등록해주고, 이제 코드를 커밋하면 자동으로 actions가 잘 돌아가게 된다!!


에러가 뜨는 경우

  • 권한 에러
  • app.yaml 파일이 없는 경우
  • app engine 프로젝트가 아닌 경우



출처

profile
개발자

0개의 댓글