Azure Pipelines合并PR触发流水线时如何获取原PR编号
根因说明
SYSTEM_PULLREQUEST_* 类预定义变量 仅在流水线由PR事件触发时才会赋值,也就是PR创建、更新、目标分支合并前的校验阶段运行的流水线,才能读到这类变量的值。当PR完成合并、触发主分支的push事件流水线时,所有PR专属变量都会被置空,官方确实没有提供内置变量,支持在合并后的流水线里直接回溯关联的原始PR、以及PR内的变更文件清单。
几个亲测可用的解决方法
- 方法1:PR校验阶段提前持久化所需信息
PR触发的流水线本身就能正常读取SYSTEM_PULLREQUEST_PULLREQUESTNUMBER变量,也可以直接拉取到当前PR的所有变更文件列表。你可以在这个阶段把PR编号、变更文件清单这类后续需要的信息,写到仓库固定路径的元数据文件、流水线共享变量组或者独立存储里,等后续合并到主分支触发流水线时,直接读取提前存好的内容即可。如果选择存到仓库文件,注意要和对应提交绑定,避免后续读错版本。 - 方法2:合并后通过提交信息反查PR编号
GitHub的PR不管是默认合并、squash合并还是rebase合并,生成的合并提交信息里默认都会携带(#PR编号)的标识。你可以在主分支触发的流水线里,先执行git命令拿到当前触发构建的最新提交信息,再用正则提取出PR编号,参考命令如下:
拿到PR编号之后,就可以拉取对应PR的变更文件列表使用了。# 读取最新一条提交的提交信息 COMMIT_MSG=$(git log -1 --pretty=%B) # 正则匹配提取PR数字编号 PR_NUMBER=$(echo $COMMIT_MSG | grep -o '#[0-9]\+' | grep -o '[0-9]\+') - 方法3:直接通过git diff拿变更文件
如果你的核心诉求只是拿到这次合并带入主分支的变更文件,不需要关联PR本身的元数据,完全可以不用回溯PR,直接在流水线里用git命令比对当前提交和上一个基线版本的差异,直接输出变更文件清单,参考命令:
如果是比对和上一个正式发布tag的差异,把# 比对当前提交和上一个提交的差异,输出所有变更文件路径 git diff --name-only HEAD^ HEADHEAD^换成对应的tag名即可。
补充说明
如果你的仓库配置了自定义PR合并提交信息模板,要确保模板里保留了PR编号标识,不然方法2的正则提取会失效。squash合并模式下方法2、方法3都可以正常使用,不会受压缩提交的影响。
内容的提问来源于stack exchange,提问作者Vishal
相关产品推荐
相关产品推荐

