基于Git的工作流程设置

在预演环境中的Metabase创建模型、问题和仪表板,将您的更改提交到仓库,并将这些更改推送到生产环境中的Metabase。

序列化功能仅在Pro企业计划(仅限自托管计划)中可用。

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

使用此设置,您可以在预演环境中的Metabase中微调您的问题、模型和仪表板。然后,当您对您的作品满意时,您可以提交这些更改到git仓库,并将这些更改推送到生产环境中的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中做出更改。
  • 将这些更改导出为序列化格式(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(s)导出这些更改并提交导出的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(s)

由于 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(s) 中开发内容

登录您的预发布 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 工作流程示例.

下一步:让仪表板加载更快

如何使您的仪表板加载更快。

下一篇文章