Cloud Build を使用して Git リポジトリからワークフローをデプロイする

Cloud Build トリガーを使用して、ビルドを自動的に開始し、Git リポジトリからワークフローをデプロイできます。ソース リポジトリが変更されたときにワークフローをデプロイするようにトリガーを構成できます。また、変更が特定の条件に一致する場合にのみワークフローをデプロイすることもできます。

このアプローチは、デプロイ ライフサイクルを管理する際に活用できます。たとえば、ステージング環境でワークフローの変更をデプロイし、その環境に対してテストを実行して、これらの変更を本番環境に段階的にロールアウトできます。

始める前に

この手順では、トリガーを作成できるように、Google Cloud プロジェクトで Cloud Build 編集者のロールroles/cloudbuild.builds.editor)を付与されていることを前提としています。また、GitHub や Bitbucket などのソース リポジトリにワークフローも必要です。

Console

  1. Cloud Build API と Workflows API を有効にします。

    API を有効にする

  2. Workflows 管理者のロールroles/workflows.admin)を Cloud Build サービス アカウントに付与します。

    1. Google Cloud コンソールの [IAM] ページに移動します。

      [IAM] に移動

    2. プロジェクトを選択します。

    3. Cloud Build サービス アカウント(PROJECT_NUMBER@cloudbuild.gserviceaccount.com)の行で、 [プリンシパルを編集] をクリックします。

    4. [ 別のロールを追加] をクリックします。

    5. [ロール] リストで、[ワークフロー管理者] ロールを選択します。

    6. [保存] をクリックします。

  3. Compute Engine のデフォルト サービス アカウントのサービス アカウント ユーザー ロールroles/iam.serviceAccountUser)を Cloud Build サービス アカウントに付与します。Compute Engine API を有効にした場合、Compute Engine のデフォルトのサービス アカウントは PROJECT_NUMBER-compute@developer.gserviceaccount.com です。

    1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

      [サービス アカウント] に移動

    2. プロジェクトを選択します。

    3. Compute Engine のデフォルトのサービス アカウント(PROJECT_NUMBER-compute@developer.gserviceaccount.com)のメールアドレスをクリックします。

    4. [権限] タブをクリックします。

    5. [アクセスを許可] ボタンをクリックします。

    6. 新しいプリンシパルを追加するには、サービス アカウントのメールアドレス(SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com)を入力します。

    7. [ロールを選択] リストで、[サービス アカウント] > [サービス アカウント ユーザー] ロールを選択します。

    8. [保存] をクリックします。

gcloud

  1. Cloud Build API と Workflows API を有効にします。

    gcloud services enable cloudbuild.googleapis.com \
      workflows.googleapis.com
    
  2. Workflows 管理者のロールroles/workflows.admin)を Cloud Build サービス アカウントに付与します。

    PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format='value(projectNumber)')
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role=roles/workflows.admin
    

    PROJECT_ID は、Google Cloud プロジェクトの ID に置き換えます。

  3. Compute Engine のデフォルト サービス アカウントのサービス アカウント ユーザー ロールroles/iam.serviceAccountUser)を Cloud Build サービス アカウントに付与します。Compute Engine API を有効にした場合、Compute Engine のデフォルトのサービス アカウントは PROJECT_NUMBER-compute@developer.gserviceaccount.com です。

    gcloud iam service-accounts add-iam-policy-binding \
      $PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role=roles/iam.serviceAccountUser
    

ソース リポジトリに接続する

リポジトリで発生したイベントに応じて Cloud Build がビルドを自動化できるようにするには、Cloud Build をソース リポジトリに接続する必要があります。

GitHub または Bitbucket に接続するには、次の手順を実行します。

  1. Google Cloud コンソールで、[Cloud Build トリガー] ページに移動します。

    [トリガー] に移動

  2. 必要に応じて、プロジェクトを選択して [開く] をクリックします。

  3. [リージョン] リストから、トリガーを作成するリージョンを選択します。

  4. [リポジトリを接続] をクリックします。

  5. ソースコードを保存したソース リポジトリを選択します。

    例: GitHub(Cloud Build GitHub アプリ)

  6. [続行] をクリックします。

  7. ユーザー名とパスワードを使用して、ソース リポジトリに対する認証を行います。

    GitHub にログインする場合は、続行するために Google Cloud Build GitHub アプリから GitHub アカウントへのアクセスを承認するように求められます。

  8. 使用可能なリポジトリのリストからリポジトリを選択して、[OK] をクリックします。

    GitHub や Bitbucket などの外部リポジトリを使用するには、作業中の Google Cloud プロジェクトでオーナーレベルの権限が必要になります。

  9. 同意の免責条項を読み、横にあるチェックボックスをオンにして、利用規約に同意することを表明します。

  10. [Connect] をクリックします。

  11. リポジトリのソースコードのビルドを自動化するビルドトリガーの作成を続けるには、[トリガーを作成する] をクリックします。それ以外の場合は [完了] をクリックします。

Cloud Build 構成ファイルを作成する

ビルド構成ファイルでは、ビルドトリガーを使用してビルドを開始する際に必要となるフィールドを定義します。プロジェクトのルート ディレクトリに構成ファイルを作成し、YAML または JSON のいずれかを使用して記述します。

たとえば、次の構成ファイルでは、テスト ワークフローをデプロイして実行し、スクリプトを使用して出力を確認します。テストに合格すると、ワークフローがデプロイされます。

steps:
# Deploy the test workflow with the commit sha
- id: 'deploy-test-workflow'
  name: 'gcr.io/cloud-builders/gcloud'
  args: ['workflows', 'deploy', '$_WORKFLOW_NAME-$BRANCH_NAME-$SHORT_SHA', '--source', 'gitops/workflow.yaml']

# Run the test workflow and capture the output
- id: 'run-test-workflow'
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args: ['-c', 'gcloud workflows run $_WORKFLOW_NAME-$BRANCH_NAME-$SHORT_SHA > /workspace/testoutput.log']

# Delete the test workflow
- id: 'delete-test-workflow'
  name: 'gcr.io/cloud-builders/gcloud'
  args: ['workflows', 'delete', '$_WORKFLOW_NAME-$BRANCH_NAME-$SHORT_SHA', '--quiet']

# Check the test output
- id: 'check-test-workflow'
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args: ['gitops/test-$BRANCH_NAME.sh']

# Deploy the workflow
- id: 'deploy-workflow'
  name: 'gcr.io/cloud-builders/gcloud'
  args: ['workflows', 'deploy', '$_WORKFLOW_NAME-$BRANCH_NAME', '--source', 'gitops/workflow.yaml']

Git リポジトリからビルドがトリガーされると、Cloud Build によって、$BRANCH_NAME$SHORT_SHA置換変数が設定されます。置換変数は、ブランチ名、およびビルドに関連付けられた commit ID の最初の 7 文字を表します。

$_WORKFLOW_NAME 置換変数を使用すると、別の変数値で構成ファイルを再利用できます。この値は、ビルドトリガーの作成時に指定できます。

詳細については、ビルド構成ファイルを作成するをご覧ください。

ビルドトリガーを作成する

Cloud Build トリガーを作成すると、ワークフローのデプロイを自動化できます。

前のセクションの構成ファイルのビルドトリガーを作成するには:

  1. Google Cloud コンソールで、[Cloud Build トリガー] ページに移動します。

    [トリガー] に移動

  2. [トリガーを作成] をクリックします。

  3. [名前] 欄にトリガーの名前を入力します。

  4. [イベント] で、トリガーを呼び出すイベントを選択します。

    例: ブランチに push する

  5. [ソース] で、トリガーを開始するリポジトリとブランチまたはタグ名を選択します。正規表現を使用して、ブランチまたはタグとの照合を指定できます。

    例: GoogleCloudPlatform/workflows-demos(リポジトリ)と ^main$|^staging$main ブランチと staging ブランチと一致)

  6. [含まれるファイルと無視されるファイル フィルタを表示] セクションを展開し、含まれるファイルとしてワークフローを指定すれば、ワークフローが変更されたときにビルドが呼び出されます。

    例: gitops/workflow.yaml

  7. [構成] で、タイプとして [Cloud Build 構成ファイル(YAML または JSON)] を選択し、ロケーションとして [リポジトリ] を選択します。

  8. [Cloud Build 構成ファイルの場所] フィールドに、ファイルの場所を指定します。

    例: gitops/cloudbuild.yaml

  9. 必要に応じて、置換変数を追加するには、[変数を追加] をクリックしてキーと値の組み合わせを指定します。

    例: _WORKFLOW_NAME(変数)や workflows-gitops(値)

  10. ビルドトリガーを保存するには、[作成] をクリックします。

Git リポジトリの指定されたブランチ内のワークフローに変更が push されると、ワークフローをデプロイするために Cloud Build が自動的にトリガーされます。

詳細については、ビルドトリガーを作成して管理するをご覧ください。

ビルドトリガーをテストする

前のセクションのビルドトリガーと構成ファイルをテストできます。

  1. Git リポジトリの staging ブランチで workflow.yaml を編集し、Hello WorldBye World に変更します。

    main:
      steps:
        - init:
            assign:
              - message: "Hello World"
        - returnResult:
            return: ${message}
  2. staging ブランチへの変更を commit し、push します。

    git add workflow.yaml
    git commit -m "Update workflow.yaml in staging"
    git push
    

    Cloud Build トリガーがビルドを実行し、開始します。

  3. ビルドが成功したことを確認するには、Google Cloud コンソールで [ビルド履歴] ページに移動します。

    [ビルド履歴] に移動

    ビルドの完了後、Cloud Build はビルド全体と個々のビルドステップの全体的なステータスを表示します。詳細については、ビルド結果を表示するをご覧ください。

  4. ステージング ワークフローがデプロイされていることを確認するには、Google Cloud コンソールで [ワークフロー] ページに移動します。

    [ワークフロー] に移動

    workflows-gitops-staging という名前のワークフローが表示されます。

  5. ステージング ワークフローを本番環境にデプロイするには、staging ブランチを main ブランチにマージします。

    git checkout main
    git merge staging
    git push
    

    test-main.sh はワークフローの出力で Hello World を想定しているため、ビルドは失敗します。

    RESULT_EXPECTED="result: '\"Hello World\"'"
    RESULT_ACTUAL=$(grep "result: " $FILE)
    if [[ $RESULT_EXPECTED == $RESULT_ACTUAL ]]; then
      echo "Result test passed"
    else
      echo "Result test failed. Expected: $RESULT_EXPECTED Actual: $RESULT_ACTUAL"; exit 1;
    fi
  6. 本番環境ワークフローを正常にデプロイするには、staging ブランチで workflow.yaml を再度編集し、文字列を Hello World に戻します。

  7. staging ブランチに変更を commit して push し、staging ブランチを main ブランチにマージします。

  8. 本番環境ワークフローがデプロイされていることを確認するには、Google Cloud コンソールで [ワークフロー] ページに移動します。

    [ワークフロー] に移動

    workflows-gitops-main という名前のワークフローが表示されます。

次のステップ