设置基于 Git 的工作流程

在暂存 Metabase 中创建模型、问题和仪表盘,将更改提交到存储库,并将这些更改推送到生产 Metabase。

序列化仅在 ProEnterprise 计划中可用(包括自托管和 Metabase 云)。

本文将介绍如何使用 Metabase 的序列化功能,以保持暂存和生产 Metabase 同步。

通过此设置,你可以在暂存 Metabase 中微调你的问题、模型和仪表盘。然后,当你对你的工作感到满意时,你可以将这些更改提交到 git 仓库,并将这些更改推送到你的生产 Metabase。

首先,设置你的暂存 Metabase

此设置仅适用于自托管 Metabase,包括暂存和生产环境。

我们假设你已经有一个正在运行的生产 Metabase,并且你想要设置另一个 Metabase 来暂存问题、模型和仪表盘的开发。

在服务器上设置你的暂存 Metabase,可以使用本地服务器或你首选的云提供商。暂存 Metabase 必须与你的生产 Metabase 版本相同。每次升级生产 Metabase 时,请记住也升级你的暂存 Metabase。

为你的暂存 Metabase 创建 Metabase 应用程序数据库

你还需要为你想要用于暂存的每个额外的 Metabase 设置单独的应用程序数据库。使用 PostgreSQL 存储你的所有模型、问题、集合等。(或者 MySQL,如果那是你的生产 Metabase 使用的数据库)。

你的暂存数据库和生产数据库必须共享相同的显示名称、数据库引擎和模式

重申一下,你的暂存数据库和生产数据库必须

  • 类型/引擎相同。例如,如果一个是 Postgres,另一个也必须是 Postgres。相同的版本是理想的,但通常并不重要。
  • 具有相同的模式。
  • 在 Metabase 中具有相同的显示名称(填写数据库连接详细信息时的“显示名称”字段,而不是数据库名称本身)。

一旦你输入你的连接信息,你需要等待 Metabase 完成同步。

定义要检入版本控制的集合

你可以序列化所有集合,或者(最好)指定这些集合的子集。这个想法是慎重考虑你包含哪些集合。在你的暂存 Metabase 中拥有用于实验的集合,你可以将其从生产环境中排除,这可能很方便。

如果你只指定几个集合,我们建议你将它们标记为官方集合

在暂存环境中要避免的事项

  • 避免仪表盘订阅和警报。这些项特定于用户的帐户,因此 Metabase 会将它们从序列化中排除。
  • 避免在你的暂存 Metabase 中使用模型缓存,因为模型缓存会与你的生产 Metabase 冲突。

设置你的 Git 仓库和 CI(你的工作流程)

一旦你的暂存和生产 Metabase 启动并运行,你需要创建一个仓库来存储你的序列化 Metabase 内容,Metabase 将其导出为一组 YAML 文件。

在本文中,我们将使用 Github Actions 来自动化暂存和生产 Metabase 之间序列化数据的拉取和推送。你的 CI 工具(在本例中为 GitHub Actions)必须具有对此应用程序数据库的读/写访问权限。

你还需要添加一个或多个 GitHub Actions 工作流程 YAML 文件来自动化序列化过程。可选地,你可以启用分支保护,以要求在合并到你的 main 分支之前需要 PR 批准。

有两种基本的暂存到生产设置

设置包括

  • 启用同步的暂存 Metabase
  • 禁用同步的暂存 Metabase

默认情况下,Metabase 在后台运行一些查询以向你提供元数据

  • 同步获取更新的模式。
  • 扫描获取列值的样本以填充过滤器下拉菜单。
  • 指纹识别采样额外的列值,以帮助实现智能行为,例如条形图的自动分箱。

如果这些计划的查询给你的数据库带来太大压力(通常仅在你的数据仓库非常庞大时才会发生),你可以关闭它们。有关 Metabase 如何更新元数据的更多信息,请查看我们的文档

何时使用启用同步的设置

  • 你只有一个暂存 Metabase。
  • 你连接的数据源很小。
  • 数据流是单向的,从开发到生产(也就是说,你不需要从生产环境拉取元数据或内容)。

何时使用禁用同步的设置

  • 你拥有(或想要拥有)多个开发 Metabase。
  • 你的底层数据源很大。
  • 数据流是双向的:一个或多个暂存 Metabase 推送和拉取到一个生产 Metabase。

启用同步的 Metabase 暂存到生产设置

在此设置中,暂存 Metabase 启用了同步。此设置是单向的。

  • 在一个暂存 Metabase 中进行更改。
  • 以序列化格式(YAML 文件)导出这些更改。
  • 将这些 YAML 文件提交到存储库。
  • 将这些更改导入到你的生产 Metabase。

One staging Metabase (with sync on) is used to development content, which you can export, commit to a repo, then import into your production Metabase.

在你的暂存 Metabase 中开发你的内容

在你的暂存 Metabase 中创建你的内容:你的模型、问题、仪表盘、集合等等。

序列化你在你的暂存 Metabase 中所做的更改

一旦你对你的更改感到满意,你将序列化你的更改,以便你可以将它们提交到你的存储库。

要序列化你的更改,你将运行 Metabase 的 export 命令。

例如,如果你只导出集合 2、3 和 4,你可以运行

java -jar metabase.jar export repo_path --collection 2,3,4 --no-data-model --no-settings

默认情况下,Metabase 将排除嵌套集合。要包含嵌套集合,你需要像任何顶层集合一样指定它们的 ID。

Metabase 将使用你所做的更改序列化你的暂存 Metabase。你可能还想将此命令放在你检入你的仓库的 bash 脚本中,这样你就不需要每次都键入它,并且可以在开发过程中对其进行调整。

将这些更改提交到你的工作分支。一旦你将你的工作分支合并到你的 main 分支,GitHub 工作流程将运行并将这些更改导入到你的生产 Metabase。

创建一个 GitHub Action 工作流程 YAML 文件

你可以配置你的仓库,以便当你将你的序列化更改合并到你的 main 分支时,工作流程会将这些序列化更改导入到你的生产 Metabase。

这是一个启用同步的工作流程示例,或者在这里继续学习。

禁用同步的 Metabase 暂存到生产设置

在此设置中,一个或多个暂存 Metabase 关闭了同步。此设置是双向的

  • 导出你的生产数据以更新你的所有暂存 Metabase。
  • 将这些序列化的 YAML 文件更改提交到存储库。
  • 将这些更改导入到一个或多个暂存 Metabase。
  • 在这些暂存 Metabase 中开发新内容:仪表盘、模型等。
  • 从暂存 Metabase 导出这些更改,并提交导出的 YAML 文件。
  • 将该内容导入到生产环境。
  • 如果你正在运行多个 Metabase,你需要使用新更改更新它们。

One or more staging Metabase(s) (with sync off) is used to development content, which you can export, commit to a repo, then import into your production Metabase. To keep all of the staging Metabases up to date, you

确保你已关闭同步

使用环境变量 MB_DISABLE_SCHEDULER=true 禁用 Metabase 调度器。

禁用调度将关闭 Metabase 的计划作业,其中包括同步、指纹识别和扫描,以及仪表盘订阅、警报和模型缓存。

使用配置文件设置多个暂存环境

此设置你只需要一个暂存环境,但是如果你希望拥有多个暂存环境,你可以使用配置文件来设置多个暂存 Metabase。

从你的生产 Metabase 导出表元数据

由于同步已关闭,你需要从你的生产 Metabase 获取你的表元数据并将其导入到你的暂存 Metabase。

以下命令将导出你指定的集合以及表元数据。

java -jar metabase.jar export --collections COLLECTIONS_TO_SYNC --no-settings

如果你想从生产 Metabase 导出所有集合,只需省略 --collections 标志及其参数。

我们建议设置一个工作流程,以定期自动导出此数据。

这是一个工作流程示例

name: export-datamodel-from-prod
on:
  workflow_dispatch:
  # schedule:
  #  - cron: '0 */6 * * *' # Every six hours every day
env:
  MB_VERSION: 1.46.4
  COLLECTIONS_TO_SYNC: "2,3,4"
  MB_DB_TYPE: postgres
  MB_DB_DBNAME: metabase
  MB_DB_HOST: $
  MB_DB_USER: $
  MB_DB_PASS: $

jobs:
  export_data_model:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Download selected version enterprise jar
        run: |
          curl -OL https://downloads.metabase.com/enterprise/v$MB_VERSION/metabase.jar
          stat ./metabase.jar
      - name: Export datamodel and curated collections
        run: |
          java -jar metabase.jar export $GITHUB_WORKSPACE --collections $COLLECTIONS_TO_SYNC --no-settings
      - name: Push Git commit
        run: |
          git config user.name github-actions
          git config user.email [email protected]
          git add .
          if [[ $(git diff --cached --stat) != '' ]]; then
            git commit -m "Automatic export of the table metadata"
            git push
          fi

将内容从你的生产 Metabase 导入到你的暂存 Metabase

由于 Metabase 同步进程已关闭,你需要从生产环境拉取内容以“同步”你的暂存 Metabase,包括表元数据。如果你正在运行多个暂存 Metabase,则每次生产表元数据发生任何更改时,以及每次你从任何一个暂存 Metabase 向生产 Metabase 推送更改时,都需要更新它们。

手动保持你的 Metabase 同步是不切实际的,因此我们建议创建和执行一个操作,例如此操作,该操作每六小时或每天运行一次,以使你的暂存 Metabase 与你的生产 Metabase 中的更改保持同步。

  1. 克隆你导出生产数据的仓库。
  2. 切换到包含你的暂存 Metabase 的 Metabase jar 的目录。
  3. 通过运行以下命令导入表元数据和精选集合

    java -jar metabase.jar import /PATH/TO/REPO
    

    其中 /PATH/TO/REPO 是你存储来自你的生产 Metabase 的序列化数据的路径。此命令将加载更新的表元数据,以及对仓库的任何其他更改。每次有人更新你的本地仓库时,你都需要运行此命令。

在你的暂存 Metabase 中开发你的内容

登录你的暂存 Metabase 并创建你想要推送到生产环境的任何内容:模型、问题、仪表盘等等。确保将这些项目保存在你标记为导出到你的生产 Metabase 的官方集合中。

将你在你的暂存 Metabase 中所做的更改导出到你的生产 Metabase

例如,假设你只想导出集合 1,2,3。

java -jar metabase.jar export /PATH/TO/REPO --collection 1,2,3 --no-data-model --no-settings

/PATH/TO/REPO 替换为你的仓库的路径,该仓库包含你的序列化 Metabase 数据。并将 1,2,3 替换为你要导出的集合的 ID 号,用逗号分隔每个集合 ID。

export 命令将序列化你在你的开发 Metabase 中所做的更改并将它们保存到你的仓库。

将你的更改提交到分支并将该分支合并到你的 main 分支。你设置的 GitHub 工作流程将运行并将这些序列化更改导入到你的生产 Metabase。

禁用同步设置的工作流程 YAML 文件示例

禁用同步的 Git 工作流程示例.

下一步:使仪表盘更快

如何使你的仪表盘加载更快。

下一篇文章