Looker CI/CD 用法和工作流

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

这些说明使用一个包含开发、质量检查和生产的三层式系统。但是,您可以对双层或四层系统应用相同的原则。

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

工作流概览

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

打开拉取请求后,开发者会转到 GitHub。开发者应使用常规的提交风格编写有意义的 PR 标题,并对将包含在更新日志中的说明添加注释。Spectacles 测试结果应作为注释添加到 PR。

接下来,开发者应在 GitHub 中选择一位审核者。评价者会收到通知,并且可以将自己的评价添加到 PR。如果审核者批准更改,PR 会与 main 分支合并。系统调用了 WebHook,开发环境现在会看到相应更改。

“请发布”自动化操作会自动运行并打开第二个 PR,以创建新的带标签的版本。或者,如果已有 PR 可出于此目的发布,“请发布”更新该 PR。版本 PR 具有与之关联的版本号,以及一个更新日志,其中包含所含更改的标题和说明。

在“请生成的 PR”获得批准并合并后,系统会生成一个新的版本标记,并将更新日志与 main 分支合并。Looker 的质量检查和生产实例可以使用高级部署模式选择此版本。

为版本编号和为提交命名的最佳实践

您可以采用适合自己环境的任何方式对版本及其关联标记进行命名和编号。不过,此处使用了语义版本控制,并且强烈建议您使用,因为它可与“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 提交后,“请发布”插件会使用类似 v1.2.3 的版本标记来标记这些更改。然后,Looker 的高级部署模式会在 Looker 界面中用于质量检查实例和生产实例。

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

Looker Deployment Manager 在 IDE 中的位置。

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

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

您无需再次为部署添加标记,因此选择在不添加标记的情况下部署,然后按部署到环境按钮:

Looker Deployment Manager 界面,用于在不标记的情况下部署。

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

使用眼镜

每个开发者都可以使用 Spectacles 来验证自己的更改,前提是他们仍在开发分支中。Spectacles 提供四种不同的验证器:

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

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 和信息中心会在 Look 或信息中心的网址中使用以升序显示的数字 ID。但是,没有办法在各系统之间保持这些同步。因此,开发中的特定信息中心的网址在质量检查或生产环境中不会指向同一个信息中心。

对于 UDD,可以选择在网址中包含 Slug,而不是 ID。Slug 是一组半随机的字符,而不是数字。Slug 可设置为导入的一部分,以便类似网址可以指向开发、质量检查和生产中的同一 UDD。最佳实践是使用 slugs 而不是 ID,尤其是从 Look 或其他 UDD “点击”到 UDD 时。

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

使用 Gazer 迁移用户内容

在开发、质量检查和生产之间复制 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