미니 프로젝트를 다루다가 Google App Engine으로 배포하고, GitHub Action으로 CI/CD 를 구현하고 싶어서 GitHub Action에 대해서 알아보게 되었다.
근데 참고하는 글들이 예전 버전으로 되어있어서 업데이트한 버전으로 다시 알아두려고 정리해보았다.🤔
Google App Engine에 배포하는 과정도 애먹었었는데 이 과정은 다음 글에서 다시 정리해두어야 할 것 같다.
이번 글에서는 Google App Engine에는 배포되었다는 전제로 GitHub Action workflow에 대해서만 다룰 예정이다.
Google App Engine 배포 방법은 이전 글에서 확인할 수 있다.
GitHub에서 제공하는 workflow 자동화 툴로 빌드, 테스트, 배포 등의 CI/CD를 해줄 수 있도록 도와주는 기능이다.
GitHub Actions를 이용하면 내 프로젝트 저장소에 push 하는 것만으로도 서비스에 배포할 수 있어 시간도 절약되고 좋다.
먼저 레포지토리를 새로 만들거나, 배포 할 레포지토리를 선택한다.
위 사진에서 set up a workflow yourself 링크로 들어가면 해당 저장소의 main.yml
파일을 설정하는 곳으로 연결된다.
이곳에 GitHub Actions에 관한 코드를 작성해주면 된다!
위에 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 되면서 배포가 된다.
이 때 Workflow의 코드 내에는 사용자 개인의 Access key 라거나, 이메일, 프로젝트 아이디 등 중요한 키 값들이 포함되어 있다.
이들이 코드에 들어가면 보안상 리스크가 생기므로 이 값들을 코드가 아닌, 레포지토리의 secrets에 추가해주어야 한다.
❓ secrets key 추가 방법
레포지토리 - Settings - Actions - New repository secret 버튼을 눌러서 새로운 키를 추가할 수 있다.
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 및 서비스 링크로 넘어간다.
[사용자 인증 정보] - [사용자 인증 정보 만들기] - [서비스 계정] 으로 계정을 하나 생성해준다.
서비스 계정 이름은 원하는 것으로 아무거나 작성해주고, [만들고 계속하기] 를 눌러 진행한다.
🚨 여기서 서비스 계정에 관한 권한/역할을 부여해주어야 하는데 이것은 배포 환경마다 역할이 다양하기 때문에 다음 공식 문서들을 참고해서 역할들을 추가해준다.
App engine 애플리케이션 배포할 경우 위와 같은 권한들이 필요하다고 안내되어 있다.
🚨 +) 나는 4가지 설정 이외에도 push 했을 때 cloud build 관련 오류가 나서 'Cloud 빌드 서비스 계정' 에 관한 권한도 함께 넣어주었더니 해결되었다.
결과적으로 다음과 같은 권한을 주었다.
권한을 설정해준 뒤, [계속] - [완료] 를 통해 계정이 생성되면 서비스 계정에서 확인할 수 있다.
해당 이메일을 눌러 링크로 들어가보면 키 탭에서 [새 키 만들기] 를 통해 키를 발급받을 수 있다.
보틍은 JSON 버전을 권장한다고 하니 JSON으로 선택하고 확인하면 키 파일이 자동으로 다운 받아진다.
키 파일이 다운로드 된 내 컴퓨터의 폴더로 가서 아래 처럼 입력해준다.
cat [다운받은 본인의 키].json | base64
✅ 문자가 엄청 길게 나오는데, 이 출력된 문자가 GCP_SA_KEY
가 된다.
3-3. 이메일 주소
Github 계정 주소 X, 구글 이메일 주소 X
✅ 구글 App engine에서 발급받은 키의 서비스계정 이메일 주소를 입력해준다. 이 값이 GCP_SA_EMAIL
이 된다.
👉 이 세 가지를 Github Actions Secrets에 키와 값을 잘 등록해주고, 이제 코드를 커밋하면 자동으로 actions가 잘 돌아가게 된다!!
app.yaml
파일이 없는 경우출처