GitHub ActionsでビルドしたImageをCloud Runにデプロイする
概要
GitHub ActionsでGitHub上のコードをビルドしてCloud Runにデプロイする手順をまとめます。
ImageのビルドやデプロイをCloud Buildに任せることもできますが、GitHub Actions上でビルドしたい事情があったため、Cloud Buildを利用せずに構築しました。
デプロイまでの流れ
ビルドからデプロイまで、以下の流れをたどります。
- GitHub ActionsでDocker Imageをビルドする
- ビルドしたImageをArtifact RegistryにPushする
- Cloud Runを起動する
手順
前提
以下の作業は完了している前提で進めていきます。
- Dockerfileを準備済
- Cloud Runにサービスを作成済
- Artifact RegistryにImageをPushする先のリポジトリを作成済
権限設定
デプロイに必要な権限をGCPに設定します。
Workload Identity連携を設定
GCPとGitHub間の連携にはWorkload Identity連携を利用します。GitHub Actionsワークフローから GCP 内のリソースにアクセスできるようになります。
Workload Identity Providerの設定は以下を参考にしてください。
項目 | 設定値 |
---|---|
プロバイダの選択 | OpenID Connect(OIDC) |
プロバイダ名 | 任意の値 |
発行元 (URL) | https://token.actions.githubusercontent.com |
属性マッピングでは、OIDCで発行したID TokenとGoogle上の属性のマッピングを設定します。google.subject
は設定必須です。attribute.repository
は属性条件で利用します。
OIDC | |
---|---|
google.subject | assertion.sub |
attribute.repository | assertion.repository |
属性条件で、GitHubからの認証リクエストが特定の条件を満たすことを確かめます。デプロイでは想定のリポジトリからのリクエストであることが確認できれば良いはずなので、以下のようなCEL式になります。
assertion.repository == 'リポジトリ名'
IAM設定
Artifact RegistryへのPushとCloud Runへのデプロイに必要な権限を、Workload Identity Providerに対応するprincipalSetに付与します。
※attribute.hoge
には(principal
ではなく)principalSet
がバインドされます。
項目 | 設定値 |
---|---|
プリンシパル | principalSet://iam.googleapis.com/projects/<プロジェクトID>/locations/global/workloadIdentityPools/<Pool ID>/attribute.repository/<Provider ID> |
ロール | ・Artifact Registry 書き込み ・Cloud Run 管理者 ・サービス アカウント ユーザー |
GitHub Actionsを作成
.github/workflows
配下にymlファイルを作成し、以下のように設定を記述します。
envにはプロジェクトに合わせて変数を設定してください。
name: Deploy to Cloud Run
env:
PROJECT_ID: <プロジェクトID>
PROJECT_NUMBER: <プロジェクト番号>
GAR_LOCATION: <Artifact Registry location>
REPOSITORY: <Artifact Registry repository name>
SERVICE: <Cloud Run service name>
REGION: <Cloud Run service region>
POOL_ID: <Workload Identity Pool ID>
PROVIDER_ID: <Workload Identity Provider ID>
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: "read"
id-token: "write"
steps:
- uses: "actions/checkout@v4"
- uses: "google-github-actions/auth@v2"
with:
workload_identity_provider: "projects/${{ env.PROJECT_NUMBER }}/locations/global/workloadIdentityPools/${{ env.POOL_ID }}/providers/${{ env.PROVIDER_ID }}"
project_id: ${{ env.PROJECT_ID }}
- name: Setup Google Cloud
uses: google-github-actions/setup-gcloud@v2
- name: Configure Docker
run: gcloud auth configure-docker ${{ env.GAR_LOCATION }}-docker.pkg.dev --quiet
- name: Build and Push Container
run: |-
docker build \
-t "${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.SERVICE }}:${{ github.sha }}" \
./
docker push "${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.SERVICE }}:${{ github.sha }}"
- name: "deploy to Cloud Run"
uses: "google-github-actions/deploy-cloudrun@v2"
with:
service: ${{ env.SERVICE }}
region: ${{ env.REGION }}
image: "${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.SERVICE }}:${{ github.sha }}"
かいつまんで説明します:
-
google-github-actions/setup-gcloud@v2
でgcloudコマンドを利用できるようにした上で、Docker ImageをPushしています。 - Cloud Runへのデプロイは
google-github-actions/deploy-cloudrun@v2
を利用しています。PushしたImageを使ってデプロイしています。
最後に
GitHub ActionsからCloud Runにデプロイするために必要な、GCP上の権限設定とGitHub Actionsの設定をまとめました。お役に立てば幸いです。
Discussion