連結至 GitHub 存放區

本頁說明如何將 GitHub 存放區連結至 Cloud Build。如要進一步瞭解 Cloud Build 存放區,請參閱「Cloud Build 存放區」。

事前準備

  • 啟用 Cloud Build 和 Secret Manager API。

    啟用 API 時所需的角色

    如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    啟用 API

  • 在 GitHub 存放區中準備好原始碼。
  • 在 GitHub 來源存放區中,擁有 DockerfileCloud Build 設定檔
  • 如果一開始是將存放區連結至 Cloud Build,請確認您在存放區中擁有管理員層級的權限。如要進一步瞭解 GitHub 存放區權限,請參閱「機構的存放區權限等級」。
  • 如要使用本頁的 gcloud 指令,請安裝 Google Cloud CLI

連線至 GitHub 主機

控制台

如要將 GitHub 存放區連結至 Cloud Build,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中開啟「Repositories」(存放區) 頁面。

    開啟「Repositories」(存放區) 頁面

    畫面會顯示「Repositories」頁面。

  2. 在頂端列的專案選取器中,選取您的 Google Cloud 專案。

  3. 選取頁面頂端的「第 2 代」分頁標籤。

  4. 按一下「建立主機連線」,將新主機連結至 Cloud Build。

  5. 在左側面板中,選取「GitHub」GitHub做為來源供應商。

  6. 在「設定連線」部分,輸入下列資訊:

    • 「Region」(區域):選取連線的區域。

    • 名稱:輸入連線名稱。

  7. 選用:如要管理用於加密 GitHub 存放區存取權杖的加密金鑰,請前往「Encryption」(加密) 部分,然後選擇 Cloud Key Management Service 金鑰。詳情請參閱「為 Secret Manager 啟用客戶管理的加密金鑰」。

  8. 按一下「連線」

    點選「連線」按鈕後,系統會要求您授權 Cloud Build GitHub 應用程式存取 GitHub 帳戶。您隨時可以從主機解除安裝或刪除應用程式,藉此撤銷應用程式的存取權。

    Cloud Build 會要求授權您的 GitHub 使用者帳戶,並將產生的授權權杖以密鑰形式儲存在專案的 Secret Manager 中。授權權杖用於驗證使用者帳戶的存取權,以便安裝 Cloud Build GitHub 應用程式,以及連結至存放區。Cloud Build 服務代理帳戶 (service-{projectNumber}@gcp-sa-cloudbuild.iam.gserviceaccount.com) 用於存取密鑰。如要查看密鑰,請參閱「列出密鑰並查看密鑰詳細資料」。

    授權 Cloud Build GitHub 應用程式後,系統會將您重新導向至 Cloud Build 的「存放區」頁面。

gcloud

如要使用 gcloud 連線至 GitHub 主機,請完成下列步驟:

  1. 輸入下列指令,發起與 GitHub 存放區的連線:

     gcloud builds connections create github CONNECTION_NAME --region=REGION
    

    其中:

    • CONNECTION_NAME 是連線名稱,會顯示在 Cloud Build 中。
    • REGION 是觸發條件的區域

    執行 gcloud builds connections 指令後,您會看到授權 Cloud Build GitHub 應用程式的連結。

  2. 登入 github.com 帳戶。

  3. 點選連結,授權 Cloud Build GitHub 應用程式。

    授權應用程式後,Cloud Build 會將驗證權杖以密鑰的形式儲存在專案的 Secret Manager 中。 Google Cloud您可以在「Secret Manager」頁面查看密鑰。

  4. 在您的帳戶或組織中安裝 Cloud Build GitHub 應用程式。

    使用 GitHub 帳戶允許安裝,並在系統提示時選取存放區權限。

  5. 執行下列指令,驗證 GitHub 連線的安裝作業:

     gcloud builds connections describe CONNECTION_NAME --region=REGION
    

    其中:

    • CONNECTION_NAME 是 Cloud Build 中的 GitHub 主機連線名稱。
    • REGION 是觸發條件的區域

    如果 installationState 欄位設為 COMPLETE,表示您已成功安裝連結。否則,installationState 欄位會提供連結,引導您完成其他必要步驟。

透過程式輔助方式連線至 GitHub 主機

如要以程式輔助方式連線至 GitHub 主機,您必須先設定連線的驗證權杖,然後在 Cloud Build 中建立 GitHub 連線。

設定驗證權杖

如要透過程式輔助方式連線至 GitHub 主機,請建立 Cloud Build GitHub 連線,包括驗證權杖的密碼。您可以透過下列兩種方式取得驗證權杖:

  • 在 GitHub 中建立個人存取權杖。

  • 使用現有 Cloud Build GitHub 連線的權杖。如果 GitHub 帳戶有相關限制,導致無法建立個人存取權杖,這個方法就很有幫助。此外,如果您在從指令碼建立連線時參照這個權杖,就不需要使用網頁瀏覽器手動驗證連線。

個人存取權杖

  1. 按照步驟建立個人存取權杖

  2. 在 GitHub 中收到提示時,請選取下列 OAuth 範圍

    • repo,授予公開和私人存放區的完整存取權。
    • read:user,授予讀取使用者個人資料資料的權限。
    • read:org,取得機構成員和專案的唯讀存取權 (如果應用程式安裝在機構中)。
  3. 儲存個人存取權杖的值。 後續步驟會用到。

現有連線

  1. 在 gcloud CLI 中執行下列指令:

    gcloud builds connections describe CONNECTION_NAME --region=REGION
    

    其中:

    • CONNECTION_NAME 是 GitHub 主機連線的名稱。
    • REGION 是觸發條件的區域
  2. 在指令輸出中,authorizerTokenSecretVersion 的值是含有連線驗證權杖的密鑰 ID。複製這個值並妥善保存,您會在後續步驟中使用產生的權杖。

建立 GitHub 連線

使用 Terraform 或 gcloud CLI 建立 GitHub 連線。

Terraform

如要使用 Google Terraform 供應商將 GitHub 主機連至 Cloud Build,請完成下列步驟:

  1. 在您的 GitHub 帳戶或所屬機構中安裝 Cloud Build GitHub 應用程式

  2. 在 Terraform 中設定 GitHub 連線。下列 Terraform 程式碼範例顯示的設定會執行下列操作:

    • 設定 Terraform Google 提供者

    • 建立密鑰來儲存 GitHub 個人存取權杖

    • 授予 Cloud Build 服務代理存取密鑰的權限

    • 建立 GitHub 連線

    // Configure the terraform google provider
    terraform {
      required_providers {
        google = {}
        }
    }
    
    // Create a secret containing the personal access token and grant permissions to the Service Agent
    resource "google_secret_manager_secret" "github_token_secret" {
        project = PROJECT_ID
        secret_id = SECRET_ID
    
        replication {
            auto {}
        }
    }
    
    resource "google_secret_manager_secret_version" "github_token_secret_version" {
        secret = google_secret_manager_secret.github_token_secret.id
        secret_data = GITHUB_PAT
    }
    
    data "google_iam_policy" "serviceagent_secretAccessor" {
        binding {
            role = "roles/secretmanager.secretAccessor"
            members = ["serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com"]
        }
    }
    
    resource "google_secret_manager_secret_iam_policy" "policy" {
      project = google_secret_manager_secret.github_token_secret.project
      secret_id = google_secret_manager_secret.github_token_secret.secret_id
      policy_data = data.google_iam_policy.serviceagent_secretAccessor.policy_data
    }
    
    // Create the GitHub connection
    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 = google_secret_manager_secret_version.github_token_secret_version.id
            }
        }
        depends_on = [google_secret_manager_secret_iam_policy.policy]
    }
    

其中:

  • PROJECT_NUMBER 是您的 Google Cloud 專案編號。
  • SECRET_ID 是 GitHub 個人存取權杖的 ID,或是 Secret Manager 中的密鑰。
  • GITHUB_PAT 是 GitHub 中個人存取權杖的存取權杖。
  • PROJECT_ID 是您的 Google Cloud 專案 ID。
  • REGION 是連線的區域
  • CONNECTION_NAME 是連線名稱,會顯示在 Cloud Build 中。
  • INSTALLATION_ID 是 Cloud Build GitHub 應用程式的安裝 ID。您可以在 Cloud Build GitHub 應用程式的網址中找到安裝 ID。在下列網址中,https://github.com/settings/installations/1234567 安裝 ID 是數值 1234567

gcloud

如要將 GitHub 主機連結至 Cloud Build,請按照下列步驟操作:

  1. 在您的 GitHub 帳戶或所屬機構中安裝 Cloud Build GitHub 應用程式

  2. 選用。如果您使用 GitHub 個人存取權杖進行驗證,請執行下列指令,將權杖儲存在 Google Cloud 專案的 Secret Manager 中:

    echo -n 'TOKEN' | gcloud secrets create SECRET_NAME --data-file=-
    
  3. 授予 Cloud Build 服務代理 Secret 的存取權,其中 SECRET_NAME 是儲存在 Secret Manager 中的 Secret 名稱:

    PROJECT_ID=$(gcloud config list --format="value(core.project)")
    PN=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")
    CLOUD_BUILD_SERVICE_AGENT="service-${PN}@gcp-sa-cloudbuild.iam.gserviceaccount.com"
    gcloud secrets add-iam-policy-binding SECRET_NAME \
      --member="serviceAccount:${CLOUD_BUILD_SERVICE_AGENT}" \
      --role="roles/secretmanager.secretAccessor"
    
  4. 建立 GitHub 連線:

    gcloud builds connections create github CONNECTION_NAME \
      --authorizer-token-secret-version=projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION  \
      --app-installation-id=INSTALLATION_ID --region=REGION
    

    其中:

    • CONNECTION_NAME 是 Cloud Build 中 GitHub 主機連線的名稱。
    • PROJECT_ID 是您的 Google Cloud 專案 ID。
    • SECRET_NAME 是您儲存在 Secret Manager 中的密鑰名稱。
    • VERSION 是密鑰的版本。
    • INSTALLATION_ID 是 GitHub 應用程式的安裝 ID。您可以在 Cloud Build GitHub 應用程式的網址中找到安裝 ID。在下列網址中,https://github.com/settings/installations/1234567,安裝 ID 是數值 1234567
    • REGION 是連線的區域

連結 GitHub 存放區

控制台

如要將 GitHub 存放區連結至主機連線,請完成下列步驟:

  1. 在 Google Cloud 控制台中開啟「Repositories」(存放區) 頁面。

    開啟「Repositories」(存放區) 頁面

    畫面會顯示「Repositories」頁面。

  2. 選取頁面頂端的「第 2 代」分頁標籤。

  3. 按一下「連結存放區」,連結連線中的存放區。

    「連結存放區」面板隨即顯示。

  4. 在「連結存放區」面板中,輸入下列資訊:

    1. 連線:從下拉式選單中選取連線。
    2. 存放區:選取要連結至連線的存放區。

    3. 存放區名稱:輸入存放區的名稱。

      1. 產生:選取這個選項後,Cloud Build 會自動為所選存放區產生存放區名稱。
      2. 手動:選取這個選項,即可手動為所選存放區指定名稱。

        如果選取「手動」,您可以在「存放區名稱」部分修改所選存放區的名稱。

  5. 按一下「連結」,將存放區連結至連線。

gcloud

如要將 GitHub 存放區新增至連線,請輸入下列指令:

   gcloud builds repositories create REPO_NAME \
     --remote-uri=REPO_URI \
     --connection=CONNECTION_NAME --region=REGION

其中:

  • REPO_NAME 是存放區的名稱。
  • REPO_URI 是 GitHub 存放區的連結。例如:https://github.com/cloud-build/test-repo.git
  • CONNECTION_NAME 是在 Cloud Build 中建立的 GitHub Enterprise 主機連線名稱,請參閱「連結至 GitHub 主機」。
  • REGION 是連線的區域

Terraform

如要在連線中新增 GitHub 存放區,請將下列程式碼片段新增至 Terraform 設定:

    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"
  }

其中:

  • PROJECT_ID 是您的 Google Cloud 專案 ID。
  • REPO_NAME 是 GitHub 存放區的名稱。
  • REGION 是連線的區域
  • URI 是存放區的主機 URI。例如:https://github.com/myuser/myrepo.git

後續步驟