Looker CI/CD 使用和工作流

本页面介绍了如何在安装和配置 CI/CD 工作流后在 Looker 中使用该工作流。

这些说明使用包含开发、质量检查和生产的三层系统。不过,您也可以将这些原则应用于双层或四层系统。

这些说明还假设您使用 GitHub 作为 Git 提供方。您可以使用其他 Git 提供方来创建 CI/CD 工作流;不过,您必须具备相应的专业知识,才能根据您的提供方修改这些说明。

工作流概览

LookML 开发者首先在其开发分支(通常命名为 dev-my-user-ydnv 之类)中编写代码,然后使用 Spectacles 测试更改并提交代码。最后,他们会打开拉取请求,以将其代码与 main 分支合并。

当拉取请求打开时,系统会将开发者带到 GitHub。开发者应使用常规提交样式编写有意义的 PR 标题,并向说明中添加将包含在更改日志中的注释。Spectacles 测试的结果应作为注释添加到 PR 中。

接下来,开发者应在 GitHub 中选择审核者。审核者会收到通知,并可将审核意见添加到 PR 中。如果审核者批准了更改,则 PR 会与 main 分支合并。系统会调用 WebHook,开发环境现在会看到更改。

Release Please 自动化流程将自动运行,并打开第二个 PR 以创建新的标记版本。或者,如果已为此目的打开 PR,Release Please 会更新该 PR。发布 PR 具有关联的版本号,以及包含所含变更的标题和说明的更改日志。

当 Release Please 生成的 PR 获得批准并合并后,系统会生成新的版本标记,并将更改日志与 main 分支合并。Looker 的 QA 实例和生产实例可以使用高级部署模式选择此版本。

有关版本编号和提交命名方面的最佳实践

您可以根据自己的环境,以任何有意义的方式命名和编号版本及其关联的标记。不过,此处使用的是语义版本控制,强烈建议您使用此方法,因为它与 Release Please 插件搭配使用效果很好。

在语义版本控制中,版本由三个以句点分隔的数字组成:MAJOR.MINOR.PATCH

  • 每次发布版本修复 bug 时,PATCH 都会递增
  • 每次发布在保持向后兼容性的同时添加或改进功能时,MINOR 都会递增,而 PATCH 会重置为零
  • 当添加向后兼容的功能时,MAJOR 会递增,而 MINORPATCH 都会设置为零

常规提交是一种根据提交对最终用户的影响来命名提交的系统。虽然不是必需的,但使用常规提交命名对于 Release Please 插件也很有用。

在常规提交命名中,每个提交消息前面都会附加一个更改范围指示器:

  • bug 修复以 fix: 表示,例如 fix: set proper currency symbol on sale_amt format
  • 新功能会用 feat: 表示,例如 feat: added explore for sales by territory
  • 具有重大更改的功能用 feat!: 表示,例如 feat!: rewrote sales explore to use the new calendar view
  • 如果文档已更新,但 LookML 未更改,提交消息以 doc: 开头

如果始终使用常规提交,那么确定接下来要使用的语义版本号通常很简单。如果提交日志仅包含 fix:doc: 提交,则应递增 PATCH。如果存在 feat: 提交,则应递增 MINOR。如果存在 feat!:,则应递增 MAJOR。Release Please 插件甚至可以自动生成 CHANGELOG 文件并标记发布版本。

使用高级部署模式

在开发实例上做出更改并以 PR 形式提交后,Release Please 插件会使用版本标记(例如 v1.2.3)标记这些更改。然后,Looker 的高级部署模式会在 Looker 界面中为 QA 和生产实例提供这些版本。

如需部署更改,请从 Looker IDE 中选择 Deployment Manager:

IDE 中的 Looker Deployment Manager 位置。

点击 Deployment Manager 右上角的选择提交链接。接下来,选择与要部署的标记相关联的三点状菜单,然后选择部署到环境

用于部署到环境的 Looker Deployment Manager 界面。

您无需再次标记部署,因此请选择部署但不标记,然后按部署到环境按钮:

用于部署但不添加标记的 Looker Deployment Manager 界面。

最后,使用 Deployment Manager 推送到生产环境。

使用 Spectacles

每位开发者都可以使用 Spectacles 来验证其更改,即使这些更改仍在其开发分支中。Spectacles 提供四种不同的验证器:

开发者提交拉取请求时,最好运行这些测试并将结果复制到拉取请求中的注释中。

SQL 验证器

SQL 验证器会测试每个探索,以验证 LookML 视图中定义的所有字段是否与数据库中的实际 SQL 列或有效的 SQL 表达式相对应。系统会按如下所示调用 SQL 验证器:

$ spectacles sql --config-file config-dev.yaml \
    --project PROJECT_NAME \
    --explores MODEL_NAME/EXPLORE_NAME \
    --branch DEV_BRANCH_NAME

例如:

$ spectacles sql --config-file config-dev.yaml \
    --project thelook_cicd \
    --explores thelook_cicd/users \
    --branch dev-my-user-ydnv

Connected to Looker version 23.18.60 using Looker API 4.0

=================== Testing 1/1 explores [concurrency = 10] ===================

✓ thelook_cicd.users passed

Completed SQL validation in 1 minute and 7 seconds.

LookML 验证器

LookML 验证器用于验证 LookML 更改是否有效且没有语法错误。其调用方式如下所示:

$ spectacles lookml --config-file config-dev.yaml \
    --project PROJECT_NAME \
    --branch DEV_BRANCH_NAME

例如:

$ spectacles lookml --config-file config-dev.yaml \
    --project thelook_cicd \
    --branch dev-my-user-ydnv

Connected to Looker version 23.18.60 using Looker API 4.0

============= Validating LookML in project thelook_cicd [warning] ==============

✗ thelook_cicd/business_pulse.dashboard.lookml failed
✗ thelook_cicd/thelook_cicd.model.lkml failed

================ thelook_cicd/business_pulse.dashboard.lookml:28 ===============

[Error] Unknown field "users.state" in explore "users" for field_filter.

LookML: https://gcpl2318.cloud.looker.com/projects/thelook_cicd/files/business_pulse.dashboard.lookml?line=28

================ thelook_cicd/business_pulse.dashboard.lookml:36 ===============

[Warning] Unknown field "users.state" (for explore "orders" in model
"thelook_cicd") referenced in dashboard element.

LookML: https://gcpl2318.cloud.looker.com/projects/thelook_cicd/files/business_pulse.dashboard.lookml?line=36

[Additional errors snipped]

Completed validation in 6 seconds.

内容验证器

内容验证器会测试在做出更改后,所有已保存的内容(例如 Look 和用户定义的信息中心 [UDD])是否仍能正常运行。为了使作业运行得更快并提供易于管理的结果,系统只会针对基于您指定的探索的内容进行验证。内容验证器的调用方式如下:

$ spectacles content --config-file config-dev.yaml \
    --project PROJECT_NAME \
    --explores MODEL_NAME/EXPLORE_NAME \
    --branch DEV_BRANCH_NAME

例如:

$ spectacles content --config-file config-dev.yaml \
    --project thelook_cicd \
    --explores thelook_cicd/users \
    --branch dev-my-user-ydnv

Connected to Looker version 23.18.60 using Looker API 4.0
Building LookML project hierarchy for project 'thelook_cicd' @ dev-my-user-ydnv

==================== Validating content based on 5 explores ====================

✗ thelook_cicd.users failed

================= test dashboard for spectacles [TheLook_CICD] =================

Tile 'test dashboard for spectacles' failed validation.

Error in thelook_cicd/users: Unknown field "users.state".

Dashboard: https://gcpl2318.cloud.looker.com/dashboards/223

========================= Business Pulse [TheLook_CICD] ========================

Filter 'State / Region' failed validation.

Error in thelook_cicd/users: Unknown field "users.state".

Dashboard: https://gcpl2318.cloud.looker.com/dashboards/190

Completed content validation in 27 seconds.

断言验证

断言验证测试您已添加到 LookML 中的数据断言,以验证数据是否正在被正确读取。例如,LookML 中的数据测试可能如下所示:

test: historic_revenue_is_accurate {
  explore_source: orders {
    column: total_revenue { field: orders.total_revenue }
    filters: [orders.created_date: "2019"]
  }
  assert: revenue_is_expected_value {
    expression: ${orders.total_revenue} = 626000 ;;
  }
}

断言验证的调用方式如下所示:

$ spectacles assert --config-file config-dev.yaml \
    --project PROJECT_NAME \
    --explores MODEL_NAME/EXPLORE_NAME \
    --branch DEV_BRANCH_NAME

例如:

$ spectacles assert --config-file config-dev.yaml \
    --project thelook_cicd \
    --explores thelook_cicd/users \
    --branch dev-my-user-ydnv

Connected to Looker version 23.18.60 using Looker API 4.0
Building LookML project hierarchy for project 'thelook_cicd' @ dev-my-user-ydnv

==================== Running data tests based on 1 explore =====================

✗ thelook_cicd.users failed

================ thelook_cicd/users/california_users_is_accurate ===============

Unknown filter field "users.state" in lookml test "california_users_is_accurate"
declaration.

LookML: https://gcpl2318.cloud.looker.com/projects/thelook_cicd/files/thelook_cicd.model.lkml?line=55

================ thelook_cicd/users/california_users_is_accurate ===============

Invalid filter: users.state

LookML: https://gcpl2318.cloud.looker.com/projects/thelook_cicd/files/thelook_cicd.model.lkml?line=55

================ thelook_cicd/users/california_users_is_accurate ===============

Assertion "count_is_expected_value" failed: expression evaluated to "No".

LookML: https://gcpl2318.cloud.looker.com/projects/thelook_cicd/files/thelook_cicd.model.lkml?line=55

Completed data test validation in 14 seconds.

默认情况下,Look 和信息中心会获得升序数字 ID,这些 ID 会用于 Look 或信息中心的网址。不过,无法在不同系统之间保持这些数据的同步。因此,开发环境中的特定信息中心的网址不会指向质量检查或生产环境中的同一信息中心。

对于 UDD,可以选择使用别名而不是 ID 作为网址的一部分。别名是一组半随机字符,而不是数字。别名可以在导入时设置,这样,类似的网址就可以指向开发环境、QA 环境和生产环境中的同一 UDD。使用别名而不是 ID 是一种最佳实践,尤其是在从 Look 或另一个 UDD“点击进入”UDD 时。

您可以通过检查 gzr dashboard cat 的输出找到 slug。slug 可在信息中心网址中代替数字 ID 使用。

使用 Gazer 迁移用户内容

在开发环境、QA 环境和生产环境之间复制 Look 和信息中心等内容通常很有用。您可能需要制作展示新 LookML 添加项的内容,或者验证保存的内容在 LookML 更改后是否仍能正常运行。在这些情况下,可以使用 Gazer 在实例之间复制内容。

LookML 信息中心

在常规 LookML CI/CD 工作流期间,LookML 信息中心会在实例之间同步。不过,如果有任何 UDD 与 LookML 信息中心同步,则可以使用以下命令通过 Gazer 对其进行更新:

gzr dashboard sync_lookml DASHBOARD_ID --host TARGET_SYSTEM_URL

用户定义的信息中心

通过引用信息中心的 ID 和 UDD 所在的 Looker 实例的网址,可以使用 Gazer 迁移用户定义的信息中心 (UDD)。Gazer 会将信息中心配置保存到 JSON 文件,然后将该文件导入到目标 Looker 实例。

用于提取 UDD 配置的命令如下所示:

gzr dashboard cat DASHBOARD_ID --host TARGET_SYSTEM_URL --dir .

这将生成一个名为 Dashboard_DASHBOARD_ID_DASHBOARD_NAME.json 的文件,其中包含信息中心的配置。

可以使用以下命令将 UDD 导入到目标系统:

gzr dashboard import Dashboard_DASHBOARD_ID_DASHBOARD_NAME.json FOLDER_ID \
    --host TARGET_SYSTEM_URL

Look

Look 迁移的工作方式与 UDD 迁移非常相似。首先,使用 Gazer 将 Look 配置保存到 JSON 文件:

gzr look cat LOOK_ID --host SOURCE_SYSTEM_URL --dir .

然后,将 Look 导入到目标实例中:

gzr look import Look_LOOK_ID_LOOK_NAME.json FOLDER_ID \
    --host TARGET_SYSTEM_URL