排定執行時間

本文說明如何在 Dataform 執行下列操作:

下表比較了這兩種方法:

方法 目標 觸發條件類型
工作流程設定 在 Dataform 中,依時間執行的標準正式環境作業。 根據時間
Workflows 和 Cloud Scheduler Dataform 和其他 API 的輕量無伺服器自動化調度管理。 時間型或事件驅動型
Managed Airflow 複雜的管道,且依附元件位於 BigQuery 外部。 時間型或事件驅動型
Cloud Build 自動建構觸發條件 在 Git 推送後立即自動發布。 以事件為依據

事前準備

如要使用工作流程設定排定執行作業,或使用工作流程和 Cloud Scheduler 排定執行作業,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Dataform」頁面。

    前往 Dataform

  2. 選取或建立存放區。

  3. 建立版本設定。

如要使用 Managed Service for Apache Airflow 排定執行作業,請按照下列步驟操作:

  1. 選取或建立 Dataform 存放區。
  2. 為 Dataform 授予 BigQuery 存取權。
  3. 選取或建立 Dataform 工作區。
  4. 建立至少一個資料表。
  5. 建立 Managed Airflow 2 環境。

必要的角色

如要取得完成本文件工作所需的權限,請要求管理員授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

如要在建立工作流程設定時使用自訂服務帳戶,請授予自訂服務帳戶存取權。

如要在建立工作流程設定時使用 Google 帳戶的使用者憑證,請授予 Google 帳戶存取權。

如要啟用工作流程設定的排定執行作業,您必須將 iam.serviceAccounts.actAs 權限授予預設 Dataform 服務代理,用於工作流程設定中的自訂服務帳戶。服務帳戶使用者角色 (roles/iam.serviceAccountUser) 具備這項權限。詳情請參閱「使用嚴格 act-as 模式」。

如要提高排程安全性,請參閱「實作強化排程權限」。

為防止使用者使用使用者憑證排定或執行工作流程,組織管理員可以建立自訂組織政策限制,拒絕設定 end_user_auth_config。

使用工作流程設定排定執行作業

本節說明如何在 Dataform 中建立工作流程設定,以便排定及設定工作流程執行作業。您可以使用工作流程設定,排定 Dataform 工作流程的執行時間。

關於工作流程設定

如要排定 Dataform 在 BigQuery 執行所有或所選工作流程動作,可以建立工作流程設定。在工作流程設定中,您可以選取編譯版本設定、選取要執行的工作流程動作,以及設定執行排程。

接著,在排定執行工作流程設定時,Dataform 會將您從版本設定中最新編譯結果選取的動作部署至 BigQuery。您也可以使用 Dataform API workflowConfigs,手動觸發工作流程設定的執行作業。

Dataform 工作流程設定包含下列執行設定:

  • 工作流程設定的 ID。
  • 版本設定。
  • 服務帳戶。

    這是與工作流程設定相關聯的自訂服務帳戶。您可以選取與 Google Cloud 專案相關聯的自訂服務帳戶,也可以手動輸入其他服務帳戶。根據預設,工作流程設定會使用與存放區相同的服務帳戶。

    建立及執行排定的工作流程設定時,預設授權方法是使用服務帳戶憑證。

  • Google 帳戶使用者憑證

    如要手動建立及執行非排定的工作流程設定,預設授權方法是使用 Google 帳戶使用者憑證。詳情請參閱「授權給您的 Google 帳戶」。

  • 要執行的工作流程動作:

    • 所有動作。
    • 選取動作。
    • 選取標記。
  • 執行時間表和時區。

建立工作流程設定

如要建立 Dataform 工作流程設定,請按照下列步驟操作:

  1. 在存放區中,前往「Releases & Scheduling」。
  2. 在「Workflow configurations」(工作流程設定) 部分,按一下「Create」(建立)。
  3. 在「Create workflow configuration」(建立工作流程設定) 窗格的「Configuration ID」(設定 ID) 欄位中,輸入工作流程設定的專屬 ID。

    ID 只能使用數字、英文字母、連字號和底線。

  4. 在「Release configuration」(版本設定) 選單中,選取編譯版本設定。

  5. 在「Authentication」(驗證) 區段中,使用 Google 帳戶使用者憑證或服務帳戶,授權工作流程設定。

    • 如要使用 Google 帳戶使用者憑證,請選取「Execute with my user credentials」(以我的使用者憑證執行)。

      選用:在「Extended access options」(擴充存取權選項) 部分,選取工作流程所需的其他服務:

      • Knowledge Catalog:可更新 Google Cloud Knowledge Catalog 中繼資料。
      • Google 雲端硬碟:允許唯讀存取 Google 雲端硬碟檔案。
      • Bigtable:可讀取 Google Bigtable 資料 (唯讀)。
    • 如要使用自訂服務帳戶,請選取「Execute with selected service account」(以所選服務帳戶執行),然後選取與您有權存取的 Google Cloud 專案相關聯的服務帳戶。如未選取服務帳戶,工作流程設定會使用存放區的服務帳戶。

  6. 選用:在「Schedule frequency」(排程頻率) 欄位中,以 unix-cron 格式輸入執行頻率。

    為確保 Dataform 執行相應版本設定中的最新編譯結果,編譯結果建立時間與排定執行時間之間,至少應間隔一小時。

  7. 選用:在「Timezone」(時區) 選單中,選取執行作業的時區。

    預設時區為世界標準時間。

  8. 選取要執行的工作流程動作:

    • 如要執行整個工作流程,請按一下「All actions」(所有動作)。
    • 如要執行工作流程中的所選動作,請按一下「Selection of actions」(選取動作),然後選取動作。
    • 如要對所選標記執行動作,請按一下「Selection of tags」(選取標記),然後選取標記。
    • 選用:如要執行所選動作或標記及其依附元件,請選取「Include dependencies」(包含依附元件) 選項。
    • 選用:如要執行所選動作或標記及其依附元件,請選取「Include dependents」(包含依附元件) 選項。
    • 選用:如要從頭重新建構所有資料表,請選取「Run with full refresh」(執行並完整重新整理) 選項。

      如果沒有這個選項,Dataform 會更新累加資料表,而不會從頭重新建構。

    • 選用:使用「Execute as interactive job with high priority (default)」(以高優先順序執行互動式工作 (預設)) 選項,設定 BigQuery 查詢工作優先順序。根據預設,BigQuery 會以互動式查詢工作的形式執行查詢,並盡快開始執行。如果取消勾選這個選項,系統會以批次查詢工作的形式執行查詢,優先順序較低。

  9. 點選「建立」。如果驗證方式選取「Execute with my user credentials」(使用我的使用者憑證執行),則必須授權給 Google 帳戶。

舉例來說,下列工作流程設定會每小時執行一次標有 hourly 標記的動作 (以 CEST 時區為準):

  • 設定 ID:production-hourly
  • 版本設定:-
  • 頻率:0 * * * *
  • 時區:Central European Summer Time (CEST)
  • 選取工作流程動作:選取標記、hourly 標記

授權給您的 Google 帳戶

如要使用 Google 帳戶使用者憑證驗證資源,您必須手動授予權限,讓 BigQuery 管道取得 Google 帳戶的存取權杖,並代表您存取來源資料。您可以透過 OAuth 對話方塊介面手動核准。如果選取任何「Extended access options」,就必須授予這些服務的存取權,例如 Google 雲端硬碟或 Knowledge Catalog。

您只需要授予 BigQuery 管道權限一次。

如要撤銷已授予的權限,請按照下列步驟操作:

  1. 前往 Google 帳戶頁面。
  2. 按一下「BigQuery Pipelines」。
  3. 按一下 [移除存取權]。

如果新的 Google 帳戶擁有者從未建立過工作流程設定,則透過更新憑證變更工作流程設定擁有者時,也需要手動核准。

編輯工作流程設定

如要編輯工作流程設定,請按照下列步驟操作:

  1. 在存放區中,前往「Releases & Scheduling」。
  2. 在要編輯的工作流程設定中,按一下 「More」(更多) 選單,然後按一下「Edit」(編輯)。
  3. 在「Edit workflow configuration」(編輯工作流程設定) 窗格中,編輯工作流程設定,然後按一下「Save」(儲存)。

刪除工作流程設定

如要刪除工作流程設定,請按照下列步驟操作:

  1. 在存放區中,前往「Releases & Scheduling」。
  2. 在要刪除的工作流程設定中,按一下 「More」(更多) 選單,然後點選「Delete」(刪除)。
  3. 在「Delete release configuration」(刪除發布版本設定) 對話方塊中,按一下「Delete」(刪除)。

使用 Workflows 和 Cloud Scheduler 排定執行作業

本節說明如何使用 Workflows 和 Cloud Scheduler,排定 Dataform 工作流程的執行作業。

關於排定的工作流程執行作業

您可以建立 Cloud Scheduler 工作來觸發 Workflows 工作流程,藉此設定 Dataform 工作流程的執行頻率。Workflows 會按照您定義的自動化調度管理工作流程執行服務。

Workflows 會分兩個步驟執行 Dataform 工作流程。首先,Dataform 會從 Git 供應商提取 Dataform 存放區程式碼,並編譯成編譯結果。接著,系統會使用編譯結果建立 Dataform 工作流程,並按照您設定的頻率執行。

建立排定的自動化調度管理工作流程

如要排定 Dataform 工作流程的執行時間,請使用 Workflows 建立自動化調度管理工作流程,並新增 Cloud Scheduler 工作做為觸發條件。

  1. Workflows 會使用服務帳戶,讓工作流程存取Google Cloud 資源。建立服務帳戶,並授予下列權限:

  2. 建立自動調度管理工作流程,並使用下列 YAML 原始碼做為工作流程定義:

    main:
        steps:
        - init:
            assign:
            - repository: projects/PROJECT_ID/locations/REPOSITORY_LOCATION/repositories/REPOSITORY_ID
        - createCompilationResult:
            call: http.post
            args:
                url: ${"https://dataform.googleapis.com/v1/" + repository + "/compilationResults"}
                auth:
                    type: OAuth2
                body:
                    gitCommitish: GIT_COMMITISH
            result: compilationResult
        - createWorkflowInvocation:
            call: http.post
            args:
                url: ${"https://dataform.googleapis.com/v1/" + repository + "/workflowInvocations"}
                auth:
                    type: OAuth2
                body:
                    compilationResult: ${compilationResult.body.name}
            result: workflowInvocation
        - complete:
            return: ${workflowInvocation.body.name}
    

    更改下列內容:

    • PROJECT_ID: Google Cloud 專案的 ID。
    • REPOSITORY_LOCATION:Dataform 存放區的位置。
    • REPOSITORY_ID:Dataform 存放區名稱。
    • GIT_COMMITISH:Git commitish,例如要執行 Dataform 程式碼的分支版本、標記或修訂版本 SHA。如果是新建立的存放區,請將這個值替換為 main。
  3. 使用 Cloud Scheduler 排定自動化調度管理工作流程。

自訂 Dataform 工作流程建立編譯結果要求

您可以更新現有的自動化調度管理工作流程,並以 YAML 格式定義 Dataform 工作流程建立編譯結果要求設定。如要進一步瞭解設定,請參閱 projects.locations.repositories.compilationResults REST 資源參考資料。

舉例來說,如要在編譯期間為所有動作新增 _dev schemaSuffix 設定,請將 createCompilationResult 步驟主體替換為下列程式碼片段:

    - createCompilationResult:
        call: http.post
        args:
            url: ${"https://dataform.googleapis.com/v1/" + repository + "/compilationResults"}
            auth:
                type: OAuth2
            body:
                gitCommitish: GIT_COMMITISH
                codeCompilationConfig:
                    schemaSuffix: dev

您也可以在 Workflows 執行要求中,以執行階段引數的形式傳遞其他設定,並使用變數存取這些引數。詳情請參閱「在執行要求中傳遞執行階段引數」。

自訂 Dataform 工作流程叫用要求

您可以更新現有的自動化調度管理工作流程,並以 YAML 格式定義 Dataform 工作流程叫用要求設定。如要進一步瞭解叫用要求設定,請參閱 projects.locations.repositories.workflowInvocations REST 資源參考資料。

舉例來說,如要只執行含有 hourly 標記的操作,並包含所有遞移依附元件,請將 createWorkflowInvocation 主體替換為下列程式碼片段:

    - createWorkflowInvocation:
        call: http.post
        args:
            url: ${"https://dataform.googleapis.com/v1/" + repository + "/workflowInvocations"}
            auth:
                type: OAuth2
            body:
                compilationResult: ${compilationResult.body.name}
                invocationConfig:
                    includedTags:
                    - hourly
                    transitiveDependenciesIncluded: true
                

您也可以在 Workflows 執行要求中,以執行階段引數的形式傳遞其他設定,並使用變數存取這些引數。詳情請參閱「在執行要求中傳遞執行階段引數」。

使用 Managed Airflow 排定執行作業

您可以使用 Managed Airflow 2 安排 Dataform 執行作業。Dataform 不支援 Managed Airflow 1。

如要使用 Managed Airflow 2 管理 Dataform 執行作業的時間表,您可以在 Airflow 有向無環圖 (DAG) 中使用 Dataform 運算子。您可以建立 Airflow DAG,排定 Dataform 工作流程叫用作業。

Dataform 提供多種 Airflow 運算子。包括取得編譯結果、取得工作流程叫用,以及取消工作流程叫用的運算子。如要查看可用的 Dataform Airflow 運算子完整清單,請參閱「Google Dataform 運算子」。

安裝 google-cloud-dataform PyPI 套件

如果您使用 Managed Airflow 2 2.0.25 以上版本,環境會預先安裝這個套件。不必安裝。

如果您使用的是舊版 Managed Airflow 2,請安裝 google-cloud-dataform PyPI 套件。

在 PyPI 套件部分,指定 ==0.2.0 版本。

建立 Airflow DAG,排定 Dataform 工作流程叫用作業

如要使用 Managed Airflow 2 管理 Dataform 工作流程的排定執行作業,請使用 Dataform Airflow 運算子編寫 DAG,然後上傳至環境的 bucket。

下列程式碼範例顯示 Airflow DAG,可建立 Dataform 編譯結果,並啟動 Dataform 工作流程叫用:

from datetime import datetime

from airflow import models
from airflow.models.baseoperator import chain
from airflow.providers.google.cloud.operators.dataform import (
    DataformCreateCompilationResultOperator,
    DataformCreateWorkflowInvocationOperator,
)

DAG_ID = "dataform"
PROJECT_ID = "PROJECT_ID"
REPOSITORY_ID = "REPOSITORY_ID"
REGION = "REGION"
GIT_COMMITISH = "GIT_COMMITISH"

with models.DAG(
    DAG_ID,
    schedule_interval='@once',  # Override to match your needs
    start_date=datetime(2022, 1, 1),
    catchup=False,  # Override to match your needs
    tags=['dataform'],
) as dag:

    create_compilation_result = DataformCreateCompilationResultOperator(
        task_id="create_compilation_result",
        project_id=PROJECT_ID,
        region=REGION,
        repository_id=REPOSITORY_ID,
        compilation_result={
            "git_commitish": GIT_COMMITISH,
        },
    )
    create_workflow_invocation = DataformCreateWorkflowInvocationOperator(
        task_id='create_workflow_invocation',
        project_id=PROJECT_ID,
        region=REGION,
        repository_id=REPOSITORY_ID,
         workflow_invocation={
            "compilation_result": "{{ task_instance.xcom_pull('create_compilation_result')['name'] }}"
        },
    )


create_compilation_result >> create_workflow_invocation

更改下列內容:

  • PROJECT_ID:Dataform Google Cloud 專案 ID。
  • REPOSITORY_ID:Dataform 存放區名稱。
  • REGION:Dataform 存放區所在的區域。
  • COMPILATION_RESULT:要用於這個工作流程叫用的編譯結果名稱。
  • GIT_COMMITISH:Git commitish,例如遠端 Git 存放區中要編譯的程式碼版本分支、標記或修訂版本 SHA。

下列程式碼範例顯示 Airflow DAG 執行的作業:

  1. 建立 Dataform 編譯結果。
  2. 啟動非同步 Dataform 工作流程叫用。
  3. 使用 DataformWorkflowInvocationStateSensor 輪詢工作流程狀態,直到進入預期狀態
from datetime import datetime

from google.cloud.dataform_v1 import WorkflowInvocation

from airflow import models
from airflow.models.baseoperator import chain
from airflow.providers.google.cloud.operators.dataform import (
    DataformCreateCompilationResultOperator,
    DataformCreateWorkflowInvocationOperator,
)
from airflow.providers.google.cloud.sensors.dataform import DataformWorkflowInvocationStateSensor

DAG_ID = "dataform"
PROJECT_ID = "PROJECT_ID"
REPOSITORY_ID = "REPOSITORY_ID"
REGION = "REGION"
GIT_COMMITISH = "GIT_COMMITISH"

with models.DAG(
    DAG_ID,
    schedule_interval='@once',  # Override to match your needs
    start_date=datetime(2022, 1, 1),
    catchup=False,  # Override to match your needs
    tags=['dataform'],
) as dag:

    create_compilation_result = DataformCreateCompilationResultOperator(
        task_id="create_compilation_result",
        project_id=PROJECT_ID,
        region=REGION,
        repository_id=REPOSITORY_ID,
        compilation_result={
            "git_commitish": GIT_COMMITISH,
        },
    )

create_workflow_invocation = DataformCreateWorkflowInvocationOperator(
    task_id='create_workflow_invocation',
    project_id=PROJECT_ID,
    region=REGION,
    repository_id=REPOSITORY_ID,
    asynchronous=True,
    workflow_invocation={
        "compilation_result": COMPILATION_RESULT
    }
)

is_workflow_invocation_done = DataformWorkflowInvocationStateSensor(
    task_id="is_workflow_invocation_done",
    project_id=PROJECT_ID,
    region=REGION,
    repository_id=REPOSITORY_ID,
    workflow_invocation_id=("{{ task_instance.xcom_pull('create_workflow_invocation')['name'].split('/')[-1] }}"),
    expected_statuses={WorkflowInvocation.State.SUCCEEDED},
)


create_compilation_result >> create_workflow_invocation

更改下列內容:

  • PROJECT_ID:Dataform Google Cloud 專案 ID。
  • REPOSITORY_ID:Dataform 存放區名稱。
  • REGION:Dataform 存放區所在的區域。
  • COMPILATION_RESULT:要用於這個工作流程叫用的編譯結果名稱。
  • GIT_COMMITISH:Git commitish,例如遠端 Git 存放區中要編譯的程式碼版本分支、標記或修訂版本 SHA。

新增編譯設定參數

您可以在 create_compilation_result Airflow DAG 物件中,新增其他編譯設定參數。如要進一步瞭解可用參數,請參閱 CodeCompilationConfig Dataform API 參考資料。

  • 如要將編譯設定參數新增至 create_compilation_result Airflow DAG 物件,請按照下列格式將所選參數新增至 code_compilation_config 欄位:

        create_compilation_result = DataformCreateCompilationResultOperator(
            task_id="create_compilation_result",
            project_id=PROJECT_ID,
            region=REGION,
            repository_id=REPOSITORY_ID,
            compilation_result={
                "git_commitish": GIT_COMMITISH,
                "code_compilation_config": { "PARAMETER": "PARAMETER_VALUE"}
            },
        )
    

    更改下列內容:

    • PROJECT_ID:Dataform Google Cloud 專案 ID。
    • REPOSITORY_ID:Dataform 存放區名稱。
    • REGION:Dataform 存放區所在的區域。
    • GIT_COMMITISH:Git commitish,例如遠端 Git 存放區中要編譯的程式碼版本分支、標記或修訂版本 SHA。
    • PARAMETER:所選CodeCompilationConfig參數。您可以新增多個參數。
    • PARAMETER_VALUE:所選參數的值。

下列程式碼範例顯示新增至 create_compilation_result Airflow DAG 物件的 defaultDatabase 參數:

    create_compilation_result = DataformCreateCompilationResultOperator(
        task_id="create_compilation_result",
        project_id=PROJECT_ID,
        region=REGION,
        repository_id=REPOSITORY_ID,
        compilation_result={
            "git_commitish": REMOTE_BRANCH,
            "code_compilation_config": { "default_database": "my-custom-gcp-project"}
        },
    )

新增工作流程叫用設定參數

您可以將其他工作流程叫用設定參數新增至 create_workflow_invocation Airflow DAG 物件。如要進一步瞭解可用參數,請參閱 InvocationConfig Dataform API 參考資料。

  • 如要將工作流程叫用設定參數新增至 create_workflow_invocation Airflow DAG 物件,請按照下列格式將所選參數新增至 invocation_config 欄位:

        create_workflow_invocation = DataformCreateWorkflowInvocationOperator(
            task_id='create_workflow_invocation',
            project_id=PROJECT_ID,
            region=REGION,
            repository_id=REPOSITORY_ID,
            workflow_invocation={
                "compilation_result": "{{ task_instance.xcom_pull('create_compilation_result')['name'] }}",
                "invocation_config": { "PARAMETER": PARAMETER_VALUE }
            },
        )
    
    

    更改下列內容:

    • PROJECT_ID:Dataform Google Cloud 專案 ID。
    • REPOSITORY_ID:Dataform 存放區名稱。
    • REGION:Dataform 存放區所在的區域。
    • PARAMETER:所選InvocationConfig參數。您可以新增多個參數。
    • PARAMETER_VALUE:所選參數的值。

下列程式碼範例顯示新增至 create_workflow_invocation Airflow DAG 物件的 includedTags[] 和 transitiveDependenciesIncluded 參數:

    create_workflow_invocation = DataformCreateWorkflowInvocationOperator(
        task_id='create_workflow_invocation',
        project_id=PROJECT_ID,
        region=REGION,
        repository_id=REPOSITORY_ID,
        workflow_invocation={
            "compilation_result": "{{ task_instance.xcom_pull('create_compilation_result')['name'] }}",
            "invocation_config": { "included_tags": ["daily"], "transitive_dependencies_included": true }
        },
    )

透過 Cloud Build 自動建構觸發條件自動執行

如要超越版本設定中的時間排程,可以使用 Cloud Build 自動建構觸發條件建立事件導向管道。每當有新的修訂版本推送至 Git 分支版本時,這個方法就會自動編譯程式碼,並立即觸發 Dataform 工作流程叫用,更新資料。

準備資源

  1. 在 Google Cloud 專案中,啟用 Dataform 和 Cloud Build API:

    啟用 Dataform API

    啟用 Cloud Build API

  2. 請確認您已備妥下列項目:

授予必要的 IAM 權限

將 Dataform 管理員角色 (roles/dataform.admin) 授予 Dataform 存放區中的自訂服務帳戶。這個角色可授予存放區的完整存取權,包括建立編譯結果、更新版本設定,以及啟動新工作流程叫用的權限。如要瞭解如何將 IAM 角色授予個別存放區,請參閱「控管個別存放區的存取權」。

將工作流程設定自訂服務帳戶的服務帳戶使用者角色 (roles/iam.serviceAccountUser) 授予 Cloud Build 自動建構觸發條件的服務帳戶。如要進一步瞭解這項規定,請參閱「使用嚴格 act-as 模式」。

如要讓 Cloud Build 使用自訂服務帳戶,您必須授予 Cloud Build 服務代理權限,允許其做為該帳戶。如要將模擬權限授予 Cloud Build 服務代理,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面。

    前往「Service Accounts」(服務帳戶)

  2. 選取自訂服務帳戶。

  3. 前往「具備存取權的主體」分頁。

  4. 點選 「授予存取權」。

  5. 在「New principals」(新增主體) 欄位中,輸入 Cloud Build 服務代理的電子郵件地址,格式應如下:

    service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.
    

    將 PROJECT_NUMBER 替換為Google Cloud 專案的數字 ID。您可以在Google Cloud 控制台資訊主頁中找到 Google Cloud 專案 ID。詳情請參閱「尋找專案名稱、編號和 ID」。

  6. 在「Select a role」(選取角色) 選單中,選取「Service Account User」(服務帳戶使用者)。

  7. 按一下「儲存」。

建立 cloudbuild.yaml 設定檔

在 Git 存放區的根目錄中,建立 cloudbuild.yaml 檔案。請使用這個檔案定義下列多步驟指令碼,建立編譯結果、更新發布版本設定,將這個編譯結果設為正式版,並啟動新的工作流程叫用。

steps:
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk:latest'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        set -e -o pipefail # Exit script on any error

        # 1. Get the access token
        TOKEN=$(gcloud auth print-access-token)

        # 2. Define API endpoints and resource names
        RELEASE_CONFIG_RESOURCE="projects/${_PROJECT_ID}/locations/${_DATAFORM_LOCATION}/repositories/${_DATAFORM_REPO_ID}/releaseConfigs/${_RELEASE_CONFIG_ID}"
        COMPILATION_RESULTS_API="https://dataform.googleapis.com/v1/projects/${_PROJECT_ID}/locations/${_DATAFORM_LOCATION}/repositories/${_DATAFORM_REPO_ID}/compilationResults"

        # 3. Create the new compilation result
        echo "Creating new compilation result from $$RELEASE_CONFIG_RESOURCE..."
        CREATE_PAYLOAD="{\"releaseConfig\": \"$$RELEASE_CONFIG_RESOURCE\"}"
        curl --fail-with-body -X POST \
          -H "Authorization: Bearer $$TOKEN" \
          -H "Content-Type: application/json" \
          -d "$$CREATE_PAYLOAD" \
          "$$COMPILATION_RESULTS_API" | tee /workspace/compilation_response.json

  - name: 'alpine'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        set -e # Exit script on any error

        # 4. Parse compilation result name
        apk add --no-cache jq
        COMPILATION_NAME=$(jq -r '.name' < /workspace/compilation_response.json)

        echo "Successfully created compilation result: $$COMPILATION_NAME"
        echo $$COMPILATION_NAME > /workspace/compilation_result_name.txt

  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk:latest'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        set -e # Exit script on any error
        # 5. Update the releaseConfig to set the new compilation result as 'live'
        COMPILATION_NAME=$(cat /workspace/compilation_result_name.txt)
        echo "Updating release config to set $$COMPILATION_NAME as live..."
        PATCH_PAYLOAD="{\"releaseCompilationResult\": \"$$COMPILATION_NAME\", \"gitCommitish\": \"$BRANCH_NAME\"}"

        RELEASE_CONFIG_RESOURCE="projects/${_PROJECT_ID}/locations/${_DATAFORM_LOCATION}/repositories/${_DATAFORM_REPO_ID}/releaseConfigs/${_RELEASE_CONFIG_ID}"
        RELEASE_CONFIG_PATCH_API="https://dataform.googleapis.com/v1/$${RELEASE_CONFIG_RESOURCE}"
        curl --fail-with-body -X PATCH \
          -H "Authorization: Bearer $(gcloud auth print-access-token)" \
          -H "Content-Type: application/json" \
          -d "$$PATCH_PAYLOAD" \
          "$$RELEASE_CONFIG_PATCH_API?updateMask=releaseCompilationResult"

        echo "Successfully updated release config."

  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk:latest'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        set -e # Exit script on any error
        # 6. Launch a workflow config after recompiling the release config
        WORKFLOW_CONFIG_RESOURCE="projects/${_PROJECT_ID}/locations/${_DATAFORM_LOCATION}/repositories/${_DATAFORM_REPO_ID}/workflowConfigs/${_WORKFLOW_CONFIG_ID}"
        CREATE_WORKFLOW_PAYLOAD="{\"workflowConfig\": \"$$WORKFLOW_CONFIG_RESOURCE\"}"

        WORKFLOW_INVOCATIONS_API="https://dataform.googleapis.com/v1/projects/${_PROJECT_ID}/locations/${_DATAFORM_LOCATION}/repositories/${_DATAFORM_REPO_ID}/workflowInvocations"
        curl --fail-with-body -X POST \
          -H "Authorization: Bearer $(gcloud auth print-access-token)" \
          -H "Content-Type: application/json" \
          -d "$$CREATE_WORKFLOW_PAYLOAD" \
          "$$WORKFLOW_INVOCATIONS_API"

        echo "Successfully created a new workflow invocation."

# Define substitution variables that can be set in the trigger
substitutions:
  _DATAFORM_LOCATION: 'us-central1'  # Default, change if needed
  _DATAFORM_REPO_ID: ''              # Required: Set this in the trigger
  _RELEASE_CONFIG_ID: ''             # Required: Set this in the trigger
  _WORKFLOW_CONFIG_ID: ''            # Required: Set this in the trigger
  _PROJECT_ID: ${PROJECT_ID}         # Automatically uses the build's Project ID

options:
  logging: CLOUD_LOGGING_ONLY

建立 Cloud Build 自動建構觸發條件

如要建立觸發條件,在程式碼推送至存放區時執行建構設定,請按照下列步驟操作:

  1. 在 Google Cloud 控制台,開啟 Cloud Build 的「Triggers」(觸發條件) 頁面。

    前往「Triggers」(觸發條件)

  2. 如果尚未連結 Git 存放區,請按一下「Connect repository」(連結存放區),然後按照步驟操作。

  3. 按一下「建立觸發條件」。

  4. 輸入觸發條件的名稱。

  5. 選取觸發條件的區域。

  6. 選取觸發條件的事件。

  7. 在「Source」(來源) 區段中,將存放區設為已連結的 Git 存放區。

  8. 將分支版本設為存放區的主要分支版本。

  9. 在「Configuration」(設定) 區段中,選取 Cloud Build 設定檔,可以是 YAML 或 JSON 檔案。

  10. 將檔案位置設為 /cloudbuild.yaml 或檔案路徑。

  11. 在「Substitution variables」(替代變數) 部分,新增下列變數和值:

    • _DATAFORM_REPO_ID:Dataform 存放區 ID
    • _RELEASE_CONFIG_ID:Dataform 發布版本設定 ID
    • _WORKFLOW_CONFIG_ID:Dataform 工作流程設定 ID
    • 選用:_DATAFORM_LOCATION:Dataform 存放區區域,例如 us-central1
  12. 在「服務帳戶」部分,選取自訂服務帳戶。

  13. 點選「建立」。

詳情請參閱「建立自動建構觸發條件」。

測試觸發條件

  1. 修訂 cloudbuild.yaml 檔案,並推送至觸發條件監控的分支版本。
  2. 如要查看 Cloud Build 建構作業,請在 Google Cloud 控制台中開啟「Build History」(建構作業記錄) 頁面。

    前往「Build History」(建構記錄)

  3. 如果建構成功,請前往「Dataform」頁面。

    前往 Dataform

  4. 選取存放區。

  5. 按一下「版本和排程」,然後選取版本設定。

  6. 在「Manual / API compilation results」(手動/API 編譯結果) 清單中,尋找新項目。最近一次成功編譯的結果,應標示為發布設定的「Live compilation result」(即時編譯結果)。

  7. 按一下「Workflow execution logs」(工作流程執行記錄)。

  8. 您應該會看到使用所選工作流程設定啟動的新工作流程叫用。

後續步驟