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 条件

如何测试使用分支名称的Jenkins管道(或其他jenkins脚本)?

Jenkins根据以前的构建状态构建频率

如何将完成的管道作业构建发布到公共 Jenkins 实例?

获取已推送更改的已更改分支的名称,Jenkins管道脚本