Jenkins 管道脚本 - 停止先前的构建,并在构建失败时打印消息
Posted
技术标签:
【中文标题】Jenkins 管道脚本 - 停止先前的构建,并在构建失败时打印消息【英文标题】:Jenkins pipeline script - stop previous build, and print message in failed build 【发布时间】:2020-06-16 11:41:46 【问题描述】:所以,我用这段代码开始我的管道脚本:
node
if (env.JOB_NAME != 'Company/project/develop' && env.JOB_NAME != 'Company/project/master')
def jobName = env.JOB_NAME
def job = Jenkins.instance.getItemByFullName(jobName)
for (build in job.builds)
if (build.isBuilding() && build != job.builds.first())
println '*' * 30
println 'All previous builds for this job have been aborted!'
println '*' * 30
build.doStop()
而且效果很好。它会停止相同作业名称的所有先前构建。这样做的目的是在开发人员推送太多代码时优化 Jenkins,但最新推送只是重要的一个。主分支和开发分支被排除在此规则之外。
我想通过添加中断原因来稍微扩展一下。我想打印到已停止的构建中,例如:“此作业已停止,因为已过时......”
我尝试了很多在***上发布的东西,但我没有成功。
谢谢
【问题讨论】:
【参考方案1】:这是我对类似功能的实现。它将中止先前正在运行的构建,并显示原因“被较新的构建 #123 中止”
import hudson.model.Result
import hudson.model.Run
import jenkins.model.CauseOfInterruption.UserInterruption
Run previousBuild = currentBuild.rawBuild.getPreviousBuildInProgress()
while (previousBuild != null)
if (previousBuild.isInProgress())
def executor = previousBuild.getExecutor()
if (executor != null)
echo ">> Aborting older build #$previousBuild.number"
executor.interrupt(Result.ABORTED, new UserInterruption("Aborted by newer build #$currentBuild.number"))
previousBuild = previousBuild.getPreviousBuildInProgress()
【讨论】:
您好,感谢您的发帖。此代码有效,但由于某种原因,它不会打印“被较新的构建 #123 中止”,而是打印“被未知中止”... @aadlv 正确的消息将显示在状态页面中,在控制台输出中您只会看到 Aborted by unknown。 这对我不起作用:org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method hudson.model.Run getPreviousBuildInProgress
^ 该脚本安全异常需要 Jenkins 管理员解决。他们有一个管理门户,可以进入并批准在 Jenkins 沙箱中运行的潜在危险脚本。以上是关于Jenkins 管道脚本 - 停止先前的构建,并在构建失败时打印消息的主要内容,如果未能解决你的问题,请参考以下文章
如何从 jenkins 作业的 scm 轮询中排除 jenkins 文件
jenkins 管道脚本中 docker 容器的 if else 条件