GitHub Actions使ってますか? 最高に便利ですね、CI/CDが捗ります。
GCPのCloud Runも便利ですね。GAEも良いですがCloud Runも最高です。
さて、この記事ではGitHub Actionsを使って、GCPのCloud Runにデプロイする方法を紹介します。
ユースケース
シンプルなユースケースとして、masterブランチにpushするとActionsが動いて、コンテナがCloud Runにデプロイされるようなデリバリを例に扱います。
流れはこんな感じです。
- masterブランチへのpushをトリガーにActionsが発火
- リポジトリをチェックアウトする
- Google Cloud SDKをセットアップする(SDKにgcloudが含まれる)
- gcloudをDocker認証ヘルパーとして設定
- DockerイメージをBuildする
- Google Container Registryにイメージをpushする
- Cloud Runにデプロイする
このワークフローを動かすためには事前準備が必要ですが、先にymlを見ておきましょう。IMAGE環境変数は適宜変更してください。
.github/workflows/delivery.yml
name: Delivery
on:
push:
branches:
- master
env:
GCP_PROJECT: ${{ secrets.GCP_PROJECT }}
GCP_REGION: ${{ secrets.GCP_REGION }}
IMAGE: asia.gcr.io/${{ secrets.GCP_PROJECT }}/foobar:${{ github.sha }}
jobs:
delivery:
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v1
- name: GCP Authenticate
uses: GoogleCloudPlatform/github-actions/setup-gcloud@master
with:
version: '273.0.0'
service_account_email: ${{ secrets.GCP_SA_EMAIL }}
service_account_key: ${{ secrets.GCP_SA_KEY }}
- name: Configure docker to use the gcloud cli
run: gcloud auth configure-docker --quiet
- name: Build a docker image
run: docker build . -t $IMAGE
- name: Push the docker image
run: docker push $IMAGE
- name: Deploy to Cloud Run
run: |
gcloud run deploy foobar \
--image $IMAGE \
--project $GCP_PROJECT \
--region $GCP_REGION \
--platform managed \
--quiet
ちなみに、gcloudを使うための方法として、以前はGithub公式のActionsも提供されていましたが現在はDeprecatedです。
GCP公式のActionsが推奨されていますのでそちらを使いましょう。
事前準備
このデプロイフローを動かすためには、事前準備が必要です。
GCPでやること
- Cloud Run API を有効にしておく
- GitHubActions用のサービスアカウントを発行する
- サービスアカウントのキーを発行する
- サービスアカウントに、GCRとCloud Runに対する権限を付与する
-
このリンクを参考に、roles/run.admin(Cloud Run管理者)を元に以下権限を付与したカスタム権限を作るのが簡単です。(が、できるだけ最小権限で管理することをオススメします)
- iam.serviceAccounts.actAs
- storage.buckets.get
- storage.objects.create
GitHubでやること
-
GitHub Secrets に Actionsで使う変数を設定する
*
このworkflowではSecretsに以下を設定しています。GCP側で行った内容を反映させましょう。
* GCP_PROJECT (GCPプロジェクトID)
* GCP_REGION (リージョン)
* GCP_SA_EMAIL (サービスアカウント メールアドレス)
* GCP_SA_KEY (サービスアカウントキー)
実行する
あとは、上記ymlをリポジトリに含めてmasterブランチにpushしてみましょう。
うまくいくとこんな感じになります。めっちゃ捗るわー🚀