開発エンジニアのR.Kです。
前回の記事では、CI/CDの基本的な仕組みやGoogle Cloudで利用できる関連サービスについて解説しました。
今回はその実践編として、CI/CDツール「Cloud Build」を実際に使用し、ソースコード管理ツール(Backlog)へのプッシュをトリガーとして、アプリケーションを自動でデプロイする仕組みの構築方法を解説します。
自動デプロイの概要
今回構築するのは、BacklogのGitリポジトリへのコードプッシュを起点として、Cloud Runへ自動的にアプリケーションをデプロイするパイプラインです。
自動デプロイの基本的な流れは以下の4ステップです。
- Backlogのgitにプッシュする(手動)
- Cloud Buildのトリガーが発動(自動)
- Cloud Buildがソースコードをビルドし、コンテナイメージをArtifact Registryにプッシュする(自動)
- Cloud Runにデプロイ(自動)
前提条件
この検証を行うための前提条件は以下の通りです。
- Google Cloudプロジェクトが存在すること。
-
以下のGoogle Cloudサービスを利用します。
― Cloud Build
― Secret Manager
― Artifact Registry
― Cloud Run - ソースコードはBacklogのGitで管理していること。
- 対象のBacklogプロジェクトで管理者権限を持っていること。
-
今回のゴールは、masterブランチへのpushをトリガーに、Cloud Runへデプロイすることとします。
※テスト工程は含めません。
ステップ1:事前準備
Cloud Buildのトリガーを設定する前に、必要なAPIの有効化や権限設定などの準備作業を行います。
-
APIの有効化
GCPコンソールで、以下のAPIを有効化します。
- Cloud Build API
- Cloud Run Admin API
- Secret Manager API
- Artifact Registry API
-
Cloud Buildサービスアカウントへの権限付与
Cloud Buildが他のGoogle Cloudサービスを操作できるよう、IAMでサービスアカウントに以下のロールを付与します。
- Artifact Registry 書き込み
- Cloud Build サービス エージェント
- Cloud Run デベロッパー
- Secret Manager のシークレット アクセサー
- Storage オブジェクト ユーザー
- サービス アカウント トークン作成者
- サービス アカウント ユーザー
- ログ書き込み
-
SSH認証鍵の作成と登録
Cloud BuildがBacklogのプライベートリポジトリにアクセスするためにSSH鍵を使用します。
ローカル環境で
ssh-keygen -t ed25519 -C "your_email@example.com"などのコマンドを実行し、SSHの公開鍵と秘密鍵を作成します。
※最初RSA方式で作成した鍵を設定しましたが認証がうまくいかず、Googleの公式ページのリンク先で紹介されていたコマンドで作成したら成功しました。
- 作成した秘密鍵をSecret Managerにシークレットとして登録します。
- 作成した公開鍵をBacklogのプロジェクト設定にあるリポジトリの公開鍵として登録します。
-
Artifact Registryリポジトリの作成
ビルドしたコンテナイメージを保存する場所として、Artifact Registryにリポジトリを作成します。リポジトリ形式は「Docker」を選択し、リージョン(例: asia-northeast1)を決定します。このリージョンは後ほど設定するCloud Buildトリガーのリージョンと一致させる必要があります。
ステップ2:Cloud Buildトリガーの設定
次に、BacklogからのWebhookを待ち受けるCloud Buildのトリガーを設定します。ここで設定するcloudbuild.yamlの中で、事前準備でSecret Managerに登録したSSH秘密鍵を利用してBacklogのリポジトリへセキュアにアクセスします。
-
Cloud Buildの「トリガー」ページで新しいトリガーを作成します。トリガー名を入力し、リージョンは先ほどArtifact Registryで作成したリポジトリと同じものを選択します。
-
イベントとして「Webhookイベント」を選択します。Webhook URLのシークレットとして「新しいシークレット」を選択し、シークレットを作成します。作成後、「URLのプレビューを表示」からWebhook URLを控えておきます。
-
構成セクションで、ロケーションは「インライン」を選択し、エディタにビルド、テスト、デプロイのステップを定義したcloudbuild.yamlの内容を記述します。
-
以下に示すcloudbuild.yamlは、複数のステップで構成されています。最初のステップではSecret ManagerからSSH秘密鍵を取得してBacklogリポジトリにアクセスする準備を行い、次にソースコードをクローンします。その後、DockerイメージをビルドしてArtifact Registryにプッシュし、最後にそのイメージをCloud Runにデプロイします。
steps:
- name: gcr.io/cloud-builders/git
args:
- '-c'
- |
set -x
echo "DEBUG: Setting up SSH key"
echo "$$SSH_KEY" >> /root/.ssh/id_rsa
chmod 400 /root/.ssh/id_rsa
ls -l /root/.ssh
ssh-keyscan -vvv -t rsa <スペース名>.git.backlog.jp > /root/.ssh/known_hosts
cat /root/.ssh/known_hosts
echo "DEBUG: SSH key setup completed"
id: ssh-setup
entrypoint: bash
secretEnv:
- SSH_KEY
volumes:
- name: ssh
path: /root/.ssh
- name: gcr.io/cloud-builders/git
args:
- '-c'
- |
set -x
ssh-keyscan -t rsa <スペース名>.git.backlog.jp >> /root/.ssh/known_hosts
cat /root/.ssh/known_hosts
if [ -d "ci-cd-test" ]; then
echo "Directory 'ci-cd-test' already exists. Performing git pull..."
cd ci-cd-test
git pull
else
echo "Cloning repository..."
git clone ssh://<ユーザー名>@<スペース名>.git.backlog.jp:/<プロジェクト番号>/<リポジトリ名>.git
fi
id: clone-repo
entrypoint: bash
volumes:
- name: ssh
path: /root/.ssh
- name: gcr.io/cloud-builders/docker
args:
- build
- '-t'
- >-
asia-northeast1-docker.pkg.dev/$PROJECT_ID/<Artifact Registryで作成したリポジトリ名>/<任意のイメージ名>:$_COMMIT_SHA
- '-f'
- ci-cd-test/Dockerfile # ci-cd-test部分はクローン時に指定しない場合はBacklogのリポジトリ名
- ci-cd-test
id: build
- name: gcr.io/cloud-builders/docker
args:
- push
- >-
asia-northeast1-docker.pkg.dev/$PROJECT_ID/<Artifact Registryで作成したリポジトリ名>/<任意のイメージ名>:$_COMMIT_SHA
id: push
- name: gcr.io/google.com/cloudsdktool/cloud-sdk
args:
- run
- deploy
- backlog-cicd-sample-run
- '--image'
- >-
asia-northeast1-docker.pkg.dev/$PROJECT_ID/<Artifact Registryで作成したリポジトリ名>/<任意のイメージ名>:$_COMMIT_SHA
- '--region'
- asia-northeast1
- '--port'
- default
entrypoint: gcloud
options:
logging: CLOUD_LOGGING_ONLY # Loggingにログを出したい場合は追加
env:
- DOCKER_BUILDKIT=1
availableSecrets:
secretManager:
- versionName: projects/<プロジェクト番号>/secrets/<ssh秘密鍵を保存したシークレット名>/versions/latest
env: SSH_KEY
- 代入変数とフィルタを設定します。
-
代入変数:Webhookのペイロードから動的に値を取得するために設定します
― _COMMIT_SHA:$(body.content.revisions[0].rev)
― _CONTENT_REF:$(body.content.ref)
― _REPOSITORY_NAME:$(body.content.repository.name) -
フィルタ:特定の条件を満たした場合にのみビルドが実行されるように設定します。例えば、「リポジトリ名がci-cd-test」かつ「プッシュされたブランチがmaster」の場合に実行するという条件を設定できます。
- サービスアカウントはステップ1のNo.2で権限付与をしたアカウントを選択します。
ステップ3:BacklogのWebhook設定
Cloud Buildで設定したトリガーを起動するために、Backlog側でWebhookを設定します。
-
対象のプロジェクト設定を開きます。
-
「インテグレーション」から「Webhook」設定に進み、「Webhookを追加する」を選択します。
- Webhook名などを入力し、「Webhook URL」の欄に、Cloud Build設定のステップ2のNo.2で控えたURLを貼り付けます。
- 通知するイベントとして「Gitプッシュ」を選択します。
-
設定を保存します。
ステップ4:実行確認
全ての設定が完了したら、実際に動作するか確認します。
- ローカル環境から対象リポジトリのmasterブランチにソースコードをプッシュします。
-
しばらく待ってから、以下の点を確認します。
-
Artifact Registry:指定したリポジトリ内に新しいコンテナイメージが作成されていること。
-
Cloud Run:新しいリビジョンがデプロイされ、サービスが更新されていること。
-
Cloud Build:履歴ページで、今回のプッシュに対応するビルドが成功しており、各ステップの実行ログが確認できること。
-
Artifact Registry:指定したリポジトリ内に新しいコンテナイメージが作成されていること。
これでBacklogへのプッシュをトリガーとした自動デプロイの構築は完了です。
まとめ
今回は、Cloud Buildを使用してBacklogへのプッシュをトリガーとした自動デプロイの仕組みを構築しました。cloudbuild.yamlをカスタマイズすることで、デプロイだけでなくテストのステップを追加し、テスト自動化を実現することも可能です。
Cloud Buildではcloudbuild.yamlを記述する必要がありますが、Cloud Deployを利用するとコンソールからより直感的にデプロイパイプラインを設定できるため、こちらも今後の検証テーマとして取り組んでいきたいと思います。
このように当社ではGoogle関連のサービスを活用したアプリケーション開発を行い、Google Cloud・Google Workspaceをより便利にご利用いただけるようなお手伝いをしています。Google プロダクトを利用する上でのお困りごとがあればお気軽にご相談ください。
※本記事の情報および画像は 2025/12/16 時点での仕様のものです。