
GitHub から Cloud Run に自動デプロイしてみた
こんにちは、すらぼです。
今回は、Cloud Run に GitHub で管理しているソースコードをデプロイするフローを設定してみました。
早速ですがやっていきます。
手順
今回の大まかな流れは以下です。
- デプロイするアプリの準備
- Google Cloud プロジェクトの準備
- 自動デプロイの設定
- おまけ:プルリクエストのプレビューをしてみる
アプリの準備
まず、デプロイするアプリケーションを準備していきます。
アプリの作成
ローカル環境でアプリケーションを作っていきます。今回はサンプルとして Next.js アプリケーションを作成していきます。
cd sandbox
npx create-next-app@latest nextjs-cloudrun-deploy-app
cd nextjs-cloudrun-deploy-app
完了したら以下を実行し、動作確認します。
npm run dev
問題なければ、デフォルトのページが表示されます。

GitHub に commit
次にリポジトリに push しておきます。
git init
git add .
git commit -m "first commit"
git remote add origin git@github.com:<USER_NAME>/<REPO_NAME>.git
git push -u origin main
これで、デプロイするリソースを GitHub に準備できました。ここから実際に Google Cloud にデプロイする流れを作っていきます。
Google Cloud プロジェクトの設定
以下のAPIを有効化しておきます。
# 必要な API を有効化
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
developerconnect.googleapis.com
また、Cloud Run にデプロイするためのサービスアカウントも用意しておきましょう。
gcloud iam service-accounts create cloudrun-deployer \
--display-name="Cloud Build deployer for Cloud Run"
for role in \
roles/logging.logWriter \
roles/artifactregistry.writer \
roles/run.developer \
roles/iam.serviceAccountUser \
roles/developerconnect.readTokenAccessor
do
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member="serviceAccount:cloudrun-deployer@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \
--role="$role" \
--condition=None
done
自動デプロイの設定
ここから、実際に自動デプロイのフローを設定していきます。
リポジトリの接続〜サービスの作成
Cloud Run の画面から、「リポジトリを接続」を選択します。

ここで、 リージョンを選択してから 「Developer Connect で設定」をクリックします。理由は後述します。

そのまま「新しいリポジトリをリンク」と進みます。

GitHub を選択して、特に変更せずにそのまま「続行」をクリックします。

以下のような画面が表示されるので、画面の案内に従って先ほど作成したGitHubリポジトリと接続します。

先ほどのリポジトリと接続できたら、先ほどの Developer Connect 設定画面からリポジトリを選択できるようになります。

ビルド構成では、今回は Google Cloud Buildpacks を使用します。

今回は検証用途のため、「パブリックアクセスを許可」とします。

これで「作成」をクリックすると、ビルドとデプロイが実行されます。
サービスアカウントの設定
ただし、このままだと Cloud Build のサービスアカウントがデフォルトのままで、権限が足りずにビルドが失敗する可能性があります。
Google Cloud のベストプラクティスに沿って、先ほど作成したものに変更します。
Cloud Build の画面に移動し、「トリガー」を確認すると先ほどの一連の手順で自動作成されたものがあるので、クリックします。

一番下までスクロールすると「サービス アカウント」の項目があるので、準備段階で作成したサービスアカウントに切り替えておきます。

これで再度トリガーを実行し、デプロイが問題なく終了したらOKです。

動作確認
デプロイが完了すると、Cloud Run サービスのURLでそのままアクセスできるようになります。実際にアクセスすると、以下のようにアプリケーションが確認できます。

注意点: リポジトリが表示されないとき
作業中に自分がつまずいたポイントをメモしておきます。
Cloud Run のサービスを消して作り直すなど、既存の Developer Connect を利用して新しいサービスを作ろうとしたとき、 リポジトリが表示されない という問題が発生しました。
原因は、先ほどの手順の中で Developer Connect が意図しないリージョンに作成されていることでした。
Cloud Run サービスを新しく作成する際、リージョンはデフォルトで任意のリージョンが自動で選択されるようになっています。
このリージョンは、 Developer Connect が作成されるリージョンにも紐づいており、筆者の場合は意図せず東京リージョン以外で Developer Connect が作成される事態が発生しました。

Developer Connect はリージョンリソースであり、Cloud Run サービスのデプロイ先リージョンと Developer Connect のリージョンが異なる場合、 Developer Connect は利用できません。もしこのような事象が発生した場合は、 Developer Connect を自分が使いたいリージョンで作り直す必要があります。注意しましょう。
おまけ: プルリクエストのプレビューをしてみる
ここまででデプロイはできるようになりましたが、せっかくなのでプルリクエストのプレビューができるよう設定してみようと思います。
プレビューできるようにするためには、新しい Cloud Build トリガーを作成する必要があります。ゼロから作成するのは大変なので、先ほどの作業で自動作成された Cloud Build トリガーを複製する形でプレビュー用のトリガーも作成してみます。
まず、Cloud Build の「トリガー」画面に移動します。

次に、先ほどの Cloud Run 用に作成されたトリガーを「複製」します。

そして、以下のように設定を変更していきます。
- 名前
- 64文字以下の任意の名前(変更前:64文字以上になるケースが多い)
- イベント
- pull リクエスト(変更前:ブランチに push する)
- ロケーション
- リポジトリ(変更前:インライン)
- ファイルの場所:
cloudbuild-preview.yaml
最後に、新しいブランチを作成して以下の cloudbuild-preview.yaml を作成し、 commit します。
options:
logging: CLOUD_LOGGING_ONLY
steps:
- name: gcr.io/k8s-skaffold/pack
entrypoint: pack
args:
- build
- '${_DEPLOY_REGION}-docker.pkg.dev/$PROJECT_ID/${_AR_REPOSITORY}/${_SERVICE_NAME}:$SHORT_SHA'
- --builder
- gcr.io/buildpacks/builder:latest
- --network
- cloudbuild
- --publish
- name: gcr.io/google.com/cloudsdktool/cloud-sdk
entrypoint: gcloud
args:
- run
- deploy
- '${_SERVICE_NAME}'
- '--image=${_DEPLOY_REGION}-docker.pkg.dev/$PROJECT_ID/${_AR_REPOSITORY}/${_SERVICE_NAME}:$SHORT_SHA'
- '--region=${_DEPLOY_REGION}'
- --no-traffic
- '--tag=pr-$_PR_NUMBER'
これで、プレビューの準備が完了です。
上記と合わせて、新しいブランチで page.tsx ファイルを書き換えてみます。

この状態で、変更を push し、ブランチのプルリクエストを作成してみます。

すると、Cloud Build 上でビルドが実行されます。この時点では、Cloud Run サービスの画面にはまだ表示されません。
(少し切り詰められていますが、 feature ブランチのビルドが走っていることがわかります。)

Cloud Build でビルドが完了すると、以下のようにリビジョンが追加されます。Cloud Build で設定した通り、トラフィックは0%になっています。

リビジョンタグを付与しているため、固有のURLが発行されています。タグの部分をクリックして、リビジョンのURLをブラウザで確認してみます。

ページを確認すると、以下のようにプレビュー環境のページが確認できました。
(もちろん実際にトラフィックが流れているページには変化はありません)

これで、Cloud Run 上でプルリクエスト単位でのプレビューを試すことができました。
注意点として、 プルリクエストが消えてもリビジョンは自動で消えない ため、定期的にリビジョンを削除したりといったお掃除を行う必要があります。ご注意ください。
ざっくりやるなら、「作成から7日以上が経過したリビジョンは削除する処理」を日次で実行することで対応できます。
丁寧にやる場合は、リビジョンごとの request_count メトリクスとプルリクエストの状態(オープン/クローズ)を確認することで、より正確なお掃除ができそうです。
終わりに
以上、Cloud Run で GitHub から自動デプロイする設定を試してみました。
自分は少しハマってしまいましたが、設定自体はすごく簡単にできるようになっています。また、タグを設定することでプレビューのような使い方もでき、開発環境などでは重宝しそうな機能だと思いました。
Cloud Run は他にもたくさんの機能があり、開発者体験をよくしてくれる機能もたくさんあるので、今後も引き続きブログで紹介していければと思います。
この記事がどなたかの助けになれば幸いです。以上、すらぼでした!
参考資料




