😎

GitHub ActionsでビルドしたImageをCloud Runにデプロイする

2025/03/11に公開

概要

GitHub ActionsでGitHub上のコードをビルドしてCloud Runにデプロイする手順をまとめます。
ImageのビルドやデプロイをCloud Buildに任せることもできますが、GitHub Actions上でビルドしたい事情があったため、Cloud Buildを利用せずに構築しました。

デプロイまでの流れ

ビルドからデプロイまで、以下の流れをたどります。

  1. GitHub ActionsでDocker Imageをビルドする
  2. ビルドしたImageをArtifact RegistryにPushする
  3. Cloud Runを起動する

手順

前提

以下の作業は完了している前提で進めていきます。

  • Dockerfileを準備済
  • Cloud Runにサービスを作成済
  • Artifact RegistryにImageをPushする先のリポジトリを作成済

権限設定

デプロイに必要な権限をGCPに設定します。

Workload Identity連携を設定

https://docs.github.com/ja/actions/security-for-github-actions/security-hardening-your-deployments/configuring-openid-connect-in-google-cloud-platform

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は属性条件で利用します。

Google 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 管理者
・サービス アカウント ユーザー

https://cloud.google.com/iam/docs/workload-identity-federation?hl=ja#mapping

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