我希望在作业恢复时从我的Jenkins管道构建发送通知。当前构建成功且最后一次构建错误(失败,中止等)时的含义。
我知道如何发送通知。我想我的问题归结为如何检查以前版本的状态,但我可能会弄错。
我试过“currentBuild.rawBuild.getPreviousBuild()?。getResult()”,但得到异常“org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:脚本不允许使用方法org.jenkinsci.plugins.workflow .support.steps.build.RunWrapper getRawBuild“。如果我关闭沙箱,它应该工作。是否可以使用沙盒?
答案 0 :(得分:17)
我找到了另一个有效的解决方案,它不需要您手动跟踪构建结果。虽然,它需要使用脚本元素:(
pipeline {
agent any
post {
success {
script {
if (currentBuild.getPreviousBuild() &&
currentBuild.getPreviousBuild().getResult().toString() != "SUCCESS") {
echo 'Build is back to normal!'
}
}
}
}
}
答案 1 :(得分:10)
有趣的问题。你可以在Jenkins声明性管道中使用'更改'帖子{}部分的一部分。但是您需要在作业中将currentBuild.result设置为SUCCESS或FAILURE,并在post部分中进行检查。就Jenkins而言,似乎没有一种简单的方法可以获得当前的构建状态(失败,成功等),而无需在管道中跟踪它 - 除非我错过了一些微妙的东西。下面是一个示例,您将在更改的部分中发送通知,以检查SUCCESS:
pipeline {
agent any
parameters {
string(name: 'FAIL', defaultValue: 'false', description: 'Whether to fail')
}
stages {
stage('Test') {
steps {
script {
if(params.FAIL == 'true') {
echo "This build will fail"
currentBuild.result = 'FAILURE'
error("Build has failed")
}
else {
echo "This build is a success"
currentBuild.result = 'SUCCESS'
}
}
}
}
}
post {
always {
echo "Build completed. currentBuild.result = ${currentBuild.result}"
}
changed {
echo 'Build result changed'
script {
if(currentBuild.result == 'SUCCESS') {
echo 'Build has changed to SUCCESS status'
}
}
}
failure {
echo 'Build failed'
}
success {
echo 'Build was a success'
}
unstable {
echo 'Build has gone unstable'
}
}
}
- 比尔
答案 2 :(得分:3)
类似于@Kolky的答案,这将是“Scripted pipeline”的片段,你使用“node {stage1 ... stage2 ... etc}”:
stage('Email') {
if (currentBuild.getPreviousBuild().getResult().toString() != "SUCCESS") {
echo 'Build is back to normal!'
stage('Send build recovered email') {
mail body: 'My build back to successful',
// from: '', replyTo: '',
subject: 'My build back to successful',
to: 'mymail@server.com'
}
}
}
答案 3 :(得分:2)
或者,您可以将脚本逻辑移出管道(理想情况下 - 使Jenkins shared pipeline library可重复使用并保持管道清洁),这样您就不需要script
块:
def sendNotification(buildStatus) {
if (buildStatus != 'SUCCESS') {
// Do nothing - only interested when status becomes GREEN
return
}
mattermostSend "${env.JOB_NAME} has recovered! (<${env.BUILD_URL}|See the build>)"
}
pipeline {
...
post {
changed {
sendNotification(currentBuild.currentResult)
}
}
}
答案 4 :(得分:0)
随附的文档会有所帮助: