このページでは、Cloud Build を使用して Go アプリケーションのビルドとテスト、Artifact Registry へのアーティファクトのアップロード、来歴情報の生成、Cloud Storage へのテストログの保存を行う方法について説明します。
始める前に
このページの説明は、Go と以下の知識があることを前提としています。
-
Enable the Cloud Build, Cloud Run, and Artifact Registry APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. - このページで
gcloudコマンドを実行するには、Google Cloud CLI をインストールします。 - Go プロジェクトを準備します。
- Artifact Registry に Go リポジトリを用意します。リポジトリがない場合は、新しいリポジトリを作成します。
- テストログを Cloud Storage に保存する場合は、Cloud Storage にバケットを作成します。
- Cloud Run のランタイム サービス アカウントの ID を確認します。
カスタム Cloud Build サービス アカウントを作成する
Google Cloud CLI で次のコマンドを実行して、カスタム Cloud Build サービス アカウントを作成します。
gcloud iam service-accounts create cloud-build-go \
--description="Build and test Go applications" \
--display-name="Cloud Build Go" \
--project="PROJECT_NAME"
このサービス アカウントを使用して、Go アプリケーションをビルドしてテストします。
IAM 権限を構成する
Go アプリケーションのビルドとデプロイに必要な権限で新しいサービス アカウントを構成するには、次の操作を行います。
-
Google Cloud コンソールで、settings Cloud Build の [権限] ページに移動します。
[サービス アカウント] メニューに移動し、
cloud-build-goサービス アカウントを選択します。次のロールのステータスを [有効] に設定します。
- Cloud Run 管理者(
roles/run.admin): Cloud Build が Cloud Run に新しいサービスをデプロイできるようにします。- [サービス アカウント ユーザーのロールを割り当てる] パネルで、ランタイム サービス アカウントを選択し、[権限を付与] をクリックします。この構成により、カスタム Cloud Build サービス アカウントは、Cloud Run マネージド サービスとやり取りするときにランタイム サービス アカウントを偽装できます。詳細については、マネージド サービス用に Cloud Build サービス アカウントの権限借用を構成するをご覧ください。
- ストレージ管理者(
roles/storage.admin): Cloud Storage からの読み取りと書き込みを有効にします。 - Artifact Registry 書き込み(
roles/artifactregistry.writer): Artifact Registry からのイメージの pull と Artifact Registry への書き込みを許可します。 - ログ書き込み(
roles/logging.logWriter): ログエントリを Cloud Logging に書き込むことができます。 - Cloud Build 編集者(
roles/cloudbuild.builds.editor): サービス アカウントでビルドを実行できます。
- Cloud Run 管理者(
Go ビルドを構成する
Docker Hub にある一般公開の golang イメージは、Go モジュールを使用したビルドの作成に対応しています。このイメージを Cloud Build 構成ファイルのビルドステップとして使用すると、イメージ内で go コマンドを呼び出すことができます。このビルドステップに渡された引数が golang ツールに直接渡されるので、このイメージで任意の go コマンドを実行できます。
このセクションでは、cloud-build-samples Git リポジトリから Go アプリのビルド構成ファイルの例を作成する方法について説明します。ビルド構成ファイルには、アプリのビルド、単体テストの追加、テスト合格後のアプリのデプロイを行うステップが含まれています。
Go アプリケーションのサンプルをビルドするには:
単体テストを構成する: アプリケーションで単体テストを定義している場合、ビルドステップに次のフィールドを追加してテストを実行するように Cloud Build を構成できます。
name: タスクの Docker Hub から取得した Golang イメージを使用するには、このフィールドの値をgolangに設定します。entrypoint: このフィールドの値を/bin/bashに設定します。これにより、ビルドステップから複数行の bash コマンドを直接実行できます。args: ビルドステップのargsフィールドは引数のリストを受け取り、nameフィールドによって参照されるイメージに渡します。次の例では、argsフィールドが次の引数を受け取ります。- テストログ フォーマッタを実行してテストログ出力をダウンロードする。
- ログ出力を出力する。
- テスト結果を
sponge.logに保存する。 sponge.logの結果を JUNIT XML ファイルに出力します。JUNIT XML ファイルの名前は、ビルドに関連付けられた commit ID の短縮バージョンを使用して作成されます。以降のビルドステップでは、このファイルのログを Cloud Storage に保存します。steps: # Run tests and save to file - name: golang:1.23 entrypoint: /bin/bash args: - -c - | go install github.com/jstemmer/go-junit-report/v2@latest 2>&1 go test -timeout 1m -v ./... | /go/bin/go-junit-report -set-exit-code -iocopy -out ${SHORT_SHA}_test_log.xml
Artifact Registry にアップロードする: 構成ファイルで
goModulesフィールドを使用して、Artifact Registry のアプリケーション パスと Go リポジトリを指定します。# Upload Go module to artifact registry artifacts: goModules: - repositoryName: 'repositoryName' repositoryLocation: 'location' repositoryProjectId: 'projectId' sourcePath: 'sourcePath' modulePath: 'appPath' moduleVersion: 'version'次の値を置き換えます。
省略可: 系統生成を有効にする
Cloud Build は、検証可能なソフトウェア アーティファクトのためのサプライ チェーン レベル(SLSA)ビルドの来歴メタデータを生成し、継続的インテグレーション パイプラインの保護をサポートします。
来歴の生成を有効にするには、構成ファイルの
optionsセクションにrequestedVerifyOption: VERIFIEDを追加します。ビルドが完了すると、Artifact Registry でリポジトリの詳細を表示できます。
また、ビルドの来歴メタデータの表示や来歴の検証を行うこともできます。
テストログを Cloud Storage に保存する: 既存のバケットのロケーションとテストログのパスを指定して、テストログを Cloud Storage に保存するように Cloud Build を構成できます。
次のビルドステップでは、JUNIT XML ファイルに保存したテストログを Cloud Storage バケットに保存します。
# Save test logs to Google Cloud Storage artifacts: objects: location: gs://$_BUCKET_NAME/ paths: - ${SHORT_SHA}_test_log.xml次のスニペットは、前の手順の完全なビルド構成ファイルを示しています。
steps: # Run tests and save to file - name: golang:1.23 entrypoint: /bin/bash args: - -c - | go install github.com/jstemmer/go-junit-report/v2@latest 2>&1 go test -timeout 1m -v ./... | /go/bin/go-junit-report -set-exit-code -iocopy -out ${SHORT_SHA}_test_log.xml # Store golang modules in Google Artifact Registry artifacts: goModules: - repositoryName: 'repositoryName' repositoryLocation: 'location' repositoryProjectId: 'projectId' sourcePath: 'sourcePath' modulePath: 'appPath' moduleVersion: 'version'gcloud CLI を使用してビルドを開始するか、ビルドトリガーを作成します。
Google Cloud CLI
gcloud builds submit --region=us-west2 --config=cloudbuild.yaml \
--substitutions=_AR_REPO_NAME="AR_REPO_NAME"
トリガーの作成
ビルドトリガーを作成するの手順に沿って操作します。[置換変数] フィールドには、Artifact Registry リポジトリの名前と、テストログ用の Cloud Storage バケットの名前も指定する必要があります。
次のステップ
- Compute Engine で Blue/Green デプロイを実行する方法を学習する。
- ビルドエラーをトラブルシューティングする方法について学習する。