Jenkins如何区分PR与合并Webhook?实现单Job单Jenkinsfile复用
嘿,这个场景我在日常维护Jenkins流水线时碰到过好多次,其实不用搞复杂的自定义逻辑,利用GitHub和Jenkins集成时自带的环境变量就能轻松区分两种触发类型,下面给你几个实用的方案:
区分GitHub PR推送与合并触发的Jenkins构建
GitHub给Jenkins发送Webhook时,会自动注入一系列专属环境变量,我们直接在Jenkinsfile里读取这些变量就能判断触发来源:
1. 最常用方案:利用ghprbPullId与GITHUB_EVENT_NAME
这个方案依赖GitHub Pull Request Builder插件(几乎是Jenkins对接GitHub PR的标配插件):
- 如果是PR的提交推送(包括新建PR、PR内推送新代码),Jenkins会注入
ghprbPullId变量(值就是PR的编号),同时GITHUB_EVENT_NAME的值为pull_request; - 如果是PR合并到目标分支的操作,
ghprbPullId会不存在,且GITHUB_EVENT_NAME的值为push(因为合并本质是向目标分支推送了一个合并提交)。
在Jenkinsfile里的实现代码:
pipeline { agent any stages { stage('识别触发类型') { steps { script { if (env.ghprbPullId) { echo "这是PR #${env.ghprbPullId} 的提交推送触发的构建" // 这里写PR专属逻辑,比如代码静态检查、单元测试 } else if (env.GITHUB_EVENT_NAME == 'push') { echo "这是PR合并到目标分支的推送触发的构建" // 这里写合并后逻辑,比如生产环境部署、集成测试 } else { echo "这是手动触发或其他类型的构建" } } } } } }
2. Multibranch Pipeline专属:CHANGE_ID变量
如果你用的是Multibranch Pipeline(通过GitHub Branch Source插件配置),可以直接用CHANGE_ID变量:
- PR触发的构建,
CHANGE_ID会有值(对应PR编号); - 合并后的分支推送触发的构建,
CHANGE_ID为空。
简化版判断逻辑:
script { if (env.CHANGE_ID) { echo "PR #${env.CHANGE_ID} 的提交推送" } else { echo "PR合并后的分支推送" } }
3. 进阶方案:解析Webhook原始Payload
如果上面的变量满足不了需求,还可以直接读取GitHub Webhook的原始Payload(Jenkins会把它存在GITHUB_JSON环境变量里):
- PR推送的Payload中,
action字段为opened或synchronize; - PR合并的Payload中,
action字段为closed且pull_request.merged为true。
示例代码:
script { def githubEvent = readJSON text: env.GITHUB_JSON if (githubEvent.action in ['opened', 'synchronize']) { echo "PR提交推送触发" } else if (githubEvent.action == 'closed' && githubEvent.pull_request.merged) { echo "PR合并触发" } }
小提示
- 确保你安装了对应的Jenkins插件:GitHub Pull Request Builder、GitHub Branch Source,这些插件是注入上述环境变量的前提;
- 手动触发构建时,这些环境变量会为空,记得加兜底判断避免逻辑报错。
内容的提问来源于stack exchange,提问作者Behlül
相关产品推荐
相关产品推荐

