通过CI/CD自动化Superset仪表板部署的最佳实践与落地流程
如何通过CI/CD流水线部署Superset元数据到UAT/Prod环境
核心思路
Superset的仪表板、图表、数据集都存储在其关联的元数据库中,部署的核心逻辑是:在开发环境导出元数据文件→提交到Bitbucket版本控制→通过CI/CD流水线拉取文件后,按依赖顺序(数据集→图表→仪表板)批量导入到目标UAT/Prod环境的Superset实例,避免因依赖缺失导致导入失败。
一、准备导出/导入脚本
先编写Python脚本(或使用Superset CLI)处理元数据的导出和导入:
- 导出脚本:调用Superset API或使用
superset export-dashboards/superset export-datasets命令,将元数据导出为JSON/YAML文件,提交到Bitbucket仓库。 - 导入脚本:严格按依赖顺序导入,示例逻辑如下:
import os import requests import json def import_metadata(env): # 根据环境加载配置 config_map = { "uat": {"url": os.getenv("SUPERSET_UAT_URL"), "token": os.getenv("SUPERSET_UAT_TOKEN")}, "prod": {"url": os.getenv("SUPERSET_PROD_URL"), "token": os.getenv("SUPERSET_PROD_TOKEN")} } config = config_map[env] headers = {"Authorization": f"Bearer {config['token']}"} # 导入数据集 with open("metadata/datasets.json") as f: for ds in json.load(f): resp = requests.post(f"{config['url']}/api/v1/dataset/", headers=headers, json=ds) resp.raise_for_status() # 导入图表 with open("metadata/charts.json") as f: for chart in json.load(f): resp = requests.post(f"{config['url']}/api/v1/chart/", headers=headers, json=chart) resp.raise_for_status() # 导入仪表板 with open("metadata/dashboards.json") as f: for db in json.load(f): resp = requests.post(f"{config['url']}/api/v1/dashboard/", headers=headers, json=db) resp.raise_for_status() if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument("--env", choices=["uat", "prod"], required=True) args = parser.parse_args() import_metadata(args.env)
二、各CI/CD工具的具体实现
1. Bitbucket Pipelines
在仓库根目录创建bitbucket-pipelines.yml,配置自动部署到UAT,Prod需手动审批:
pipelines: branches: main: - step: name: 部署到UAT环境 image: python:3.9 script: - pip install requests - python scripts/import_superset_metadata.py --env uat deployment: uat env: - SUPERSET_UAT_URL=$SUPERSET_UAT_URL - SUPERSET_UAT_TOKEN=$SUPERSET_UAT_TOKEN - step: name: 部署到Prod环境(需手动审批) image: python:3.9 script: - pip install requests - python scripts/import_superset_metadata.py --env prod deployment: prod trigger: manual env: - SUPERSET_PROD_URL=$SUPERSET_PROD_URL - SUPERSET_PROD_TOKEN=$SUPERSET_PROD_TOKEN
注:Superset的URL和Token需在Bitbucket仓库「Repository settings → Repository variables」中配置。
2. GitHub Actions
创建.github/workflows/superset-deploy.yml,利用GitHub环境和审批功能:
name: Superset元数据部署 on: push: branches: [ main ] jobs: 部署到UAT: runs-on: ubuntu-latest environment: uat steps: - uses: actions/checkout@v4 - name: 配置Python环境 uses: actions/setup-python@v5 with: python-version: '3.9' - name: 安装依赖 run: pip install requests - name: 导入元数据到UAT run: python scripts/import_superset_metadata.py --env uat env: SUPERSET_UAT_URL: ${{ secrets.SUPERSET_UAT_URL }} SUPERSET_UAT_TOKEN: ${{ secrets.SUPERSET_UAT_TOKEN }} 部署到Prod: needs: 部署到UAT runs-on: ubuntu-latest environment: prod steps: - uses: actions/checkout@v4 - name: 配置Python环境 uses: actions/setup-python@v5 with: python-version: '3.9' - name: 安装依赖 run: pip install requests - name: 导入元数据到Prod run: python scripts/import_superset_metadata.py --env prod env: SUPERSET_PROD_URL: ${{ secrets.SUPERSET_PROD_URL }} SUPERSET_PROD_TOKEN: ${{ secrets.SUPERSET_PROD_TOKEN }} concurrency: group: prod-deployment cancel-in-progress: false
注:需在GitHub仓库「Settings → Environments」中配置UAT/Prod环境,并添加对应的Secrets。
3. Cloud Build
创建cloudbuild.yaml,结合Cloud Build的手动审批功能:
steps: - name: 'python:3.9' id: deploy-uat entrypoint: 'bash' args: - '-c' - | pip install requests python scripts/import_superset_metadata.py --env uat env: - 'SUPERSET_UAT_URL=${_SUPERSET_UAT_URL}' - 'SUPERSET_UAT_TOKEN=${_SUPERSET_UAT_TOKEN}' - name: 'python:3.9' id: deploy-prod entrypoint: 'bash' args: - '-c' - | pip install requests python scripts/import_superset_metadata.py --env prod env: - 'SUPERSET_PROD_URL=${_SUPERSET_PROD_URL}' - 'SUPERSET_PROD_TOKEN=${_SUPERSET_PROD_TOKEN}' waitFor: ['deploy-uat'] triggers: - manual: true
注:构建时需传递环境变量_SUPERSET_UAT_URL、_SUPERSET_UAT_TOKEN等,可通过Cloud Build触发器配置。
三、企业标准流程
- 元数据版本化:开发环境修改Superset后,导出元数据文件,提交到Bitbucket仓库,和业务代码一起做版本控制,每次变更需提交清晰的commit信息。
- 环境隔离:Dev、UAT、Prod环境完全独立,每个环境有专属的Superset实例和元数据库,禁止跨环境直接操作。
- 自动化验证:UAT部署完成后,自动运行验证脚本:检查数据集连接状态、图表渲染是否正常、仪表板组件是否完整,验证通过后才能进入Prod部署环节。
- Prod审批机制:Prod部署必须经过指定角色(如运维负责人、产品经理)的手动审批,避免未经确认的变更上线。
- 回滚策略:保留历史版本的元数据文件,CI/CD支持回滚到指定commit的元数据版本,若Prod部署失败,可快速恢复到上一个稳定版本。
- 权限管控:
- CI/CD使用的Superset账号为专用服务账号,仅拥有元数据导入/更新权限,无其他操作权限;
- Bitbucket仓库仅对相关开发、运维团队开放提交权限,避免无关人员修改元数据。
- 日志与监控:收集CI/CD部署日志和Superset导入日志,对接企业监控系统(如ELK、Cloud Logging),便于快速排查部署失败问题。
内容的提问来源于stack exchange,提问作者Manish Kumar Pandey
相关产品推荐
相关产品推荐

