如何通过Azure Pipeline Post-Deployment Gate校验Databricks Job状态
实现方案(无代理占用,基于Azure DevOps Gates)
核心思路
原有while循环方案会全程占用构建代理,我们可以拆分为两个逻辑环节,用Azure DevOps服务端运行的Gates替代代理端的等待逻辑:
- 第一阶段仅负责触发Databricks作业,将生成的作业运行ID输出为流水线变量,触发完成后立刻释放代理
- 在触发阶段和后续Staging阶段之间添加Gates校验逻辑,由Azure DevOps服务端按指定间隔轮询Databricks作业状态,校验通过才允许进入下一阶段,全程不占用代理资源
实现步骤
1. 前置准备
提前在Azure DevOps中完成两个配置:
- 新建Databricks个人访问令牌(PAT),存入Azure DevOps的变量组/安全变量,命名为
databricks.pat - 新建一个空环境,命名为
DatabricksJobWaitEnv,后续我们将Gates绑定到这个环境上
2. YAML配置示例
# 定义全局变量,可根据实际情况调整 variables: databricks.instance.url: "你的Databricks工作区URL" databricks.job.train.id: "你的Databricks训练作业ID" stages: # 第一阶段:仅触发Databricks作业,不等待执行结果 - stage: TriggerDatabricksJob displayName: '触发Databricks训练作业' jobs: - job: TriggerJob displayName: '触发训练作业' pool: vmImage: 'ubuntu-latest' steps: - task: Bash@3 displayName: '调用Databricks CLI触发作业并输出run_id' inputs: targetType: 'inline' script: | # 安装databricks cli(如果代理镜像没有预装) pip install databricks-cli # 配置databricks认证 export DATABRICKS_HOST=$(databricks.instance.url) export DATABRICKS_TOKEN=$(databricks.pat) # 触发作业,获取run_id run_id=$(databricks jobs run-now --job-id $(databricks.job.train.id) | jq -r ".run_id") # 将run_id设为阶段输出变量,供后续Gates校验使用 echo "##vso[task.setvariable variable=databricks.run.id;isOutput=true]$run_id" name: TriggerStep # 必须指定步骤名,才能引用输出变量 # 第二阶段:校验Databricks作业状态,校验通过后执行Staging部署 - stage: Staging displayName: '部署到预发环境' dependsOn: TriggerDatabricksJob # 引用前一阶段输出的run_id variables: runId: $[ stageDependencies.TriggerDatabricksJob.TriggerJob.outputs['TriggerStep.databricks.run.id'] ] jobs: - deployment: DeployToStaging displayName: '预发环境部署' # 绑定带Gates的环境 environment: DatabricksJobWaitEnv pool: vmImage: 'ubuntu-latest' strategy: runOnce: deploy: steps: # 这里放你原本Staging阶段的部署逻辑 - script: echo "Databricks作业执行成功,开始部署到预发环境"
3. 配置环境Gates
进入你刚才新建的DatabricksJobWaitEnv环境的配置页面,添加「调用REST API」类型的Gates,配置如下:
- 检测间隔:按你的需求设置,比如5分钟
- 超时时间:设置为Databricks作业的最大允许运行时长,比如24小时
- REST API配置:
- 连接类型:通用
- 方法:GET
- URL:
$(databricks.instance.url)/api/2.1/jobs/runs/get?run_id=$(runId) - 请求头:添加
Authorization: Bearer $(databricks.pat) - 成功规则:选择「表达式」,输入表达式
eq(root['state']['result_state'], 'SUCCESS')
配置完成后,流水线运行到Staging阶段时,会先触发Gates逻辑,由Azure DevOps服务端按间隔轮询作业状态,直到作业成功才会执行后续的部署步骤,全程不会占用构建代理。
内容的提问来源于stack exchange,提问作者kanimbla
相关产品推荐
相关产品推荐

