部署和管理 DCM Projects

本主题介绍如何创建和部署 DCM Projects 来管理 Snowflake 环境(包括账户层级)。

管理 DCM project 涉及以下步骤:

  1. 为 DCM project 准备 您的 Snowflake 账户。

  2. 在项目文件中 定义 项目配置和对象。

  3. 创建 DCM Projects 对象。

  4. 计划 在部署前预览预计的更改。

  5. 部署 项目。

  6. 根据需要,通过监控、更新和重复该流程来 维护 项目。

您可以持续部署项目的增量变更以及大规模账户基础设施变更。

Snowflake 建议持续将增量变更和添加项部署到项目中,而不是在单次部署中进行 0 到 100 次大规模账户基础设施变更。

准备 DCM project

要开始使用 DCM Projects,您的 Snowflake 账户必须满足以下先决条件:

  • 可以在其中创建 DCM Projects 对象的数据库和架构

  • 具有创建 DCM Projects 对象权限的角色,以及对仓库运行查询的访问权限

  • 对于 Snowflake CLI,需要具有创建临时暂存区权限的角色

本节描述了您需要为 DCM Projects 完成的准备任务:

备注

snowflake-labs DCM 存储库 (https://github.com/Snowflake-Labs/snowflake-dcm-projects) 会不断更新资源,以帮助您入门。

  • 快速入门与演示项目:将存储库克隆到 Snowflake 工作区或本地文件夹中以试用 DCM Projects 命令并探索 DCM Projects 功能的存储库。

  • 可重复使用的 GitHub Actions:用于在 CI/CD 管道中解析清单、测试连接、规划和部署 DCM Projects 的复合操作。有关更多信息,请参阅 GitHub Actions

  • 示例工作流程:开箱即用的工作流程文件,将可复用的操作组合成完整的 CI/CD 管道。

界面工具

您可以为 DCM Projects 使用以下界面选项。

界面工具

最适合用于

Snowsight

Snowsight 中的工作区是您账户中的 Snowflake 原生云 IDE。

  • 通过 UI 轻松创建或上传 DCM 定义文件。

  • 连接到 Git 存储库以拉取和推送更改。

  • 查看、编辑和调试定义文件。

  • 使用工作区 UI 执行 DCM PLAN 和 DEPLOY 命令。

  • 浏览数据库目录以查看 DCM project 对象和其配置、管理的对象,以及部署历史记录。

  • 选择目标配置文件以自动使用链接的 DCM project 和模板化配置。

使用 Snowflake CLI本地 IDE

软件工程师最熟悉、最个性化的界面。

  • 在本地创建和编辑定义文件。

  • 连接到 Git 存储库以拉取和推送更改。

  • 具有目录上下文和可选标志的简洁 Snowflake CLI 命令。

  • 丰富的格式化输出和另存为 .json 文件的选项。

  • 利用 Cortex Code CLI 的选项,用于代理或辅助开发。

  • 有关安装和运行当地 IDE 中的 Snowflake CLI 的信息,请参阅 适用于 DCM Projects 的 Snowflake CLI

Cortex Code

Snowflake 的代理 AI 工具。有关更多信息,请参阅 DCM Projects 中的 Cortex Code

  • 本地定义文件的 AI 辅助或代理创作。

  • AI 辅助或代理代码通过运行静态分析和 DCM PLAN 命令来进行验证和调试。

SQL 命令

  • 运行来自 Snowflake CLI REPL、工作区、笔记本或工作表的 SQL 命令。

  • 使用其他实参自定义命令。

  • 相同的命令适用于所有 Snowflake SQL 接口。

DCM Projects 中的 Cortex Code

Cortex Code 是一种用于 Snowflake 的代理 AI 工具。随着 DCM 技能启用,Cortex Code 可以自主创建、迁移、调试和部署 DCM Projects。它还可以逐步与您一起工作。

备注

具备 DCM 技能的 Cortex Code 目前仅可通过 Cortex Code CLI 使用该技能。它在 Snowsight Workspaces 中不可用。

Cortex Code DCM 技能可实现以下目的:

  • 从头搭建新的 DCM project,包括清单文件、文件夹结构和定义文件。

  • 创作和编辑 DEFINE 语句、Jinja 模板和宏。

  • 运行 PLAN、DEPLOY、REFRESH、TEST 和 PREVIEW 命令。

  • 解释计划输出、诊断故障并提出修复建议。

  • 下载并检查部署工件。

  • 导航并解释现有 DCM project。

要开始使用 Cortex Code DCM 技能,请按照以下步骤操作:

  1. 安装 Cortex Code 中所述,安装 Cortex Code CLI。

  2. 在终端中启动 Cortex Code。

  3. 使用 $dcm 技能参考或在您的自然语言提示中使用术语 DCM,与您的 DCM Projects 以对话方式进行交互。

例如:

  • “为我们的分析管道创建一个新 DCM 项目”

  • “根据 PROD 目标规划我的项目”

  • “为什么我上次的计划失败了?”

  • “为客户支出添加新的动态表定义”

适用于 DCM Projects 的 Snowflake CLI

Snowflake CLI 是 Snowflake 的命令行界面。它是用于从本地 IDE 与 Snowflake 账户进行交互的工具。

  1. DCM 项目需要 Snowflake CLI 版本 3.16 或更高版本。如 安装 Snowflake CLI 中所述安装或升级 Snowflake CLI。

  2. 如 :doc:` 中所述配置与 Snowflake 账户的连接,配置 Snowflake CLI 并连接到 Snowflake </developer-guide/snowflake-cli/connecting/connect>`。确认您有有效的连接:

    snow connection test
    
  3. 导航到 Git 存储库克隆的本地目录。例如:

    cd ./Quickstarts/DCM_Quickstart_1
    
  4. 请参阅您可以使用的 Snowflake CLI DCM 命令:

    snow dcm --help
    

Git 集成

连接到存储 DCM project 定义文件的 Git 存储库。

  1. 从 Git 存储库创建新工作区

  2. 为计划的变更创建或选择 Git 分支。

    Snowflake 将该分支中的文件克隆到工作区编辑器中。

  3. 导航到 DCM project 定义文件所在的文件夹,或想要创建它们的文件夹。

创建 DCM project

所需的角色和权限

创建 DCM project 对象的用户角色必须具有以下角色和权限:

  • CREATE DCM PROJECT ON SCHEMA 权限:

    GRANT CREATE DCM PROJECT ON SCHEMA <schema_name> TO ROLE <role_name>;
    

创建 DCM project

使用以下选项之一创建 DCM project 对象。

CREATE [OR REPLACE] DCM PROJECT [IF NOT EXISTS] <my_project>
[COMMENT = 'my comment'];

访问控制和角色权限

您可以为 READ、MONITOR 或 OWNERSHIP 权限设置架构级别 DCM project 对象的基于角色的访问控制 (RBAC)。

这些权限独立于工作区、暂存区或存储库中存储的定义文件的访问控制。

权限

描述

允许的操作

READ

  • 显示 DCM project 对象是否存在。

  • 列出 DCM project 部署的对象和授权,这对用户角色可见。

    这意味着您同时需要对象自身的 DCM project 和 READ 上的 READ。

  • SHOW DCM PROJECTS LIKE '%project'

  • DESCRIBE DCM PROJECT <project>

  • SHOW ENTITIES IN DCM PROJECT <project>

MONITOR

  • 允许访问完整的部署历史记录,包括所有工件。

  • 使角色能够分析、调试或审计生产部署,但不能直接部署变更。

  • 全部 READ 权限

  • DESCRIBE DCM PROJECT <project>(包含最新部署的源和部署路径)

  • INFORMATION_SCHEMA.DCM_DEPLOYMENT_HISTORY (project_name => 'db.schema.project')

  • SHOW DEPLOYMENTS IN DCM PROJECT <project>

  • LIST 部署中的所有文件

  • GET 对 DCM project 中文件的所有访问权限

OWNERSHIP

  • 用于创建 DCM project 对象的角色是该项目的所有者。

  • 授予角色部署变更的能力。

  • 使角色能够在项目尚未部署时将项目的所有权转让给另一个角色。

  • 全部 MONITOR 权限

  • EXECUTE DCM PROJECT <project> PLAN

  • EXECUTE DCM PROJECT <project> DEPLOY

  • EXECUTE DCM PROJECT <project> PREVIEW

  • EXECUTE DCM PROJECT <project> REFRESH

  • EXECUTE DCM PROJECT <project> TEST

  • DROP DCM PROJECT <project>

  • ALTER DCM PROJECT <project>

  • GRANT READ on DCM PROJECT <project> TO ROLE <role2>

  • GRANT MONITOR on DCM PROJECT <project> TO ROLE <role2>

备注

与其他 Snowflake 命令一样,为运行命令的用户启用 来自次要角色的权限 时需遵守 EXECUTE DCM PROJECT。运行 USE SECONDARY ROLES NONE;,这样您就不会利用项目所有者角色以外的其他角色的权限。这可确保由具有相同主要角色的不同服务用户执行时,部署行为在不同环境中保持一致。

DCM 所有权 - 受管理对象

默认情况下,部署 DCM project 的角色具有所有已部署对象的 OWNERSHIP 权限。

项目定义可以包括对其他角色的 GRANT OWNERSHIP 语句。Snowflake 建议 DCM project 所有者角色仅将 DCM 管理对象的所有权授予它也拥有的另一个较低级别的角色。然后,项目可以继续管理此对象,因为项目所有者角色会“继承”新对象所有者角色的权限。

如果 DCM project 所有者角色将 DCM 管理对象的所有权授予给另一个自身不拥有的角色,则项目将无法再管理此已部署的对象,因为项目所有者角色不再拥有该对象的所有权。后续部署将失败。需要从项目中移除对象定义,或者需要将所有权重新授予项目所有者角色。

如果要将现有对象迁移到由 DCM project 管理,拥有 DCM project 对象的角色还必须拥有由 DCM project 管理的对象的所有权权限(直接所有权或通过其他角色继承的所有权)。

备注

如果是迁移的对象,我们建议添加相应的 GRANT OWNERSHIP 语句项目定义,以确保当前状态和 DCM project 定义是同步的。

定义 DCM project

DCM project 基于清单文件和一个或多个 SQL 对象定义文件。这些文件通常在 Git 存储库或本地工作区中存储和管理。

  • 清单文件

    • 指定具有相应账户标识符、DCM project 对象、这些对象的所有者角色,以及可选的模板配置的一个或多个目标环境

    • (可选)指定模板默认值和一个或多个配置,其中包含 模板变量 的值。

  • 对象定义文件

    • 定义一组要在 DCM project 中一起管理的 Snowflake 对象、授权和期望。

请参阅 创建用于存储定义文件的 DCM project 文件夹,了解如何设置 DCM project 文件夹和定义文件,以及如何使用模板来定义 DCM project。

计划 DCM project

计划 DCM project 在部署之前执行试运行以预览更改。Snowflake 会比较您的 项目定义文件 与现有对象,并显示将创建、更改或删除哪些对象。您的账户不会发生任何变化。

在部署 DCM 项目之前,使用规划来审查和验证变更。您可以指定选项,例如 配置 或计划结果的输出路径。

PLAN 会尽可能模仿 DEPLOY 命令,除非它实际上不执行任何 DDL 语句。

重要

在部署之前对项目始终运行 PLAN 命令,以帮助确保不存在语法、模板、对象依赖项、访问权限等方面的错误。查看计划输出以调试任何错误,使用提供的变量预览呈现的 Jinja,并预览部署后将进行的更改。

该计划执行以下步骤:

  1. 使用选定的配置文件或运行时提供的值呈现所有 Jinja 模板。

  2. 将所有定义与上次部署中作为部分定义的实体的当前状态进行比较。

  3. 将所有已定义的语句转换为 CREATE、ALTER、DROP、GRANT 和 REVOKE 语句。

  4. 根据语句的相互依赖关系对所有语句进行排序。

  5. 编译所有语句。

备注

虽然 PLAN 会捕获部署期间可能发生的几乎所有可能错误,但不能保证部署成功。

运行 PLAN 命令

PLAN 命令会将以下信息作为输入:

  • 清单文件的路径

    CLI 从清单中读取目标(default_target--target 标志)。对于 SQL 命令,必须提供清单文件的路径和项目名称。

  • Jinja 变量的定义值(可选)。

  • 目标的 templating_config 会自动选择配置文件。对于 SQL 命令,使用 USING CONFIGURATION 子句来指定配置文件。

  • 要覆盖的配置文件的一个或多个值(可选)。

以下示例展示了如何运行 PLAN 命令。

在本地 IDE 终端运行 snow dcm plan 命令或作为 Git 工作流程的一部分运行。

使用 CLI 命令来计划本地目录中的项目 DCM 的示例:

cd ./Quickstarts/DCM_Project_Quickstart_1/
snow dcm plan

使用 CLI 命令计划来自 Snowflake 暂存区或 Git 存储库克隆的项目 DCM 的示例是:

snow dcm plan --target PROD_US --save-output

使用 CLI 命令计划具有可选实参的项目 DCM 的示例是:

snow dcm plan
--variable "wh_size='MEDIUM'" --variable "teams = ['TEAM_A', 'TEAM_B']"
--save-output

变量需要放在双引号内,字符串值需要加上单引号。值列表需要方括号。

Snowflake CLI 命令

定义文件路径

您可以使用以下选项来引用清单和定义文件的位置。

  • 从工作区路径

    Snowsight 用户界面会自动列出所有当前工作区中的 DCM project 定义。您可以选择其中一个路径,工作区将使用它来运行 DCM 命令。

    如果您想在工作区中手动运行 SQL 命令,您还可以在任何工作区中引用相同的路径。

    提示: 工作区中每个文件后面的三点菜单可让您将该文件的完整路径复制到您的 SQL 代码。

    使用 SQL 命令,通过工作区路径计划 DCM 项目的示例是:

    EXECUTE DCM PROJECT DCM_PROJECT_DEV
      PLAN
      USING CONFIGURATION DEV
    FROM
      'snow://workspace/USER$.PUBLIC.DEFAULT$/versions/live/Quickstarts/DCM_Project_Quickstart_1'
    
  • 从磁盘上的本地 Git 存储库克隆

    在本地 IDE 中运行 CLI 命令之前,请选择包含 manifest.yml 文件的目录或者,您可以指定其他本地目录,其中包含要使用的清单和定义。

    CLI 命令从本地 Git 存储库的当前目录计划 DCM project 的示例:

    cd ./Quickstarts/DCM_Project_Quickstart_1/
    
    snow dcm plan
    
    snow dcm plan --target PROD
    

    CLI 命令从本地 Git 存储库克隆中的不同目录计划 DCM project 的示例:

    snow dcm plan DCM_PROJECT_DEV --configuration DEV --from ./Quickstarts/DCM_Project_Quickstart_2/
    
  • 来自工作流程中的远程存储库

    可以在 DCM 命令在 CI/CD 工作流程中执行时使用相同的 CLI 语法。您可以直接调用 CLI,或使用 snowflake-labs DCM 存储库中“可重复使用的 :ref:` GitHub Actions <label-dcm_github_actions>`”,这些操作会在内部处理 CLI 设置、身份验证和 DCM 命令。

    使用可重复使用的 dcm-plan 操作示例:

    steps:
      - uses: actions/checkout@v4
      - uses: Snowflake-Labs/snowflake-dcm-projects/actions/dcm-plan@v1
        with:
          target: PROD
          project-path: Quickstarts/DCM_Project_Quickstart_1/
          snowflake-user: ${{ env.SNOWFLAKE_USER }}
    
  • 来自 Snowflake 中的暂存区或 Git 存储库克隆

    如果您想在 Snowflake 中运行执行 DCM 命令的 PROCEDURE 或 TASK,此 SQL 命令可以引用账户内 Snowflake 暂存区或 Git 存储库克隆的绝对路径。

    对于 Git 存储库克隆,请考虑首先运行 ALTER GIT REPOSITORY FETCH 以获得最新版本。

    '@...' 路径只能在执行 DCM SQL 命令时使用。

    SQL 命令从 Snowflake 中暂存区或 Git 存储库克隆计划 DCM 项目的示例是:

    EXECUTE DCM PROJECT DCM_PROJECT_DEV
      PLAN
      USING CONFIGURATION DEV
    FROM
      '@DCM_DEMO.DEPLOY.DCM_DEMO/branches/main/Quickstarts/DCM_Project_Quickstart_1/'
    

计划输出

对于 PLAN 和 DEPLOY 输出格式,包括 JSON 架构和示例,请参阅 EXECUTE DCM PROJECT 命令参考的 PLAN 和 DEPLOY 输出 部分。

部署 DCM project

当您部署 DCM project 时,将执行以下操作:

  • 已定义但尚不存在的对象将被创建。

  • 已存在但与当前定义不同的对象将被更改。

  • 已定义的对象将被跳过。

  • 已存在但不再被定义的对象将被删除。

同样的行为也适用于项目中定义的授权和附加数据质量期望。

重要

为避免任何意外的数据丢失,请在运行 DEPLOY 之前始终运行并 检查您的 PLAN 输出。

每个 DCM project 任何时候只能部署一个实例。多个配置文件不能共存。使用相同的 DCM project 部署配置 B 将删除 B 中未定义的其他先前配置中的任何对象。

为每个目标环境创建一个 DCM project。然后,每个环境的 DCM project 可以指向相同的定义文件,但使用每个变量的不同值独立部署(例如 suffix => 'DEV_JS'),以便它们可以在同一个 Snowflake 账户上独立并存。

如果要使用略有变化的预定义配置文件,可以在运行时覆盖所选变量的值。

例如:

EXECUTE DCM PROJECT DCM_DEMO.PROJECTS.DCM_PROJECT_DEV
  DEPLOY
  USING CONFIGURATION DEV (suffix=>'DEV_USER', user=>'JANEDOE')
FROM
  'snow://workspace/USER$.PUBLIC.DEFAULT$/versions/live/DCM_Project_Quickstart_1';
snow dcm deploy DCM_PROJECT_DEV --configuration DEV --variable "suffix='DEV_USER'" --variable "user='JANEDOE'"

例如,每次部署尝试(成功、失败或取消)都有一个部署编号 DEPLOYMENT$1。(可选)您可以指定一个唯一的字符串作为部署 别名,以便为各个部署命名,以便在部署历史记录中更好地观察。请将部署 别名 视为代码变更的提交消息。

每个 DEPLOY 命令首先运行一个内部 PRE-PLAN,作为部署的一部分。如果 PRE-PLAN 成功,则 DEPLOY 将在之后直接执行。没有拦截或审查此内部计划步骤的选项。PRE-PLAN 的执行会进一步降低部署期间的失败风险。如果 DEPLOY 失败,您可以在错误消息中看到它是否在 PRE-PLAN 或 DEPLOY 步骤。在 PRE-PLAN 步骤期间失败类似于PLAN – 没有执行 DDL 更改。

重要

在 DEPLOY 步骤期间失败可能会导致部分执行已定义的变更。这可能会导致某些被管理对象处于未定义状态。在大多数情况下,修复根本原因并再次执行 DEPLOY 可恢复定义的目标状态。

DEPLOY 输出文件的目标路径无法自定义。部署工件始终存储在 DCM project 中。

运行 DEPLOY 命令

要执行 DEPLOY 命令,请提供以下输入:

  • 清单文件的路径。

  • 如果在清单中定义了配置文件,则必须命名配置文件。

  • (可选)配置文件的值将替换默认值。

  • (可选)部署 别名

以下示例展示了如何运行 DEPLOY 命令。

EXECUTE DCM PROJECT DCM_DEMO.PROJECTS.DCM_PROJECT_DEV
  DEPLOY
FROM
  'snow://workspace/USER$.PUBLIC.DEFAULT$/versions/live/Quickstarts/DCM_Project_Quickstart_1';

使用 Jinja 与配置文件但覆盖 wh_sizeteams 时,使用 SQL 命令来部署 DCM project 的示例是:

EXECUTE DCM PROJECT DCM_DEMO.PROJECTS.DCM_PROJECT_DEV
  DEPLOY AS "testing 2 teams"
  USING CONFIGURATION DEV (wh_size => 'MEDIUM', teams => ['TEAM_A', 'TEAM_B'])
FROM
  'snow://workspace/USER$.PUBLIC.DEFAULT$/versions/live/Quickstarts/DCM_Project_Quickstart_1';

请参阅 PLAN 和 DEPLOY 输出,了解标准计划输出结构。

管理 DCM project

显示由 DCM project 管理的所有对象

SHOW ENTITIES IN DCM PROJECT 命令允许您查看当前由特定 DCM project 管理的所有 Snowflake 对象的列表。它提供所有对象的完全限定名称列表。要查看结果,您需要 DCM project 上 READ 的权限以及查看托管对象本身的权限。

备注

结果不一定与最近部署的对象匹配。手动删除或从项目中分离的对象不会在结果中列出。

您可以使用 LIKE,按名称搜索或使用流运算符进一步处理或筛选结果集。

同样,您可以使用随此项目定义和部署的 SHOW GRANTS 和 SHOW FUTURE GRANTS。

查看当前由 DCM project 管理的所有对象的示例:

SHOW ENTITIES LIKE '%DASHBOARD%' IN DCM PROJECT DCM_DEMO.PROJECTS.DCM_PROJECT_DEV;

SHOW ENTITIES IN DCM PROJECT DCM_DEMO.PROJECTS.DCM_PROJECT_DEV
  ->> SELECT * FROM $1 WHERE "object_type" = 'DYNAMIC_TABLE';

SHOW [FUTURE] GRANTS IN DCM PROJECT DCM_DEMO.PROJECTS.DCM_PROJECT_DEV;

从 DCM project 中分离对象

使用带有 UNSET DCM PROJECT 子句的 ALTER <object> 命令可以分离已部署且现在由 DCM project 管理的对象。该命令会移除对象和 DCM project 之间的关联,但不会删除对象。当您想开始通过不同的 DCM project 管理对象时,可以使用此命令。

在再次部署之前,确保从 项目定义文件 中移除相应的 DEFINE 语句。否则,该对象将被重新集成到 DCM project 中。

将对象与 DCM project 分离的命令 SQL 示例:

ALTER TABLE MY_DB.MY_SCH.MY_TABLE
  UNSET DCM PROJECT;

您不能将已部署的授权或期望与 DCM 项目分离。

删除 DCM project

当 DCM project 对象被删除后,所有托管实体、授权和期望仍保持为“非托管”状态。

重要

删除或替换 DCM project 对象会导致您丢失该对象包含的所有部署历史记录工件。

DROP DCM PROJECT [IF EXISTS] <my_project>;

自动化 DCM project 部署

CI/CD 最佳实践

在使用 CI/CD 管道自动部署时,请遵循以下实践:

  • 以非生产环境为目标的 DCM project 应由与其生产环境对应的角色拥有,以避免意外部署到生产环境。

  • 以生产环境为目标的 DCM project 应由生产部署的专用角色拥有,该角色具有专门定制的访问权限,这些权限足以部署项目中的所有对象。

    • 避免为 DCM project 所有权使用一般管理员角色。仅将此类角色授予服务用户,而不是单个开发者。

    • 仅将专用生产部署角色授予服务用户,而不是单个开发者。

    • 将所有权限制为生产部署角色,以确保关键基础设施或数据产品的不可变性。

      如果专用生产部署角色将生产对象的所有权授予其他角色,则被授予这些角色的用户仍然可以修改或删除生产对象。

GitHub Actions

snowflake-labs DCM 存储库 (https://github.com/Snowflake-Labs/snowflake-dcm-projects) 提供了一组可重复使用的复合 GitHub Actions,用于自动执行 DCM Projects 管道。每个操作负责生命周期的一个步骤,您可以从自己的工作流程中引用它们,构建端到端的 CI/CD 管道。仅不同平台的工作流程语法有所区别;同样的 CI/CD 概念适用于 Azure DevOps、GitLab CI/CD、Bitbucket Pipelines 等。

备注

snowflake-labs DCM 存储库中的 GitHub Actions 按原样提供,仅供评估使用。它们不受 Snowflake 的官方支持。使用风险自担。

以下是可用的可重复使用的操作:

操作

描述

dcm-parse-manifest

解析 manifest.yml 并将目标名称输出为用于矩阵策略的 JSON 数组。

dcm-connection-test

测试 Snowflake 连接性,验证连接角色是否与清单 project_owner 匹配,并检查 DCM project 对象是否已存在。

dcm-plan

运行 snow dcm plan,总结变更集(按对象域统计 CREATE、ALTER、DROP 数量),并上传计划工件。(可选)将计划摘要作为注释发布到相关的拉取请求上。

dcm-deploy

部署 DCM project,具有可选的数据删除检测、动态表刷新、预期测试和部署后 SQL 脚本功能。(可选)将部署摘要发布到拉取请求。

要在工作流程中使用某个操作,请通过以下方式引用该操作:

- uses: Snowflake-Labs/snowflake-dcm-projects/actions/<action-name>@v1

有关各操作输入和输出的完整文档,请参阅 操作 README (https://github.com/Snowflake-Labs/snowflake-dcm-projects/blob/main/actions/README.md)。

先决条件

在使用可重复使用的 GitHub Actions 前,请完成以下设置步骤:

  • 存储 Git 存储库中的 DCM project 文件。

  • 为每个清单目标创建一个 **GitHub 环境**(例如 DCM_STAGEDCM_PROD_US)。环境名称必须与您 manifest.yml 中的目标名称匹配。

  • 在工作流程的 env 块中设置 SNOWFLAKE_USERDCM_PROJECT_PATH 变量,或将其设为 GitHub 存储库变量。

  • 授予工作流所需的权限:

    permissions:
      id-token: write       # Required for OIDC authentication
      contents: read
      pull-requests: write  # Required only when using comment-on-pr
    
身份验证

所有操作都使用 Snowflake CLI GitHub Action (https://github.com/snowflakedb/snowflake-cli-action) 进行身份验证。推荐使用 OIDC (OpenID Connect),因为它利用 GitHub 的内置身份令牌,无需将密码或私钥存储为密钥。

要配置 OIDC 身份验证,请创建一个 Snowflake 服务用户,并为其设置信任 GitHub 的 OIDC 提供商的工作负载身份:

CREATE USER SVC_GITHUB_ACTIONS
  TYPE = SERVICE
  DEFAULT_ROLE = 'PUBLIC'
  COMMENT = 'GitHub Actions service user for CI/CD via OIDC'
  WORKLOAD_IDENTITY = (
    TYPE = OIDC
    ISSUER = 'https://token.actions.githubusercontent.com'
    SUBJECT = 'repo:<owner>/<repo>:environment:<env_name>'
  );

<owner>/<repo> 替换为您的 GitHub 存储库,将 <env_name> 替换为 GitHub 环境名称(例如,DCM_STAGE)。如果您有多个环境,请为每个环境创建一个独立的服务用户,或使用 主体声明自定义 (https://docs.github.com/en/actions/security-for-github-actions/security-hardening-your-deployments/about-security-hardening-with-openid-connect#customizing-the-subject-claims)。然后向该服务用户授予清单中指定的 project_owner 角色。

如果您无法使用 OIDC,这些操作也支持密码、PAT 和密钥对身份验证。有关设置说明,请参阅 操作 README 身份验证部分 (https://github.com/Snowflake-Labs/snowflake-dcm-projects/blob/main/actions/README.md#authentication)。

示例工作流程

snowflake-labs DCM 存储库中的 GitHub_工作流程 (https://github.com/Snowflake-Labs/snowflake-dcm-projects/tree/main/GitHub_workflows) 目录包含开箱即用的工作流程文件,可将可重复使用的操作组合成完整的 CI/CD 管道。您可以将它们复制到存储库的 .github/workflows/ 目录,并根据项目需求进行自定义。有关完整的设置说明,请参阅 示例工作流程 README (https://github.com/Snowflake-Labs/snowflake-dcm-projects/blob/main/GitHub_workflows/README.md)。

所有示例工作流程都会从清单目标中直接读取 Snowflake account_identifierproject_owner 角色,以便特定于环境的配置存在于版本控制的 manifest.yml 而不是重复的 GitHub 密钥中。只有服务用户凭据会存储为密钥。

示例工作流程演示了以下模式,适用于任何 DCM Projects CI/CD 设置:

  • 清单驱动型配置:每个工作流程都从清单目标读取 account_identifierproject_ownerproject_name,实现环境配置的一体化管理。

  • 数据删除保护 部署工作流程会检测对数据承载对象(如数据库、架构、表和暂存区)的破坏性 DROP 操作,如果发现任何操作,则会阻止部署。

  • 顺序暂存区生产升级:只有在暂存部署成功、动态表刷新且数据质量测试通过后,生产部署才会开始。

  • 拉取请求注释:执行计划与部署摘要将以注释的形式发布在关联的拉取请求中。

示例工作流程:测试连接
  • 工作流程配置文件:DCM_1_Test_Connections.yml (https://github.com/Snowflake-Labs/snowflake-dcm-projects/blob/main/GitHub_workflows/DCM_1_Test_Connections.yml)

  • 触发器:手动触发 workflow_dispatch 事件

此工作流程验证 GitHub 操作服务用户可以连接到清单中定义的每个目标环境。在设置新存储库、注册新账户或调试身份验证问题时会使用它。该工作流程执行以下步骤:

  • 动态解析 manifest.yml 中的所有目标名称。

  • 使用 GitHub 操作矩阵策略并行测试每个目标。

  • 对于每个目标,验证 Snowflake 连接,报告连接的账户、用户和角色,并检查连接的角色是否与 DCM project 所有者相匹配。

  • 报告 DCM project 对象是否已存在,以及服务用户是否具有部署权限。

示例工作流程:测试 PR 到主分支
  • 工作流程配置文件:DCM_2_Test_PR_to_main.yml (https://github.com/Snowflake-Labs/snowflake-dcm-projects/blob/main/GitHub_workflows/DCM_2_Test_PR_to_main.yml)

  • 触发器:针对 main 分支打开、同步或重新打开的拉取请求

此工作流程同时对生产目标运行 PLAN,作为每个拉取请求的集成测试。它直接为审阅者提供有关拉取请求的计划变更的摘要。该工作流程执行以下步骤:

  • 针对 PROD 目标运行 snow dcm plan

  • 解析 plan_result.json,总结按对象域分组的 CREATE、ALTER 和 DROP 操作。

  • 上传计划工件以供以后检查。

  • 将计划摘要作为注释发布在拉取请求上。

  • 如果 PLAN 失败,则检查失败,阻止合并。

示例工作流程:部署到生产环境
  • 工作流程配置文件:DCM_3_Deploy_to_Prod.yml (https://github.com/Snowflake-Labs/snowflake-dcm-projects/blob/main/GitHub_workflows/DCM_3_Deploy_to_Prod.yml)

  • 触发器:推送到 main 分支(通常是合并的拉取请求)

此工作流程负责向单个生产目标进行计划和部署。当您不需要暂存环境或暂存过程是独立处理时,请使用此工作流程。该工作流程执行以下步骤:

  1. 计划:运行 snow dcm plan 并概括变更集。

  2. 数据删除检测:如果计划中包含针对数据库、架构、表或暂存区的 DROP 操作,则阻止管道。

  3. 部署:运行 snow dcm deploy

  4. 后期脚本(可选):运行带有 Jinja 变量注入的 SQL post-hook 脚本。

  5. 刷新动态表(可选):运行 snow dcm refresh 以应用任何新的转换逻辑。

  6. 测试预期(可选):运行 snow dcm test 以验证数据质量预期。

部署完成后,工作流程可选择将状态摘要发布到原始拉取请求上。

示例工作流程:部署到暂存区,然后部署到生产环境
  • 工作流程配置文件:DCM_4_Deploy_to_Stage_then_Prod.yml (https://github.com/Snowflake-Labs/snowflake-dcm-projects/blob/main/GitHub_workflows/DCM_4_Deploy_to_Stage_then_Prod.yml)

  • 触发器:推送到 main 分支(通常是合并的拉取请求)

此工作流程实现了顺序升级管道。变更首先会部署到暂存区,进行端到端验证,然后才会升级到生产环境。如果任意步骤失败,则管道将停止,生产环境不受影响。

每个目标(先 STAGE,后 PROD)的部署序列包括:

  1. 计划:运行 snow dcm plan 并概括变更集。

  2. 数据删除检测:如果计划中包含针对数据库、架构、表或暂存区的 DROP 操作,则阻止管道。

  3. 部署:运行 snow dcm deploy

  4. 后期脚本(可选):运行带有 Jinja 变量注入的 SQL post-hook 脚本。

  5. 刷新动态表(可选):运行 snow dcm refresh 以应用任何新的转换逻辑。

  6. 测试预期(可选):运行 snow dcm test 以验证数据质量预期。

只有在所有暂存步骤通过后,生产部署才会启动。所有作业完成后,工作流程可选择将最终状态摘要发布到原始拉取请求上。

常见问题 (FAQ)

如何重命名现有对象?
  1. 运行 DCM 项目外部的 ALTER 命令。

  2. 更改定义。

  3. 运行 PLAN 以验证新定义是否与新状态匹配(PLAN 中无更改)。

  4. 运行 DEPLOY 以保存新状态。

如何部署 DEFINE 语句尚不支持的对象?

在执行 DCM 项目计划或部署后,您可以在单独的 SQL 脚本中运行 CREATE IF NOT EXISTS 或 CREATE OR REPLACE 语句。

这两个选项都支持 Jinja2 模板化和试运行(试运行会渲染 Jinja 模板,但不会验证 SQL 编译是否成功)。

例如:

EXECUTE DCM PROJECT my_project
  PLAN ...
USING ...
FROM ...

EXECUTE IMMEDIATE
FROM
  'snow://workspace/USER$.PUBLIC.DEFAULT$/versions/head/DCM_Project_Quickstart_1/hooks/post_hook.sql'
  USING (db => 'DEV')
  dry_run = TRUE      -- shows the rendered Jinja but does not verify successful compilation
;