Continuous integration 如果下游作业失败,则将上游Jenkins/Hudson标记为失败

Continuous integration 如果下游作业失败,则将上游Jenkins/Hudson标记为失败,continuous-integration,hudson,jenkins,hudson-plugins,Continuous Integration,Hudson,Jenkins,Hudson Plugins,我正在使用触发下游构建 如果下游作业失败,如何指定上游作业失败?上游作业实际上是虚拟作业,参数传递给下游作业 请查看以下响应:。您可以访问上游作业并使其生成失败,但。。。请注意,Hudson/Jenkins构建后操作现在不允许指定任何顺序:如果除了其他构建后操作之外还指定了groovy脚本,并且这些操作会影响构建的结果(即:测试结果的解析),如果Jenkins决定在groovy脚本之后运行上游作业,那么您将无法更新上游作业的状态。确保使用正确的步骤执行下游作业;我发现,由于我是作为“构建后步骤”

我正在使用触发下游构建


如果下游作业失败,如何指定上游作业失败?上游作业实际上是虚拟作业,参数传递给下游作业

请查看以下响应:。您可以访问上游作业并使其生成失败,但。。。请注意,Hudson/Jenkins构建后操作现在不允许指定任何顺序:如果除了其他构建后操作之外还指定了groovy脚本,并且这些操作会影响构建的结果(即:测试结果的解析),如果Jenkins决定在groovy脚本之后运行上游作业,那么您将无法更新上游作业的状态。

确保使用正确的步骤执行下游作业;我发现,由于我是作为“构建后步骤”执行我的,所以我没有“在触发的项目完成构建之前阻止”选项。将其更改为“构建任务”而不是“构建后任务”,可以让我在参数化触发器插件中找到您要查找的选项


此代码将根据下游作业状态标记上游构建不稳定/失败

/*************************************************
Description: This script needs to put in Groovy 
Postbuild plugin of Jenkins as a Post Build task.
*************************************************/

import hudson.model.*

void log(msg) {
  manager.listener.logger.println(msg)
}

def failRecursivelyUsingCauses(cause) {
     if (cause.class.toString().contains("UpstreamCause")) {
        def projectName = cause.upstreamProject
        def number = cause.upstreamBuild
        upstreamJob = hudson.model.Hudson.instance.getItem(projectName)
        if(upstreamJob) {
             upbuild = upstreamJob.getBuildByNumber(number)
             if(upbuild) {
                 log("Setting to '" + manager.build.result + "' for Project: " + projectName + " | Build # " + number)
                 //upbuild.setResult(hudson.model.Result.UNSTABLE)
                 upbuild.setResult(manager.build.result);
                 upbuild.save()

                 // fail other builds
                 for (upCause in cause.upstreamCauses) {
                     failRecursivelyUsingCauses(upCause)
                 }
             }
        } else {
            log("No Upstream job found for " + projectName);
        }
    }
}


if(manager.build.result.isWorseOrEqualTo(hudson.model.Result.UNSTABLE)) {
    log("****************************************");
    log("Must mark upstream builds fail/unstable");
    def thr = Thread.currentThread()
    def build = thr.executable
    def c = build.getAction(CauseAction.class).getCauses()

    log("Current Build Status: " + manager.build.result);
    for (cause in c) {
        failRecursivelyUsingCauses(cause)
    }
    log("****************************************");
}
else {
    log("Current build status is: Success - Not changing Upstream build status");
}

在“生成步骤”“在其他项目上配置触发器/调用生成”下,选择下游作业。选择“阻塞直到触发的项目完成其构建”。在其下保存默认设置。如果下游作业失败,此设置将使上游作业失败

我要补充的唯一一点是,阻塞的作业仍然占用构建执行器,所以对于长管道,您需要牢记这一点。非常感谢这个答案——我自己也尝试过,甚至没有想过使用构建步骤。这使用“构建后任务”插件?如果重建失败的下游作业,是否可以将上游作业标记为成功?是否可以在父上游作业完成后更改状态?