🥬

Cloud Build リポジトリ第 2 世代で変更された機能を紹介

2023/12/21に公開

はじめに

こんにちは、クラウドエース SRE ディビジョンの黒田です。
今回は 7 月 20 日に一般公開された Cloud Build リポジトリの第 2 世代に関して、第 1 世代との違いと新しく追加された機能に関して説明したいと思います。

Cloud Build の簡単な説明

Cloud Build は様々な種類のリポジトリやストレージからソースコードをインポートし仕様に合わせてビルドを実行するサービスです。
Google Cloud 上で CI/CD を実装する際に使用されるサービスであり、迅速かつ安全なソフトウェアのデリバリーが可能になります。
https://cloud.google.com/build/docs/overview?hl=ja

Cloud Build のリポジトリは GitHub や Bitbucket などのソースコード管理プロバイダのリポジトリと接続を作成し、管理することが可能です。
https://cloud.google.com/build/docs/repositories?hl=ja

Cloud Build リポジトリの第 1 世代と第 2 世代の違い

この章では第 2 世代で新しく変更された機能について説明します。

リポジトリの接続が gcloud コマンドや Terraform で可能になった

リポジトリの第 1 世代では、接続の際にコンソール画面から手動で接続する必要がありましたが、第 2 世代から gcloud コマンドや Terraform で接続することが可能になりました。特に Terraform での管理が可能になったことでリポジトリの接続に関してもコードで管理することが可能になりました。

GitLab リポジトリの接続が可能になった

Cloud Build リポジトリ第 1 世代では接続できない GitLab のリポジトリも第 2 世代では接続可能になりました。
Terraform のプロバイダーもあるので、 GitLab リポジトリに関するコードでの管理も可能になりました。
https://cloud.google.com/blog/ja/products/application-development/cloud-build-second-gen-features-for-gitlab-and-terraform
一方、第 2 世代から Bitbucket リポジトリの接続が不可になったので Bitbucket リポジトリを管理したい場合は第 1 世代を使用することをおすすめします。

その他にも、

  • リージョン指定が必須になった
  • ホストの接続が必須になった
    などが変更された機能になります。

機能の概要に関しては公式のドキュメントがありますので確認してみてください。
https://cloud.google.com/build/docs/repositories?hl=ja#repositories_1st_gen_and_repositories_2nd_gen

第 2 世代でのリポジトリ連携方法

この章では第 2 世代の最大の違いである Terraform でのリポジトリの接続方法について解説します。
尚、解説する接続方法を公式のドキュメントを参考に説明します。
https://cloud.google.com/build/docs/automating-builds/github/connect-repo-github?hl=ja&generation=2nd-gen

1. 事前の準備

リポジトリの接続作業の前に以下の項目に関して準備しておく必要があります。

  • リポジトリ接続用のプロジェクトを作成
  • Cloud Build API と Secret Manager API の有効化
  • 接続用のリポジトリを用意(今回は GitHub リポジトリ)

2. GitHub アクセス トークンを Secret Manager に保存する

GitHub の個人用アクセス トークンを作成します。
https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens
作成した個人用アクセス トークンはこの後使うのでメモに残して保管しておきましょう。

次にコンソールからシークレットを作成して個人用アクセス トークンを保存します。
保存方法は以下のドキュメント通りです。
https://cloud.google.com/secret-manager/docs/creating-and-accessing-secrets?hl=ja#create
上記 Secret Manager にシークレットを作成する手順の [シークレットの値]には先程メモした個人用アクセス トークンを記入しましょう。

3. GitHub ホストとリポジトリをプログラムで接続する

次に、 GitHub Apps の Cloud Build アプリケーションのインストール ID を入手します。
インストール ID の確認方法は https://github.com/apps/google-cloud-build/installations/select_target にアクセスして接続したいリポジトリが所属する組織を選択します。
下記のような画面になるので、このページの URL の最後にある数字がインストール ID です。
GitHub app のインストール ID 確認画面
例としてURLが https://github.com/settings/installations/1234567 だった場合、インストール ID は数値 1234567 です。こちらもこの後使うのでメモしておきましょう。

次に、適した実行環境で下記の Terraform コードを terraform apply でデプロイし GitHub ホストとリポジトリの接続をします。

// Terraform Google プロバイダーを構成する
terraform {
  required_providers {
    google = {}
  }
}

data "google_secret_manager_secret" "sample-secret" {
  project   = "PROJECT_ID"
  secret_id = "SECRET_ID"
}
// 個人アクセス トークンのシークレットを取得し、サービス エージェントにアクセス許可を付与します。
data "google_secret_manager_secret_version" "sample-version" {
  project = "PROJECT_ID"
  secret  = data.google_secret_manager_secret.sample-secret.id
  version = "latest"
}

resource "google_secret_manager_secret_iam_member" "policy" {
  project     = data.google_secret_manager_secret.sample-secret.project
  secret_id   = data.google_secret_manager_secret.sample-secret.secret_id
  role        = "roles/secretmanager.secretAccessor"
  member      = "serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com"
}

// GitHub の接続を作成
resource "google_cloudbuildv2_connection" "my_connection" {
  project  = "PROJECT_ID"
  location = "REGION"
  name     = "CONNECTION_NAME"

  github_config {
    app_installation_id = "INSTALLATION_ID"
    authorizer_credential {
      oauth_token_secret_version = data.google_secret_manager_secret_version.sample-version.id
    }
  }
  depends_on = [google_secret_manager_secret_iam_member.policy]
}

// リポジトリの接続を作成
resource "google_cloudbuildv2_repository" "my_repository" {
  project           = "PROJECT_ID"
  location          = "REGION"
  name              = "REPO_NAME"
  parent_connection = google_cloudbuildv2_connection.my_connection.name
  remote_uri        = "URI"
}

ここでは、以下の項目を実際の値に置き換えてコード化してください。

  • SECRET_ID は、作成した Secret Manager のシークレットの ID です。
  • PROJECT_NUMBER は Google Cloud のプロジェクト番号です。
  • PROJECT_ID は Google Cloud のプロジェクト ID です。
  • REGION は、リポジトリ接続のリージョンです。
  • CONNECTION_NAME は GitHub 接続の名前です。構築後にコンソール画面に表示される値です。下記の画像の sample-connection にあたる部分です。
  • INSTALLATION_ID は、 GitHub Apps の Cloud Build アプリケーションのインストール ID です。
  • REPO_NAME は、 GitHub リポジトリの名前です。
  • URI は、 GitHub リポジトリのホスト URI です。例: https://github.com/myuser/myrepo.git

上記のコードを terraform apply でデプロイすると すると Cloud Build リポジトリが GitHub リポジトリに接続されます。

リポジトリ連携コンソール画面

まとめ

今回は Cloud Build リポジトリの第 2 世代を使って、GitHub リポジトリの接続を Terraform を使ってコード化する方法について説明しました。今後は Cloud Build リポジトリ第 2 世代を使用して CI/CD パイプラインを作成していきたいです。

Discussion