Go アプリケーションのビルドとテスト

このページでは、Cloud Build を使用して Go アプリケーションをビルド、テスト、デプロイする方法について説明します。

準備

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

  • Cloud Build, Cloud Run, and Artifact Registry API を有効にします。

    API を有効にする

  • このページで gcloud コマンドを実行するには、Google Cloud CLI をインストールします。
  • Go プロジェクトを用意します。
  • Cloud Build を使用して Go アプリをコンテナ化する場合は、ソースコードとともに Dockerfile が必要になります。
  • ビルドしたコンテナを Artifact Registry に保存する場合は、Artifact Registry に Docker リポジトリを作成します。
  • テストログを Cloud Storage に保存する場合は、Cloud Storage にバケットを作成します。

必要な IAM 権限

これらのロールを付与する方法については、IAM ページを使用してロールを付与するをご覧ください。

Go ビルドの構成

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

このセクションでは、Go アプリのビルド構成ファイルの例を紹介します。これにはアプリのビルド、単体テストの追加、テスト合格後、アプリをコンテナ化、デプロイするためのビルドステップが含まれます。

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

  1. プロジェクトのルート ディレクトリに、cloudbuild.yaml という名前で Cloud Build 構成ファイルを作成します。

  2. ビルドとテスト: アプリケーションで単体テストを定義している場合、ビルドステップに次のフィールドを追加してテストを実行するように 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.21
          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
  3. アプリをコンテナ化する: ビルドステップを追加してテストに合格したことを確認したら、アプリケーションをビルドします。Cloud Build には、Go アプリケーションのコンテナ化に使用できるビルド済み Docker イメージがあります。アプリをコンテナ化するには、ビルドステップに次のフィールドを追加します。

    • name: タスクにビルド済みの Docker イメージを使用するには、このフィールドの値を gcr.io/cloud-builders/docker に設定します。
    • args: docker build コマンドの引数を、このフィールドの値として追加します。

    次のビルドステップでは、イメージ myimage をビルドし、commit ID の短縮バージョンでタグ付けします。ビルドステップでは、プロジェクト ID、リポジトリ名、短縮 SHA 値の置換を使用するため、これらの値はビルド時に自動的に置き換えられます。イメージを保存するためには、Artifact Registry に Docker リポジトリを作成するか、既存のリポジトリが必要です。

    # Docker Build
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t',
             'us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA', '.']
  4. コンテナを Artifact Registry に push: ビルドされたコンテナは Artifact Registry 内に保存できます。Artifact Registry は、ビルド アーティファクトを保存、管理、保護するために使用できる Google Cloud サービスです。これを行うには、Artifact Registry 内に既存の Docker リポジトリが必要です。Artifact Registry Docker リポジトリにイメージを格納するように Cloud Build を構成するには、次のフィールドを含むビルドステップを追加します。

    • name: タスクに公式の docker ビルダー イメージを使用するには、このフィールドの値を gcr.io/cloud-builders/docker に設定します。
    • args: docker push コマンドの引数を、このフィールドの値として追加します。リンク先 URL には、イメージを保存する Artifact Registry Docker リポジトリを入力します。

    次のビルドステップでは、前の手順でビルドしたイメージを Artifact Registry に push します。

    # Docker push to Google Artifact Registry
    - name: 'gcr.io/cloud-builders/docker'
      args: ['push', 'us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA']
  5. コンテナを Cloud Run にデプロイする: Cloud Run にイメージをデプロイするには、次のフィールドを含むビルドステップを追加します。

    • name: このフィールドの値を google/cloud-sdk に設定して、gcloud CLI イメージを使用し、gcloud コマンドを呼び出して Cloud Run にイメージをデプロイします。
    • args: gcloud run deploy コマンドの引数をこのフィールドの値として追加します。

    次のビルドステップでは、以前にビルドしたイメージを Cloud Run にデプロイします。

    # Deploy to Cloud Run
    - name: 'gcr.io/cloud-builders/gcloud'
      args: ['run', 'deploy', 'helloworld-${SHORT_SHA}',
             '--image=us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA',
             '--region', 'us-central1', '--platform', 'managed']
  6. テストログを 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.21
        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
    
      # Docker Build
      - name: 'gcr.io/cloud-builders/docker'
        args: ['build', '-t',
               'us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA', '.']
    
      # Docker push to Google Artifact Registry
      - name: 'gcr.io/cloud-builders/docker'
        args: ['push', 'us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA']
    
      # Deploy to Cloud Run
      - name: 'gcr.io/cloud-builders/gcloud'
        args: ['run', 'deploy', 'helloworld-${SHORT_SHA}',
               '--image=us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA',
               '--region', 'us-central1', '--platform', 'managed']
    
    # Save test logs to Google Cloud Storage
    artifacts:
      objects:
        location: gs://$_BUCKET_NAME/
        paths:
          - ${SHORT_SHA}_test_log.xml
    # Store images in Google Artifact Registry
    images:
      - us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA
  7. gcloud CLI またはビルドトリガーを使用してビルドを開始します。 ビルドの起動時に Artifact Registry リポジトリ名を指定する必要があります。

    gcloud CLI を使用してビルドを開始するときに、Artifact Registry リポジトリを指定するには、次を実行します。

    gcloud builds submit --region=us-west2 --config=cloudbuild.yaml \
        --substitutions=_REPO_NAME="REPO_NAME"
    

    REPO_NAME を Artifact Registry リポジトリの名前に置き換えます。

    ビルドトリガーを使用してビルドするときに Artifact Registry リポジトリを指定するには、ビルドトリガーの作成時に置換変数フィールドで Artifact Registry リポジトリの名前を指定します。

次のステップ