koを採用しているプロジェクトでCloud RunにCDする
これは何?
Dockerイメージのビルドにkoを採用しているプロジェクトで、Cloud Runに継続的デプロイ(CD)してみた記録です。
今回はPRがmainブランチにマージされた時、その修正が自動的にCloud Runにデプロイされるところまでやってみました。
読む前の想定状態
-
koの設定が完了済 - サービスが
Cloud Runに手動デプロイ済
やってみる
Cloud Runへの継続的デプロイは、Cloud Buildでのビルドとデプロイの手順をyamlで記述し、それをCloud Build Trigger経由で実行させることで実現できます。
ビルド&デプロイのyamlでは、ステップごとに実行環境をDockerイメージで設定できます。
今回はkoでイメージビルドしたいので、gcloudコマンドとkoコマンドが使えるDockerイメージが欲しいですね。
また、Cloud Build Triggerに色々させるためのサービスアカウントが必要です。
まとめると
-
Cloud Build Trigger用のサービスアカウントの準備 -
Cloud Buildの実行環境用のイメージの準備(gcloudコマンドとkoコマンドが使えるもの) -
Cloud Build Triggerの設定
をやっていく必要がありそうです。
Cloud Build Trigger用のサービスアカウントの準備
Cloud Build用のサービスアカウントを作成します。
ロールはCloud Build サービス アカウント Cloud Run 管理者 ログ書き込み をつけましょう。
また、あなたがCloud Runにデプロイしているサービスの実行用のサービスアカウントに、Cloud Build用のサービスアカウントをバインドする必要があります。
gcloud iam service-accounts add-iam-policy-binding <Cloud Runのサービスの実行用のサービスアカウント名> \
--member='serviceAccount:<Cloud Build用のサービスアカウント名>' \
--role=roles/iam.serviceAccountUser
これでデプロイ時に、このアカウントを実行用のサービスアカウントとして指定できるようになります。
Cloud Buildの実行環境用のイメージの準備
koコマンドが使えるCloud Build用のイメージは公式には無いようだったので、自分で用意する必要があります。
こんな感じのDockerイメージを用意して、Artifact Registryにプッシュしておきます。
(ここではasia-northeast1-docker.pkg.dev/arifact-registry/***/deployerというイメージ名でプッシュしたものとします)
FROM gcr.io/cloud-builders/gcloud
RUN apt update && \
add-apt-repository ppa:longsleep/golang-backports && \
apt update && \
apt install -y golang-go
ENV GOBIN /root/go/bin
ENV PATH $PATH:$GOBIN
RUN go install github.com/google/ko@latest
内容としては、公式のgcloud用のイメージにgoとkoをインストールするだけです。
GOBINの設定と、GOBINのPATHへの追加がポイントです。
(これをやっておかないとkoをインストールしてもcommand not foundとなって小ハマりしました...)
Cloud Build Triggerの設定
Cloud Build Triggerを新規作成し、構成はCloud Build 構成ファイル(yaml または json)を、ロケーションはリポジトリを選択します。
対象のリポジトリにcloudbuild.yamlを作ってください(リポジトリ内での置き場所はCloud Build 構成ファイルの場所で指定する場所に合わせてください)。中身はこんな感じ。
options:
logging: CLOUD_LOGGING_ONLY
steps:
# ↓ Cloud Buildの実行環境用のイメージの準備 で用意したもの
- name: "asia-northeast1-docker.pkg.dev/arifact-registry/***/deployer"
env:
- "KO_DOCKER_REPO=<your-app-arifact-registry-repository-name>"
script: |
gcloud run \
deploy <サービス名> \
--image $(SOURCE_DATE_EPOCH=$(date +%s) ko build ./) \
--region asia-northeast1 \
--service-account <Cloud Runのサービスの実行用のサービスアカウント名>
<その他、cpuの設定、メモリの設定、認証の設定など、要件に合わせて適切に>
その他、トリガー名、イベントの設定、対象ブランチ等は、用途に合わせて適切に設定し、トリガーを保存します。
これで対象ブランチへのプッシュのたびにko build、およびイメージのデプロイが自動的に行われるようになりました。
動かしてみる
テスト用にHello world with koという文字列を返すサービスを作りました。
アクセスするとこんな感じで表示されます。

そして、こんな感じのMRを立ててマージします。

マージすると自動的にデプロイが走り始めました!

デプロイが終わると...

サービスが更新されました。素晴らしい👏
まとめ
-
koを使っているプロジェクトでCloud Runへの継続的デプロイをした -
koが使える公式のイメージはないので、自分で作って管理する必要がある。ちょっとメンドウ -
koはGoogleが作ったOSSなのだから、ぜひ公式のイメージを作って欲しいところ
動かしてみたサンプルはこちらにあります
Discussion