如何在Jenkins Pipeline中获取其他Job的构建编号及URL用于邮件通知
嗨,我来帮你搞定这个Jenkins Pipeline的需求!要在邮件通知任务里拿到另一个构建任务的最新BUILD_NUMBER和构建URL——不管构建成功还是失败,我给你整理了几种实用的方案,你可以根据自己的场景选择:
方案1:通过Groovy脚本直接获取Jenkins内部构建信息(最直接)
这种方式直接调用Jenkins的内置API,能快速拿到目标任务的最新构建数据,不管它的状态是成功、失败还是被取消。
在你的邮件通知Pipeline脚本里添加这段代码:
// 替换成你的构建任务的全名(如果任务在文件夹里,要写全路径,比如'FolderName/YourBuildJob') def targetBuildJob = Jenkins.instance.getItemByFullName('你的构建任务名称') // 获取最新的构建记录(无论状态) def latestBuild = targetBuildJob.getLastBuild() if (latestBuild) { def buildNumber = latestBuild.getNumber() def buildUrl = latestBuild.getUrl() def buildStatus = latestBuild.getResult() // 这里把变量代入邮件逻辑,示例用Jenkins内置的mail步骤 mail to: '你的收件人邮箱', subject: "构建状态通知:${targetBuildJob.name} #${buildNumber} ${buildStatus}", body: """ 构建编号:${buildNumber} 构建详情URL:${Jenkins.instance.rootUrl}${buildUrl} 构建状态:${buildStatus} """ } else { echo "注意:目标构建任务还没有任何构建记录哦!" }
注意事项:
- 你需要在Jenkins的脚本安全里授权相关方法:进入
Manage Jenkins->In-process Script Approval,批准Jenkins.instance.getItemByFullName、getLastBuild、getNumber这些方法的调用,不然脚本会报错。 - 如果Jenkins开启了文件夹,记得写全任务的路径名称。
方案2:调用Jenkins REST API获取(适合跨场景调用)
如果不想用Groovy脚本,也可以通过Jenkins的REST API来拉取最新构建信息,适合需要跨系统调用或者不想处理脚本权限的场景。
先确保你安装了HTTP Request插件,然后在邮件任务的Pipeline里这样写:
def jobName = '你的构建任务名称' // 调用Jenkins API,如果你需要认证,记得配置凭据 def apiResponse = httpRequest url: "${env.JENKINS_URL}/job/${jobName}/lastBuild/api/json", authentication: '你的Jenkins凭据ID' // 可选,若Jenkins开启了认证 // 解析API返回的JSON数据 def buildData = new groovy.json.JsonSlurper().parseText(apiResponse.content) def buildNumber = buildData.number def buildUrl = buildData.url def buildStatus = buildData.result // 发送邮件 mail to: '你的收件人邮箱', subject: "构建状态通知:${jobName} #${buildNumber} ${buildStatus}", body: "构建编号:${buildNumber}\n构建详情URL:${buildUrl}\n构建状态:${buildStatus}"
注意事项:
- 如果Jenkins开启了安全认证,需要创建一个有读取任务权限的凭据(比如用户名+密码),并在
httpRequest步骤里指定。 - 确保
env.JENKINS_URL变量能正确获取到你的Jenkins地址,或者直接写死你的Jenkins域名/IP。
方案3:构建任务主动传递参数给邮件任务(最稳妥,无权限问题)
这个方案是让构建任务在完成后(无论成功失败)主动触发邮件通知任务,并把当前的BUILD_NUMBER、BUILD_URL和构建状态作为参数传递过去,完全避开脚本权限的问题,还能确保通知的是本次构建的信息,不会因为中间有新构建而拿错数据。
第一步:配置构建任务的Pipeline
在构建任务的Pipeline末尾添加post阶段,用always确保不管结果如何都触发邮件任务:
pipeline { agent any stages { stage('Build') { steps { // 这里是你的构建步骤,比如编译、打包等 echo "执行构建操作..." } } } post { always { // 无论构建成功/失败/取消,都执行下面的逻辑 build job: '你的邮件通知任务名称', parameters: [ string(name: 'TARGET_BUILD_NUMBER', value: "${currentBuild.number}"), string(name: 'TARGET_BUILD_URL', value: "${currentBuild.absoluteUrl}"), string(name: 'TARGET_BUILD_STATUS', value: "${currentBuild.result ?: 'UNKNOWN'}") ], wait: false // 不需要等待邮件任务完成,不阻塞构建 } } }
第二步:配置邮件通知任务为参数化构建
- 进入邮件通知任务的配置页面,找到General部分,勾选
This project is parameterized。 - 添加三个String Parameter:
- 名称:
TARGET_BUILD_NUMBER,描述:目标构建任务的编号 - 名称:
TARGET_BUILD_URL,描述:目标构建任务的详情URL - 名称:
TARGET_BUILD_STATUS,描述:目标构建任务的状态
- 名称:
第三步:编写邮件任务的Pipeline脚本
直接使用传递过来的参数发送邮件:
pipeline { agent any parameters { string(name: 'TARGET_BUILD_NUMBER', description: '目标构建任务的编号') string(name: 'TARGET_BUILD_URL', description: '目标构建任务的详情URL') string(name: 'TARGET_BUILD_STATUS', description: '目标构建任务的状态') } stages { stage('Send Notification') { steps { mail to: '你的收件人邮箱', subject: "构建状态通知:#${params.TARGET_BUILD_NUMBER} ${params.TARGET_BUILD_STATUS}", body: """ 您好,以下是最新的构建信息: 构建编号:${params.TARGET_BUILD_NUMBER} 查看构建详情:${params.TARGET_BUILD_URL} 构建状态:${params.TARGET_BUILD_STATUS} """ } } } }
方案选择建议
- 如果你需要每次邮件任务都获取绝对最新的构建信息(哪怕中间有新构建触发),选方案1或2;
- 如果你需要构建完成后立刻通知对应本次构建的信息,且不想处理Jenkins脚本权限问题,方案3是最优解。
内容的提问来源于stack exchange,提问作者sudhir
相关产品推荐
相关产品推荐

