管理代码生命周期

本文档介绍了在 Dataform 中管理代码生命周期的最佳实践:创建开发、预演和生产环境,以及为每个环境配置编译和执行设置。

如需创建标准化的 Dataform SQL 工作流生命周期来维护数据健全度并优化开发流程,我们建议您执行以下操作:

  • 创建执行环境,以将开发期间创建的表与最终用户可用的表隔离开来。

  • 配置发布和工作流配置,以在生产环境中执行工作流,也可以视需要在预演环境中执行工作流。

本文档介绍了以下解决方案:通过工作区编译替换来隔离开发表,以及配置预演环境和生产环境的版本配置工作流配置

借助这些解决方案,您可以在单个 Dataform 代码库和 Google Cloud 项目中创建执行环境。您可以选择拥有 Dataform 代码库的多个副本,这些副本位于不同的 Google Cloud 项目中,每个项目对应代码生命周期的某个阶段,例如开发、预演和生产。通过此方法,您可以在代码生命周期的每个阶段自定义 Identity and Access Management 权限

隔离执行环境的最佳实践

我们建议您将开发 SQL 工作流执行期间创建的表与 BigQuery 中的生产表隔离开来。这样可以确保最终用户可以轻松导航到生产表,并消除最终用户意外访问错误数据的风险。

您可以通过以下方式创建隔离的执行环境:

按架构拆分开发表和生产表
建议用于小型团队。Dataform 在 BigQuery 中的不同架构中创建开发表和生产表。Dataform 在具有相同后缀的架构中执行所有开发表,后缀表示这些表是在开发期间创建的。开发者可以覆盖彼此的开发表。
按架构和 Google Cloud 项目拆分开发表和生产表
建议中等规模的团队使用。Dataform 在 BigQuery 中的不同架构和项目中创建开发表和生产表。Dataform 在专门的开发 Google Cloud 项目中发布了所有开发表。每个 Dataform 开发者都有自己用于开发表的唯一架构。此解决方案可消除开发者意外覆盖彼此的开发表的风险。这种方法的缺点是,删除开发表和架构并在每个环境中重新创建所有表可能需要更多时间。
每个 Google Cloud 项目拆分开发表、预演表和生产表
建议用于需要预演环境的大型团队或团队。Dataform 在 BigQuery 中的专用 Google Cloud 项目中执行每个环境中的表。借助此解决方案,您可以最大限度地控制代码生命周期。

所有解决方案都需要将一个 Dataform 代码库连接到单个第三方远程代码库

在所有解决方案中,开发者都会在 Dataform 工作区内手动触发开发表的执行。Dataform 会在版本配置中自动编译生产表和暂存表,并按照工作流配置中设置的频率执行这些表。

按架构拆分开发和生产环境

此解决方案会创建两种执行环境,Dataform 会在其中执行 SQL 工作流:开发和生产。如需按架构拆分开发表和生产表,您需要配置 dataform.json、工作区编译替换和版本配置。如需安排生产环境的执行,您需要创建工作流配置。

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.json

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

工作区替换项

{
schema_suffix: "dev"
}

版本配置

{
gitCommitish: "main"
}

如需安排 production 编译结果的执行,请创建工作流配置

开发流程示例

在此示例中,开发者 Sasha 和 Kai 在同一个 Dataform 代码库中工作。Dataform 代码库连接到远程第三方 Git 代码库。

它们将更改提交并推送到远程代码库中名为 sashakai 的自定义分支。

下表显示了 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.sqlx 表。
  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.sqlx 表可供 BigQuery 中 enterprise-analytics Google Cloud 项目中的 analytics 架构中的最终用户使用。

按架构和 Google Cloud 项目拆分开发和生产

此解决方案会创建两种执行环境:开发环境和生产环境。 如需按架构和 Google Cloud 项目拆分开发表和生产表,您需要配置 dataform.json、工作区编译替换和版本配置。如需安排生产环境的执行,您需要创建工作流配置。

在此解决方案中,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.json

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

工作区替换项

{
schema_suffix: "${workspaceName}"
}

版本配置

{
gitCommitish: "main"
gcloudprojectid: "enterprise-prod"
}

如需安排 production 编译结果的执行,请使用最契合您需求的自定义时间表创建工作流配置

开发流程示例

在此示例中,开发者 Sasha 和 Kai 处理同一个 Dataform 代码库。Dataform 代码库连接到远程第三方 Git 代码库。

Sasha 在名为 sasha 的专用工作区中工作,Kai 在名为 Kai 的专用工作区中工作。它们将更改提交并推送到远程代码库中名为 sashakai 的自定义分支。

下表显示了 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.sqlx 表。
  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.sqlx 表可供 BigQuery 中 enterprise-prod Google Cloud 项目中的 analytics 架构中的最终用户使用。

按架构和 Google Cloud 项目拆分开发、预演和生产

此解决方案会创建三种执行环境:开发环境、预演环境和生产环境。所有环境均按 Google Cloud 项目拆分。此外,开发会按架构从预演和生产环境中分离出来。

如需按架构和 Google Cloud 项目拆分开发表、预演表和生产表,您需要配置 dataform.json、工作区编译替换以及两项发布配置。如需安排预演和生产执行,您需要创建两个单独的工作流配置。

在此解决方案中,Dataform 会在专用的开发 Google Cloud 项目中在多个开发架构(每个 Dataform 工作区一个)中执行 BigQuery 中的开发表。

Dataform 在具有相同后缀的架构中,在专用的预演 Google Cloud 项目中执行 BigQuery 中的所有暂存表,这些表是在预演中创建的。

Dataform 在专用生产 Google Cloud 项目中,在具有相同后缀(表示这些表是在生产环境中创建的)的架构中执行 BigQuery 中的所有生产表。

下表显示了一个示例配置,该配置按架构和 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.json

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

工作区替换项

{
schema_suffix: "${workspaceName}"
}

staging 版本配置

{
gitCommitish: "main"
gcloudprojectid: "enterprise-staging"
}

prod 版本配置

{
gitCommitish: "prod"
gcloudprojectid: "enterprise-prod"
}

如需安排 stagingproduction 编译结果的执行,请创建两个具有自定义时间表的单独工作流配置,以最符合您的需求。

开发流程示例

在此示例中,开发者 Sasha 和 Kai 在同一个 Dataform 代码库中工作。Dataform 代码库连接到远程第三方 Git 代码库。

Sasha 在名为 sasha 的专用工作区中工作,Kai 在名为 Kai 的专用工作区中工作。它们将更改提交并推送到远程代码库中名为 sashakai 的自定义分支。

下表显示了 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.sqlx 表。
  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.sqlx 表可供 BigQuery 中 enterprise-prod Google Cloud 项目中的 analytics 架构中的最终用户使用。

后续步骤