教程:设置基于 Git 的工作流

在暂存环境的 Metabase 中创建模型、问题和仪表板,将更改提交到存储库,然后将这些更改推送到生产环境的 Metabase。

序列化仅适用于 ProEnterprise 计划(包括自托管和 Metabase 云服务)。

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

通过此设置,您可以微调暂存 Metabase 中的问题、模型和仪表板。然后,当您对工作满意后,您可以将这些更改提交到 Git 存储库,并将这些更改推送到生产环境的 Metabase。

首先,设置您的暂存 Metabase

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

我们假设您已经有一个生产环境的 Metabase,并且您想要设置另一个 Metabase 来暂存问题、模型和仪表板的开发。

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

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

您还需要为要用于暂存的每个其他 Metabase 设置一个单独的应用程序数据库。使用 PostgreSQL 来存储您的所有模型、问题、集合等。(如果您的生产环境 Metabase 使用 MySQL,则可以使用 MySQL)。

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

再说一遍,您的暂存和生产数据库必须

  • 属于同一类型/引擎。例如,如果一个是 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 脚本中,并将其提交到您的存储库,这样您就不必每次都输入它,并且可以在开发时进行调整。

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

创建 GitHub Action 工作流 YAML 文件

您可以配置您的存储库,以便当您将序列化更改合并到主分支时,工作流会将这些序列化更改导入到您的生产环境 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 github-actions@github.com
          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。

导出命令将序列化您在开发 Metabase 中所做的更改并将其保存到您的存储库。

将您的更改提交到分支,然后将该分支合并到您的主分支。您设置的 GitHub 工作流将运行并将这些序列化更改导入到您的生产环境 Metabase。

同步关闭设置的示例工作流 YAML 文件

Git 工作流示例(同步关闭).

这有帮助吗?

感谢您的反馈!
订阅新闻通讯
Metabase 的更新和新闻
© . This site is unofficial and not affiliated with Metabase, Inc.