工作流程生命週期的最佳做法

本文將說明在 Dataform 中管理工作流程生命週期的最佳做法,包括建立開發、測試和正式環境,以及為每個環境設定編譯和執行設定。

如要建立標準化的 Dataform 工作流程生命週期,維持資料健全度並提升開發流程效率,建議您採取下列做法:

  • 建立執行環境,將開發期間建立的資料表與使用者可用的資料表隔離。

  • 設定版本和工作流程設定,在正式環境 (以及選用的預先發布環境) 中執行工作流程。

本文說明如何使用工作區編譯覆寫功能隔離開發資料表,以及如何透過發布版本設定工作流程設定,設定測試和正式環境。

您可以在單一 Dataform 存放區和 Google Cloud 專案中,使用這些解決方案建立執行環境。您可以選擇在不同Google Cloud 專案中存放多個 Dataform 存放區副本,每個專案對應程式碼生命週期的階段,例如開發、測試和正式。這種做法可讓您在程式碼生命週期的每個階段,自訂 Identity and Access Management 權限

獨立執行環境的最佳做法

建議您將開發工作流程執行期間建立的資料表,與 BigQuery 中的正式版資料表隔離。確保使用者可以前往正式版資料表,並避免使用者不慎存取錯誤資料。

您可以透過下列方式建立獨立的執行環境:

依結構定義分割開發和正式版資料表
適合小型團隊。Dataform 會在 BigQuery 中,以不同的結構定義建立開發和正式版資料表。Dataform 會在具有相同尾碼的結構定義中,執行所有開發資料表,標示這些資料表是在開發期間建立。開發人員可以覆寫彼此的開發表格。
依結構定義和 Google Cloud 專案分割開發和正式環境資料表
建議中型團隊使用。Dataform 會在 BigQuery 的不同結構定義和專案中,建立開發和正式版資料表。Dataform 在專屬開發 Google Cloud 專案中發布所有開發資料表。每位 Dataform 開發人員都有自己的開發資料表專屬結構定義。這個解決方案可避免開發人員不小心覆寫彼此的開發資料表。這種做法的缺點是,刪除開發資料表和結構定義,以及在每個環境中重新建立所有資料表,可能需要更多時間。
依 Google Cloud 專案分割開發、測試及實際工作環境資料表
建議大型團隊或需要預先發布環境的團隊使用。 Dataform 會在 BigQuery 的專屬Google Cloud 專案中,執行各環境的資料表。這項解決方案可讓您充分掌控程式碼生命週期。

所有解決方案都需要連線至單一第三方遠端存放區的單一 Dataform 存放區。

在所有解決方案中,開發人員都會在 Dataform 工作區內手動觸發執行開發表格。Dataform 會在版本設定中自動編譯正式版和暫存表,並以工作流程設定中設定的頻率執行這些表。

依結構定義分割開發和正式版

這項解決方案會建立兩個執行環境,Dataform 會在其中執行工作流程:開發和正式環境。如要依結構定義分割開發和正式版資料表,您需要設定工作流程、工作區編譯覆寫和版本。如要排定正式版執行作業,請建立工作流程設定。

Dataform 會在具有相同尾碼的結構定義中,執行所有開發資料表,標記這些資料表是在開發期間建立。Dataform 會執行結構定義中所有沒有任何尾碼的正式作業資料表。

下表顯示的設定會依結構定義分割開發和正式版資料表,其中包含一個開發結構定義:

設定 開發 正式環境
Google Cloud 專案 enterprise-analytics enterprise-analytics
Git 分支 工作區名稱 main
工作區編譯覆寫設定 結構定義後置字串:dev -
版本設定 - production
工作流程設定 - production

在這個解決方案中,開發和正式版資料表會儲存在單一Google Cloud 專案中。

開發人員會在 Dataform 工作區中手動觸發執行作業。在所有手動觸發的執行作業中,Dataform 會在具有相同後置字串的結構定義中執行資料表,這表示這些資料表是在開發期間建立。開發人員必須注意,他們可以覆寫彼此的表格。

在 Dataform 中,開發人員會將變更內容提交並推送至遠端存放區的自訂分支。接著,他們會在第三方 Git 託管平台提交提取要求。核准提取要求後,變更會合併至遠端存放區的 main 分支。

Dataform 會根據 production 版本設定,自動將遠端存放區 main 分支版本的正式環境資料表編譯為編譯結果。

Dataform 會根據 production 工作流程設定中設定的時間表,自動執行 production 編譯結果。

如要實作這項解決方案,請設定下列 Dataform 設定:

工作流程設定

視 Dataform Core 版本而定,工作流程設定會儲存在 workflow_settings.yamldataform.json 中。詳情請參閱「設定 Dataform 工作流程設定」。

workflow_settings.yaml 中設定下列項目:

defaultProject: enterprise-analytics
defaultDataset: analytics

dataform.json 中,設定下列項目:

{
defaultSchema: "analytics",
defaultDatabase: "enterprise-analytics"
}

工作區覆寫

結構定義後置字串:"dev"

版本設定

Git 修訂版本:"main"

如要排定 production 編譯結果的執行時間,請建立工作流程設定

範例開發流程

在這個範例中,開發人員 Sasha 和 Kai 使用同一個 Dataform 存放區。Dataform 存放區已連線至第三方遠端 Git 存放區。

他們會修訂變更並推送到遠端存放區的自訂分支版本,分別稱為 sashakai

下表顯示 Sasha、Kai 和實際工作環境套用的環境設定:

設定 Sasha Kai 正式環境
Google Cloud 專案 enterprise-analytics enterprise-analytics enterprise-analytics
Git 分支 sasha kai main
結構定義 analytics_dev analytics_dev analytics

Sasha 建立新資料表並部署至正式環境的流程如下:

  1. 在 Dataform 工作區中,Sasha 建立 user_stats 資料表。
  2. 在工作區中,Sasha 手動觸發資料表執行作業。
  3. Dataform 會在 BigQuery 的 enterprise-analytics Google Cloud 專案中,於 analytics_dev結構定義中建立 enterprise-analytics.analytics_dev.user_stats 資料表。
  4. 在工作區中,Sasha 提交變更並推送至遠端 Git 存放區中的 sasha 分支版本。
  5. Sasha 在遠端存放區中提交提取要求。
  6. 在遠端存放區中,Kai 審查並核准提取要求,然後將變更合併至 main 分支版本。
  7. Dataform 會以指定頻率,自動更新production版本中的編譯結果。在下次更新 production 編譯結果時,Dataform 會將 enterprise-analytics.analytics.user_stats 資料表新增至編譯結果。
  8. 在排定的工作流程設定執行期間,Dataform 會在 BigQuery 的 enterprise-analytics Google Cloud 專案中,執行 analytics 結構定義中的 enterprise-analytics.analytics.user_stats 資料表。
  9. user_stats 資料表會顯示在 BigQuery 的 enterprise-analytics Google Cloud 專案中,供 analytics 架構的終端使用者使用。

依結構定義和專案分割開發和正式環境

本解決方案會建立兩個執行環境:開發環境和正式環境。 如要依結構定義和 Google Cloud 專案分割開發和正式版資料表,您需要設定工作流程設定、工作區編譯覆寫和版本設定。如要排定正式版執行作業,請建立工作流程設定。

在本解決方案中,Dataform 會在專屬的開發 Google Cloud 專案中執行開發作業,並在每個工作區的結構定義中,使用不同的結構定義後置字元。

Dataform 會在 BigQuery 中執行所有正式版資料表,這些資料表位於專屬的正式版 Google Cloud 專案,且沒有結構定義後置字元。

下表顯示的設定會依據結構定義和 Google Cloud 專案分割開發和正式版資料表,每個 Dataform 工作區各有一個開發結構定義:

設定 開發 正式環境
Google Cloud 專案 enterprise-dev enterprise-prod
Git 分支 工作區名稱 main
工作區編譯覆寫設定 結構定義後置字串:${workspaceName} -
版本設定 - production
工作流程設定 - production

在本解決方案中,Dataform 會在 BigQuery 的不同結構定義和 Google Cloud 專案中,執行開發和正式版資料表。

開發人員會在 Dataform 工作區中手動觸發執行作業。每位開發人員都會在以自己為名的專屬工作區中工作,例如 sasha

開發人員在工作區中觸發執行作業時,Dataform 會將工作區名稱做為結構定義後置字串,附加至所有結構定義。接著,Dataform 會在自訂結構定義中執行資料表。

舉例來說,Dataform 會在 BigQuery 的 analytics_sasha 結構定義中,從 sasha 工作區建立資料表。這樣一來,每位開發人員就能將開發資料表儲存在自己的結構定義中。不會有不小心覆寫其他開發人員資料表的風險。

在 Dataform 中,開發人員會將變更內容提交並推送至遠端存放區的自訂分支。接著,他們會在第三方 Git 託管平台提交提取要求。核准提取要求後,變更會合併至遠端存放區的 main 分支。

Dataform 會根據 production 版本設定,自動將遠端存放區 main 分支版本的正式環境資料表編譯為編譯結果。

Dataform 會根據 production 工作流程設定中設定的時間表,自動執行 production 編譯結果。

如要實作這項解決方案,請設定下列 Dataform 設定:

工作流程設定

視 Dataform Core 版本而定,工作流程設定會儲存在 workflow_settings.yamldataform.json 中。詳情請參閱「設定 Dataform 工作流程設定」。

workflow_settings.yaml 中,設定下列項目:

defaultProject: enterprise-dev
defaultDataset: analytics

dataform.json 中,設定下列項目:

{
defaultSchema: "analytics",
defaultDatabase: "enterprise-dev"
}

工作區覆寫

結構定義後置字串:"${workspaceName}"

版本設定

  • Git 修訂版本:"main"
  • Google Cloud 專案 ID:"enterprise-prod"

如要排定 production 編譯結果的執行時間,請建立工作流程設定,並自訂最符合需求的排程。

範例開發流程

在這個範例中,開發人員 Sasha 和 Kai 使用同一個 Dataform 存放區。Dataform 存放區已連線至第三方遠端 Git 存放區。

Sasha 在專屬工作區「sasha」中工作,Kai 則在專屬工作區「Kai」中工作。他們會修訂變更,並將變更推送到遠端存放區的自訂分支版本,分別稱為 sashakai

下表顯示 Sasha、Kai 和實際工作環境套用的環境設定:

設定 Sasha Kai 正式環境
Google Cloud 專案 enterprise-dev enterprise-dev enterprise-prod
Git 分支 sasha kai main
工作區編譯覆寫設定 結構定義後置字串:${workspaceName} 結構定義後置字串:${workspaceName} -
版本設定 - - production
工作流程設定 - - production

Sasha 建立新資料表並部署至正式環境的流程如下:

  1. sasha Dataform 工作區中,Sasha 建立 user_stats 資料表。
  2. sasha 工作區中,Sasha 手動觸發資料表執行作業。
  3. Dataform 會在 BigQuery 的 enterprise-dev Google Cloud 專案中,執行 analytics_sasha 結構定義中的 enterprise-dev.analytics_sasha.user_stats 資料表。
  4. sasha 工作區中,Sasha 提交變更並推送至遠端 Git 存放區的 sasha 分支版本。
  5. 在遠端存放區中,Sasha 提交提取要求。
  6. 在遠端存放區中,Kai 審查並核准提取要求,然後將變更合併至 main 分支版本。
  7. Dataform 會以指定頻率,自動更新production版本中的編譯結果。在下次更新 production 編譯結果時,Dataform 會將 enterprise-prod.analytics.user_stats 資料表新增至編譯結果。
  8. 在排定的工作流程設定執行期間,Dataform 會在 BigQuery 的 enterprise-prod Google Cloud 專案中,執行 analytics 結構定義中的 enterprise-prod.analytics.user_stats 資料表。
  9. user_stats 資料表會顯示在 BigQuery 的 enterprise-prod Google Cloud 專案中,供 analytics 架構的終端使用者使用。

您也可以依專案分割開發和生產資料來源宣告,以及依結構定義和專案分割開發和生產資料來源宣告

依結構定義和專案分割開發、測試和實際工作環境

這項解決方案會建立三個執行環境:開發、預先發布和實際工作環境。所有環境都會依 Google Cloud 專案劃分。 此外,開發作業會依據結構定義,與測試和正式環境分開。

如要依結構定義和 Google Cloud 專案分割開發、測試和正式版資料表,您需要設定工作流程設定、工作區編譯覆寫,以及兩個版本設定。如要排定測試和正式環境的執行作業,請建立兩個不同的工作流程設定。

在本解決方案中,Dataform 會在專屬的開發 Google Cloud 專案中,透過多個開發結構定義 (每個 Dataform 工作區各一個),在 BigQuery 中執行開發資料表。

Dataform 會在具有相同尾碼的結構定義中,於 BigQuery 的專屬暫存 Google Cloud 專案中執行所有暫存資料表,標示這些資料表是在暫存環境中建立。

Dataform 會在具有相同尾碼的結構定義中,於 BigQuery 的專屬生產 Google Cloud 專案中執行所有生產資料表,這表示這些資料表是在生產環境中建立。

下表顯示的範例設定會依據結構定義和 Google Cloud 專案分割開發、測試和正式版資料表,每個 Dataform 工作區各有一個開發結構定義:

設定 開發 預備 正式環境
Google Cloud 專案 enterprise-dev enterprise-staging enterprise-prod
Git 分支 工作區名稱 main prod
工作區編譯覆寫設定 結構定義後置字串:${workspaceName} - -
版本設定 - staging production
工作流程設定 - staging production

在本解決方案中,Dataform 會在 BigQuery 的不同 Google Cloud 專案中執行開發、預先發布和正式版資料表。此外,Dataform 會在多個自訂結構定義中執行開發資料表,每個工作區各有一個。Dataform 會在相同結構定義中執行測試和正式版資料表,但位於不同的 Google Cloud 專案。

開發人員會在 Dataform 工作區中手動觸發執行作業。每位開發人員都會在以自己為名的專屬工作區中工作,例如 sasha

每個工作區都會對應到自訂 BigQuery 結構定義,並以工作區命名。開發人員在工作區中觸發執行作業時,Dataform 會將工作區名稱做為結構定義後置字串,附加至預設結構定義。接著,Dataform 會在 BigQuery 的自訂結構定義中執行資料表。

舉例來說,Dataform 會在 BigQuery 的 analytics_sasha 結構定義中,執行 sasha 工作區中的資料表。這樣一來,每位開發人員就能將開發資料表儲存在自己的結構定義中。不會有不小心覆寫其他開發人員資料表的風險。

在 Dataform 中,開發人員會將變更內容提交並推送至遠端存放區的自訂分支。然後,在第三方 Git 主機平台中,他們會將提取要求提交至 main 分支。核准提取要求後,變更會合併至遠端存放區的 main 分支版本。

Dataform 會根據 staging 版本設定,自動將遠端存放區 main 分支版本中的暫存資料表編譯為編譯結果。

Dataform 會根據 staging 工作流程設定中設定的時間表,自動執行 staging 編譯結果。

如要將表格從測試環境升級至正式環境,開發人員須在第三方 Git 託管平台中,將提取要求從 main 分支版本提交至 prod 分支版本。核准提取要求後,變更會合併至遠端存放區的 prod 分支。

Dataform 會根據 production 版本設定,自動將遠端存放區 prod 分支版本的正式環境資料表編譯為編譯結果。

Dataform 會根據production工作流程設定中設定的時間表,自動執行production編譯結果。

如要實作這項解決方案,請設定下列 Dataform 設定:

工作流程設定

視 Dataform Core 版本而定,工作流程設定會儲存在 workflow_settings.yamldataform.json 中。詳情請參閱「設定 Dataform 工作流程設定」。

workflow_settings.yaml 中,設定下列項目:

defaultProject: enterprise-dev
defaultDataset: analytics

dataform.json 中,設定下列項目:

{
defaultSchema: "analytics",
defaultDatabase: "enterprise-dev"
}

工作區覆寫

結構定義後置字串:"${workspaceName}"

staging 版本設定

  • Git 修訂版本:"main"
  • Google Cloud 專案 ID:"enterprise-staging"

prod 版本設定

  • Git 修訂版本:"prod"
  • Google Cloud 專案 ID:"enterprise-prod"

如要排定 stagingproduction 編譯結果的執行時間,請建立兩個獨立的工作流程設定,並自訂最符合需求的排程。

範例開發流程

在這個範例中,開發人員 Sasha 和 Kai 使用同一個 Dataform 存放區。Dataform 存放區已連線至第三方遠端 Git 存放區。

Sasha 在專屬工作區「sasha」中工作,Kai 則在專屬工作區「Kai」中工作。他們會修訂變更,並將變更推送到遠端存放區的自訂分支版本,分別稱為 sashakai

下表顯示 Sasha、Kai 和實際工作環境套用的環境設定:

設定 Sasha Kai 預備 正式環境
Google Cloud 專案 enterprise-dev enterprise-dev enterprise-staging enterprise-prod
Git 分支 sasha kai main prod
結構定義 analytics_sasha analytics_kai analytics analytics

Sasha 建立新資料表並部署至正式環境的流程如下:

  1. sasha Dataform 工作區中,Sasha 建立 user_stats 資料表。
  2. sasha 工作區中,Sasha 手動觸發資料表執行作業。
  3. Dataform 會在 BigQuery 的 enterprise-dev Google Cloud 專案中,執行 analytics_sasha 結構定義中的 enterprise-dev.analytics_sasha.user_stats 資料表。
  4. sasha 工作區中,Sasha 提交變更並推送至遠端 Git 存放區的 sasha 分支版本。
  5. 在遠端存放區中,Sasha 會將提取要求提交至 main 分支。
  6. 在遠端存放區中,Kai 審查並核准提取要求,然後將變更合併至 main 分支版本。
  7. Dataform 會以指定頻率,自動更新staging版本中的編譯結果。在下次更新 staging 編譯結果時,Dataform 會將 enterprise-staging.analytics.user_stats 資料表新增至編譯結果。
  8. 在排定的工作流程設定執行期間,Dataform 會在 BigQuery 的 enterprise-staging Google Cloud 專案中,執行 analytics 結構定義中的 enterprise-staging.analytics.user_stats 資料表。
  9. 在遠端存放區中,Sasha 會將提取要求提交至 prod 分支。
  10. 在遠端存放區中,Kai 審查並核准提取要求,然後將變更合併至 prod 分支版本。
  11. Dataform 會以指定頻率,自動更新production版本中的編譯結果。在下次更新 production 編譯結果時,Dataform 會將 enterprise-prod.analytics.user_stats 資料表新增至編譯結果。
  12. 在排定的工作流程設定執行期間,Dataform 會在 BigQuery 的 enterprise-prod Google Cloud 專案中,執行 analytics 結構定義中的 enterprise-prod.analytics.user_stats 資料表。
  13. user_stats 資料表會顯示在 BigQuery 的 enterprise-prod Google Cloud 專案中,供 analytics 架構的終端使用者使用。

依專案分割開發和實際工作環境資料來源宣告

這項解決方案會依專案區隔開發和正式環境資料來源宣告。您可以使用工作流程設定檔中的變數,動態修改資料來源宣告,不必再使用靜態專案宣告資料來源。如果資料來源分別位於不同的開發和正式版專案中,這項功能就非常實用。

在本範例中,工作流程設定檔案中的專案變數會使用 dataform.projectConfig.vars.projectVar Dataform 變數,插入資料來源宣告:

source_declaration.sqlx 檔案中,設定下列項目:

config {
  type: "declaration",
  database: dataform.projectConfig.vars.projectVar,
  schema: "source_schema",
  name: "source_name",
}

工作流程執行時,Dataform 會將預設專案值或任何設定的專案編譯覆寫項目,插入宣告中。在工作流程中參照這個資料來源時,系統會根據執行環境,指向開發或實際工作環境資料來源。

這個解決方案需要開發和正式環境來源結構定義和資料表採用一致的命名慣例。如需不同的命名慣例,請使用自訂編譯變數

依據結構定義和專案,將開發和生產資料來源聲明分開

這項解決方案會依專案和結構定義,將開發和正式環境資料來源宣告分開。除了使用工作流程設定檔中的專案變數,還可定義自訂編譯變數,代表自訂來源結構定義名稱和自訂來源資料表後置字串。這些變數的預設值會與開發資料來源保持一致,且可根據工作流程執行環境,使用生產資料來源的編譯覆寫值覆寫。

workflow_settings.yaml 檔案中,設定下列項目:

defaultProject: development
defaultLocation: US
defaultDataset: development
defaultAssertionDataset: dataform_assertions
dataformCoreVersion: 3.0.0
vars:
 sourceSchema: schema_DEV
 sourceNameSuffix: _DEV

source_declaration.sqlx 檔案中,設定下列項目:

config {
  type: "declaration",
  database: dataform.projectConfig.vars.projectVar,
  schema: dataform.projectConfig.vars.sourceSchema,
  name: "source_name"+dataform.projectConfig.vars.sourceNameSuffix,
}
變數 開發 (預設) 正式版 (覆寫)
projectVar development production
sourceSchema schema_DEV schema_PROD
sourceNameSuffix _DEV _PROD
編譯的資料來源 development.schema_DEV.source_name_DEV production.schema_PROD.source_name_PROD

在本例中,我們分別透過 projectVar 變數和 sourceSchema 自訂變數,依據專案和結構定義分割開發和生產資料來源。視需要透過附加至資料表名稱的後置字串,達成來源資料表的分離。

在上例中,您必須先在個別的開發和生產專案中建立資料來源,且來源結構定義和資料表名稱須遵循一致的命名慣例。此外,參照來源資料表時,必須修改參照,使用 ${ref("source_name"+dataform.projectConfig.vars.sourceNameSuffix)} 自訂編譯變數,才能正確解析參照。

後續步驟