设置基于 git 的工作流
在暂存 Metabase 中创建模型、问题和仪表板,将更改提交到存储库,并将这些更改推送到生产 Metabase。
序列化仅适用于 Pro 和 Enterprise 计划(包括自托管和 Metabase 云服务)。
本文将介绍如何使用 Metabase 的序列化功能来使暂存和生产 Metabase 保持同步。
通过这种设置,您可以在暂存 Metabase 中微调您的问题、模型和仪表板。然后,当您对工作满意时,可以将这些更改提交到 Git 存储库,并将这些更改推送到生产 Metabase。
首先,设置您的暂存 Metabase
此设置仅适用于自托管的 Metabase,包括暂存和生产环境。
我们假设您已经有一个正在运行的生产 Metabase,并且您希望设置另一个 Metabase 来暂存问题、模型和仪表板的开发。
在服务器上设置您的暂存 Metabase,可以在您的本地服务器上,也可以使用您偏好的云提供商。暂存 Metabase 的版本必须与您的生产 Metabase 版本相同。每次升级生产 Metabase 时,请记得也升级您的暂存 Metabase。
为您的暂存 Metabase 创建 Metabase 应用程序数据库
您还需要为每个额外的暂存 Metabase 设置一个单独的应用程序数据库。使用 PostgreSQL 存储您的所有模型、问题、集合等(如果您的生产 Metabase 使用 MySQL,则使用 MySQL)。
您的暂存和生产数据库必须共享相同的显示名称、数据库引擎和 schema。
重申,您的暂存和生产数据库必须:
- 类型/引擎相同。例如,如果一个是 Postgres,另一个也必须是 Postgres。版本相同是理想的,但通常不重要。
- 具有相同的 schema。
- 在 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 在后台运行一些查询来为您提供元数据
- 同步获取更新的 schema。
- 扫描对列值进行采样以填充过滤器下拉菜单。
- 指纹识别对额外的列值进行采样,以帮助实现智能行为,例如条形图的自动分箱。
如果这些计划查询对您的数据库造成过大负担(通常只有在您的数据仓库非常庞大时才会出现这种情况),您可以将其关闭。有关 Metabase 如何更新元数据的更多信息,请查阅我们的文档。
何时使用同步**开启**的设置
- 您有一个暂存 Metabase。
- 您连接的数据源很小。
- 数据流是单向的,从开发到生产(即,您不需要从生产环境拉取元数据或内容)。
何时使用同步**关闭**的设置
- 您拥有(或希望拥有)多个开发 Metabase。
- 您的底层数据源很大。
- 数据流是双向的:一个或多个暂存 Metabase 向一个生产 Metabase 推送和拉取。
带同步功能的 Metabase 暂存到生产设置
在此设置中,暂存 Metabase 已开启同步。此设置为单向设置。
- 在一个暂存 Metabase 中进行更改。
- 以序列化格式(YAML 文件)导出这些更改。
- 将这些 YAML 文件提交到存储库。
- 将这些更改导入到您的生产 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,则需要使用新更改更新它们。
确保您已关闭同步
使用环境变量 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 中的更改保持同步。
- 克隆您导出生产数据的仓库。
- 进入包含您的暂存 Metabase 的 jar 文件的目录。
-
通过运行以下命令导入表元数据和精选集合
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 中。