You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GitHub Actions单次推送中运行多个Databricks笔记本?

解决GitHub Action单次合并处理多个Databricks Notebook的问题

原配置的核心问题是databricks/run-notebook@v0 Action的local-notebook-path参数仅支持单个文件路径,无法直接批量处理多个Notebook。以下是两种可行的修改方案:

方案一:使用矩阵作业(推荐)

将检测修改文件和执行Notebook拆分为两个独立作业,通过矩阵遍历每个Notebook,实现独立执行:

name: run-sql-notebooks
 
on:
  push:
    branches:
      - dev
 
env:
  DATABRICKS_HOST: https://mydatabricks.cloud.databricks.com
  DATABRICKS_CLUSTER_ID: 1255-122012-pwryxyz1
  DEV: dev
 
jobs:
  detect_changed_notebooks:
    name: 检测修改的SQL Notebook
    runs-on: ubuntu-latest
    outputs:
      notebooks: ${{ steps.changed_sqls.outputs.notebooks }}
    steps:
      - name: 拉取代码仓库
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
 
      - name: 获取最后一次提交中修改的SQL Notebook
        id: changed_sqls
        run: |
          # 提取修改的SQL文件
          NOTEBOOKS=$(git diff --name-only HEAD^ HEAD | grep '\.sql$' || true)
          # 转换为JSON数组格式供矩阵解析
          if [ -z "$NOTEBOOKS" ]; then
            echo "notebooks=[]" >> $GITHUB_OUTPUT
          else
            NOTEBOOKS_JSON=$(echo "$NOTEBOOKS" | jq -R . | jq -s .)
            echo "notebooks=$NOTEBOOKS_JSON" >> $GITHUB_OUTPUT
          fi
 
  run_sql_notebooks:
    name: 执行Notebook - ${{ matrix.notebook }}
    runs-on: ubuntu-latest
    needs: detect_changed_notebooks
    if: needs.detect_changed_notebooks.outputs.notebooks != '[]'
    strategy:
      matrix:
        notebook: ${{ fromJson(needs.detect_changed_notebooks.outputs.notebooks) }}
    steps:
      - name: 拉取代码仓库
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
 
      - name: 在Databricks上执行SQL Notebook
        uses: databricks/run-notebook@v0
        with:
          run-name: "GitHub Actions - ${{ github.run_number }} - ${{ matrix.notebook }}"
          local-notebook-path: ${{ matrix.notebook }}
          git-commit: ${{ github.sha }}
          existing-cluster-id: ${{ env.DATABRICKS_CLUSTER_ID }}
          notebook-params-json: |
            {
            "env": "${{ env.DEV }}"
            }
        env:
          DATABRICKS_HOST: ${{ env.DATABRICKS_HOST }}
          DATABRICKS_TOKEN: ${{ secrets.DB_SECRET }}

关键修改点

  • 新增detect_changed_notebooks前置作业,专门负责检测修改的Notebook并输出JSON数组格式的列表
  • 使用jq工具将换行分隔的文件列表转为GitHub矩阵能识别的JSON数组
  • 主作业通过needs依赖前置结果,利用strategy.matrix遍历每个Notebook,每个文件对应独立的执行任务,失败状态单独可见

方案二:使用Bash循环单步骤执行

如果不需要独立任务,也可以在单个步骤里循环遍历文件列表,通过Databricks CLI批量执行:

name: run-sql-notebooks
 
on:
  push:
    branches:
      - dev
 
env:
  DATABRICKS_HOST: https://mydatabricks.cloud.databricks.com
  DATABRICKS_CLUSTER_ID: 1255-122012-pwryxyz1
  DEV: dev
 
jobs:
  run_sql_notebooks:
    name: 执行更新的SQL Notebook
    runs-on: ubuntu-latest
 
    steps:
      - name: 拉取代码仓库
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
 
      - name: 获取最后一次提交中修改的SQL Notebook
        id: changed_sqls
        run: |
          NOTEBOOKS=$(git diff --name-only HEAD^ HEAD | grep '\.sql$' || true)
          echo "notebooks<<EOF" >> $GITHUB_OUTPUT
          echo "$NOTEBOOKS" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT
 
      - name: 在Databricks上批量执行SQL Notebook
        if: steps.changed_sqls.outputs.notebooks != ''
        run: |
          # 安装Databricks CLI
          pip install databricks-cli
          # 配置Databricks CLI
          databricks configure --token --host $DATABRICKS_HOST <<EOF
          $DATABRICKS_TOKEN
          EOF
          # 遍历每个Notebook执行
          while IFS= read -r notebook; do
            if [ -n "$notebook" ]; then
              echo "开始执行Notebook: $notebook"
              databricks jobs run-now \
                --notebook-path "/Repos/${{ github.repository }}/$notebook" \
                --existing-cluster-id $DATABRICKS_CLUSTER_ID \
                --notebook-params '{"env": "'"$DEV"'"}'
            fi
          done <<< "${{ steps.changed_sqls.outputs.notebooks }}"
        env:
          DATABRICKS_HOST: ${{ env.DATABRICKS_HOST }}
          DATABRICKS_TOKEN: ${{ secrets.DB_SECRET }}

注意事项

  • 需要提前确保Notebook在Databricks Repos中的路径与仓库路径一致
  • 单个步骤中执行所有Notebook,一个失败会导致后续任务终止,日志较为混杂

内容的提问来源于stack exchange,提问作者Anu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:24:52