如何在Azure DevOps拉取请求中对Databricks Notebook做单元测试
问题背景
我们目前用Databricks Repo关联Azure DevOps作为Git仓库,dev、main、release分支已对应部署到各自环境,运行正常。现在需要在合并PR到dev分支前,对PR里的Notebook做单元测试,但缺少合适流程——因为只用Notebook,必须把PR合并后的暂存代码推到Databricks的测试仓库(/Repos/test/my_repo)才能跑测试。
我们想要的CI流程是:
- 用户创建特性分支,向dev提交PR
- Azure DevOps CI在冲突解决后,把PR合并后的代码同步到Databricks测试仓库,触发关联工作流执行单元测试
- 测试通过后再合并PR更新dev分支
之前参考AlexOtt的示例,发现它只部署源分支而非合并后的代码,所以想问:Azure DevOps里能不能拿到PR暂存代码的分支名或标签,用来更新Databricks测试仓库?另外绝对不想先合并PR再测试,这会把dev分支搞脏,还要反复提交修复PR。
解决方案
1. 利用Azure DevOps自动生成的PR合并暂存分支
Azure DevOps在PR创建后,会自动生成一个合并暂存分支,路径格式为refs/pull/{PR编号}/merge,这个分支里已经包含了源分支和目标分支(dev)解决冲突后的合并结果。不用自己创建额外分支,直接用这个暂存分支的代码即可。
2. CI流水线具体配置步骤
触发条件
设置Azure DevOps流水线仅在PR目标为dev分支时自动触发。
核心步骤
拉取合并后的暂存代码:
在CI任务里执行Git命令,直接拉取PR的合并暂存分支:git fetch origin refs/pull/$(System.PullRequest.PullRequestId)/merge git checkout FETCH_HEAD这里的
$(System.PullRequest.PullRequestId)是Azure DevOps自动注入的PR编号变量。同步到Databricks测试仓库:
用Databricks CLI的repos update命令,指定测试仓库路径和合并后的提交ID(通过Azure DevOps预定义变量System.PullRequest.MergeCommitId获取):databricks repos update --path /Repos/test/my_repo --commit-id $(System.PullRequest.MergeCommitId)这个命令会直接把测试仓库更新到PR合并后的代码状态。
触发单元测试工作流:
调用Databricks CLI触发关联的测试任务:databricks jobs run-now --job-id <你的测试任务ID>设置PR合并门禁:
在Azure DevOps的分支保护策略里,把这个CI流水线设为PR合并的必填条件,只有测试通过才能合并PR。
3. 关键变量说明
System.PullRequest.PullRequestId:当前PR的唯一编号,CI环境自动注入System.PullRequest.MergeCommitId:PR合并后的提交哈希值,确保同步的是解决冲突后的最终代码
如果一定要用分支名,也可以基于PR编号创建临时分支(比如pr-$(System.PullRequest.PullRequestId)-merge)推送到Azure DevOps,再同步到Databricks,但直接用提交ID更简洁高效。
4. 额外建议
- 每次同步测试仓库前,先执行
databricks repos reset命令重置到干净状态,避免旧代码残留影响测试结果 - 严格配置分支保护策略,禁止直接推送到dev分支,所有代码变更必须通过PR+预合并测试才能进入dev
内容的提问来源于stack exchange,提问作者Gohmz

