Open6
GitHub ActionsでCloud Runにデプロイするまでの記録 〜2021 spring〜
この辺りを参考にPRがmainブランチにマージされたらGitHub Actionsで自動でbuildしてCloud Runにデプロイされるようにしてみる。
- https://qiita.com/szk3/items/38a3dba7fdfed189f4c9
- https://zenn.dev/konnyaku256/articles/auto-deploy-with-cloudrun-and-githubactions
- https://cloud.google.com/blog/ja/products/serverless/deploying-serverless-platforms-github-actions
- https://github.com/google-github-actions/setup-gcloud/blob/master/example-workflows/cloud-run/README.md
デプロイまでの流れ
- mainブランチへのpushをトリガーにGitHub Actionsが発火
- リポジトリをチェックアウト
- Google Cloud SDKをセットアップ
- DockerイメージをBuild
- Google Container Registryにイメージをpush
- Cloud Runにデプロイ
事前準備
GCP
- GCPのサービスアカウント作成
-
このページを参考に以下のロールを持ったGitHub Actions用のサービスアカウントを作成
- Cloud Run 管理者
- Cloud Run サービス エージェント
- Cloud Build サービス アカウント
- 将来的にGitHub Actions以外のCIを使う可能性もなくはないので名前は
ci-deploy
にしておいた
-
このページを参考に以下のロールを持ったGitHub Actions用のサービスアカウントを作成
- サービスアカウントのキーを発行
- JSON形式を使用
GitHub Actions
- GitHub SecretsにGCPのプロジェクトIDとサービスアカウントのキーを登録
-
GCP_PROJECT
とGCP_SA_KEY
という名前で登録した - QiitaやZennの記事ではリージョンもSecretsに登録してるけど、秘匿情報でもないのでworkflowのYAMLに直接書いてよさそう
-
ワークフローの作成
参考
- QiitaやZennの記事よりも新しいやり方が出てきてるっぽい
- 以下の公式のexampleを参考にするとよさそう
実際に作成したYAML
on:
push:
branches:
- main
name: Build and Deploy a Container
env:
PROJECT_ID: ${{ secrets.GCP_PROJECT }}
GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}
SERVICE: example-app
REGION: asia-northeast1
IMAGE: gcr.io/${{ secrets.GCP_PROJECT }}/example-app:${{ github.sha }}
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Cloud SDK
uses: google-github-actions/setup-gcloud@v0.2.0
with:
project_id: ${{ env.PROJECT_ID }}
service_account_key: ${{ secrets.GCP_SA_KEY }}
export_default_credentials: true # Set to true to authenticate the Cloud Run action
- name: Authorize Docker push
run: gcloud auth configure-docker
- name: Build and Push Container
run: |-
docker build . -t ${{ env.IMAGE }}
docker push ${{ env.IMAGE }}
- name: Deploy to Cloud Run
id: deploy
uses: google-github-actions/deploy-cloudrun@v0.4.0
with:
service: ${{ env.SERVICE }}
image: ${{ env.IMAGE }}
region: ${{ env.REGION }}
RAILS_MASTER_KEY
周りでだいぶハマったけど、以下を参考に --build-arg
で環境変数を ARG
として渡してあげればうまく行った!