当前位置: 首页 > 知识库问答 >
问题:

如何在 Jenkins 声明式管道语法中继续通过失败阶段

公良俊楚
2023-03-14

我想在Jenkins声明性管道语法中定义多个阶段,它们可以在任何一个失败后继续。我找不到任何现存的真正重复的问题,因为它们都假定或允许脚本语法。

pipeline {
    agent any
    stages {
        stage('stage 1') {
            steps {
                echo "I need to run every time"
            }
        }
        stage('stage 2') {
            steps {
                echo "I need to run every time, even if stage 1 fails"
            }
        }
        stage('stage 3') {
            steps {
                echo "Bonus points if the solution is robust enough to allow me to continue *or* be halted based on previous stage status"
            }
        }
    }
}

为了澄清,我不寻求如何在脚本语法中实现这一点。我试图理解这种流控制是否在声明性语法中得到支持和形式化。为此,我将尝试准确定义我要寻找的内容:

    < li >没有尝试/捕捉。我不想陷入脚本模式,或者将我的声明性管道“包装”在另一个共享库或脚本块中。 < li >没有< code>post step诡计。我想要真正的多阶段,而不是包含所有其他逻辑的< code>post always步骤的一个阶段
    < li >失败的阶段应该被认为是失败的;我不希望失败的阶段显示为绿色,因为它被“跳过”或“继续”。 < li >具有任何失败阶段的构件应标记为红色(或黄色,或非绿色)。
    < li >即使构建失败,如何继续jenkins pipeline中的某个阶段 < li >确定Jenkins申报管道中的失败阶段 < li >继续Jenkins管道,越过失败阶段 < li >将Jenkins管道阶段显示为失败,而不会导致整个作业失败 < li>Jenkins在失败的阶段继续管道

共有3个答案

晏昀
2023-03-14

我认为这取决于工作之间的相互依赖程度。根据你的例子,我假设

  • 阶段1独立于所有其他阶段,因为它是第一个
  • 第2阶段独立于所有其他阶段,因为第1阶段可能立即失效,第2阶段仍需运行。
  • 第3阶段取决于第1阶段和第2阶段的结果

因此,相应的管道可能是:

pipeline {
    stages {
        stage('Independent tasks') {
            parallel {
                stage('stage 1') {
                    steps {
                        sh 'exit 1' // failure
                    }
                }
                stage('stage 2') {
                    steps {
                        echo 'Happens even so stage 1 fails'
                        sh 'exit 0' // success
                    }
                }
            }
            post {  // 'stage 3'
                failure {
                    echo "... at least one failed"
                }
                success {
                    echo "Success!"
                }
            }
        }
        stage ('stage 4') {
            steps {
                echo 'Happens only if all previous succeed'
            }
        }
    }
}

阶段1和阶段2将始终运行,阶段3对它们的综合成功/失败做出反应。

附加想法:此概念仅在管道的“末尾”有效。如果您在中间的某个地方需要它并且构建必须继续,您可以将其移动到自己的作业中并使用构建作业插件。

pipeline {
    stages {
    stage('Start own job for stage 1, 2, 3') {
        steps {
            build job: 'stageOneTwoThree', propagate: false, wait: true
        }
    }
    stage ('stage 4') {
        steps {
            echo 'Happens always, because "propagate: false"'
        }
    }
}
严宸
2023-03-14

我可能错过了一些东西,但是声明性、固执己见的管道的想法是提供大多数简单用例的覆盖。当你需要固执己见没有涵盖的东西时,你必须求助于脚本管道,这只是指“声明性管道”的“要求”:现在不会发生。

至于您的其他“需求”,它们没有什么意义,因为整个想法是将低级的丑陋包装到共享库中,为用户提供如下结构:

    mylib.failable_stages({
      stages {
        stage('stage 1') {
          steps {
            echo "I need to run every time"
          }
        }
        stage('stage 2') {
          steps {
            echo "I need to run every time, even if stage 1 fails"
          }
        }
        stage('stage 3') {
          steps {
            echo "Bonus points if the solution is robust enough to allow me to continue *or* be halted based on previous stage status"
          }
        }
      }
    })

当然,您必须找到或实现这样的<code>mylib</code>类,而<code>failable_stages</code>将得到一个闭包,并将其封装在各种管道/样板代码块中。

希望这是有帮助的。

谭锐藻
2023-03-14

现在这是可能的:

pipeline {
    agent any
    stages {
        stage('1') {
            steps {
                sh 'exit 0'
            }
        }
        stage('2') {
            steps {
                catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
                    sh "exit 1"
                }
            }
        }
        stage('3') {
            steps {
                sh 'exit 0'
            }
        }
    }
}

在上面的示例中,所有阶段都将执行,管道将成功,但阶段2将显示为失败:

正如您可能已经猜到的那样,您可以自由选择buildResultstageResult,以防您希望它不稳定或其他任何东西。您甚至可以使生成失败并继续执行管道。

只要确保你的 Jenkins 是最新的,因为这是一个相当新的功能

编辑:这是这个答案最初写的问题。这也是其他几个问题的正确答案,这就是为什么我也在那里发布了这个答案。这是多个类似问题的正确解决方案。我已经根据他们的具体问题调整了我的其他答案,以明确这一点。我只是复制了答案来节省自己的时间。这并不意味着这不是一个好的正确答案。

 类似资料:
  • 我有一系列执行快速检查的阶段。我想完成所有这些,即使有失败。例如: 第二阶段失败,因此默认情况下第三阶段不执行。 通常这将是的工作,但我想在阶段视图中显示它们。在下面的模型中: 构建4显示了通常发生的情况。作业失败,因此不运行

  • 问题内容: 如何报告声明式管道失败的阶段?在fail块中,我想获取failureStage.name并将其报告(最终报告为松弛)。 问题答案: PipelineVisitor是一种很好的方法。但是,如果您只想查看错误,那么利用可能会更好。 以下内容提供了每个失败步骤的映射列表,并且还遍历了下游作业。我发现它非常有用。 您将要使用共享库来避免安全沙箱警告/批准

  • 我的Jenkins流水线并行运行多个任务。似乎如果一个阶段失败,所有后续阶段将运行其<code>failure</code>post块(无论它们是否实际失败)。我不知道这是故意的还是我做错了什么。 注意:这个管道运行在一个Windows节点上,因此< code>bat('exit /b 1') 在上面的管道中,只有“失败阶段”失败,但在输出中我看到了这一点,这表明对这两个步骤都执行了< code>

  • 在Jenkins脚本管道中,您可以像这样设置PATH env变量: 注意这里解释的路径MAVENhttps://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-withenv代码集环境变量: 要设置的环境变量列表,每个变量的形式为VARIABLE=value或VARIABLE=以取消设置其他定义的变量。您还可以使用语法PATH wh

  • 问题内容: 如何在Jenkins声明式管道中循环参数化并行阶段?(或脚本管道,如果声明式不能) 这是我简单的伪示例。如何循环(“部署serverN”)阶段? 数组可能具有1..n变量。 我不想重复代码。詹金斯管道中一定有办法吗?还是我应该使用矩阵。我已经尝试了一些,但是没有成功。 我也尝试过这种方法,但是由于前一阶段不依赖于下一阶段,因此它并不是完美的。 在Blue Ocean中应该看起来像这样(

  • 问题内容: 我正在尝试将现有的Jenkins管道转换为新的声明性管道,我想知道如何正确处理邮件通知? 我目前正在使用此代码: 它运作良好,但我看不到如何使用新的声明性语法。我认为可以通过使用post()和其他通知来完成某些操作,但我不知道具体如何做。我已经试过了: 但是问题在于它不会发送任何“返回正常”邮件。 我如何在Jenkins声明性管道中使用Mailer插件来发送“返回正常”邮件? 是否应该