Go アプリケーションをビルドしてテストする

このページでは、Cloud Build を使用して Go アプリケーションのビルドとテストを行い、アーティファクトを Artifact Registry にアップロードし、来歴情報を生成して、テストログを Cloud Storage に保存する方法について説明します。

始める前に

このページの説明は、Go と以下の知識があることを前提としています。

  • Enable the Cloud Build, Cloud Run, and Artifact Registry APIs.

    Enable the APIs

  • このページで gcloud コマンドを実行するには、Google Cloud CLI をインストールします。
  • Go プロジェクトを用意します。
  • Artifact Registry に Go リポジトリを用意します。リポジトリがない場合は、新しいリポジトリを作成します。
  • テストログを Cloud Storage に保存する場合は、Cloud Storage にバケットを作成します。

サービス アカウントを構成する

このドキュメントの例では、ユーザー指定のサービス アカウントを使用します。Cloud Build で使用されるサービス アカウントを作成するには、Google Cloud CLI で次のコマンドを実行します。

gcloud iam service-accounts create cloud-build-go \
--description="Build and test Go applications" \
--display-name="Cloud Build Go" \
--project="PROJECT_ID"

デフォルトのコンピューティング サービス アカウント(Cloud Run で使用)には、新しいサービス アカウントとして機能するための権限が必要です。まず、プロジェクトのコンピューティング サービス アカウントの名前を決定します。

gcloud iam service-accounts list --filter="email:-compute@developer.gserviceaccount.com"

次に、サービス アカウント ユーザー(roles/iam.serviceAccountUserロールを付与します。

gcloud iam service-accounts add-iam-policy-binding \
COMPUTE_SERVICE_ACCOUNT_EMAIL  \
--member="serviceAccount:cloud-build-go@PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"

COMPUTE_SERVICE_ACCOUNT_EMAIL は、前のコマンドで出力されたデフォルトのコンピューティング サービス アカウントのメールアドレスに置き換えます。

IAM 権限を構成する

必要な権限があることを確認します。

Cloud Build でビルドを実行するために必要な権限を取得するには、ビルド サービス アカウントに対して Cloud Build サービス アカウントroles/cloudbuild.builds.builder)IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

ビルドされたアーティファクトを Artifact Registry に保存するために必要な権限を取得するには、ビルド サービス アカウントに対する Artifact Registry 書き込みroles/artifactregistry.writer)IAM ロールを付与するよう管理者に依頼してください。

テストログを Logging に保存するために必要な権限を取得するには、ビルド サービス アカウントに対するストレージ オブジェクト作成者roles/storage.objectCreator)IAM ロールを付与するよう管理者に依頼してください。

アプリケーションを Cloud Run にデプロイするために必要な権限を取得するには、ビルド サービス アカウントに対する Cloud Run デベロッパーroles/run.developer)IAM ロールを付与するよう管理者に依頼してください。

Go ビルドを構成する

Docker Hub にある一般公開の golang イメージは、Go モジュールを使用したビルドの作成に対応しています。このイメージを Cloud Build 構成ファイルのビルドステップとして使用すると、イメージ内で go コマンドを呼び出すことができます。このビルドステップに渡された引数が golang ツールに直接渡されるので、このイメージで任意の go コマンドを実行できます。

このセクションでは、cloud-build-samples Git リポジトリから Go アプリのサンプルのビルド構成ファイルを作成する方法について説明します。ビルド構成ファイルには、アプリのビルド、単体テストの追加、テスト合格後のアプリのデプロイの手順が含まれています。

Go サンプル アプリケーションをビルドするには:

  1. 単体テストを構成する: アプリケーションで単体テストを定義している場合、ビルドステップに次のフィールドを追加してテストを実行するように 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
        
  2. 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'
    

    次の値を置き換えます。

    • repositoryName: Artifact Registry の Go リポジトリの名前。
    • location: Artifact Registry 内のリポジトリの場所
    • projectId: Artifact Registry リポジトリを含む Google Cloud プロジェクトの ID。
    • sourcePath: ビルドのワークスペースにある go.mod ファイルのパス。
    • appPath: パッケージ化されたアプリケーションのパス。
    • version: アプリケーションのバージョン番号。v1.0.1 のように数字とドットで書式設定します。
  3. 省略可: 来歴の生成を有効にする

    Cloud Build は、検証可能なソフトウェア アーティファクトのためのサプライ チェーン レベル(SLSA)ビルドの来歴メタデータを生成し、継続的インテグレーション パイプラインの保護をサポートします。

    来歴の生成を有効にするには、構成ファイルの options セクションに requestedVerifyOption: VERIFIED を追加します。

    ビルドが完了すると、Artifact Registry でリポジトリの詳細を表示できます。

    また、ビルドの来歴メタデータの表示来歴の検証を行うこともできます。

  4. テストログを 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'
          repositoryProject_id: 'projectId'
          sourcePath: 'sourcePath'
          modulePath: 'appPath'
          moduleVersion: 'version'
    
  5. 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 バケットの名前も指定する必要があります。

次のステップ