如何继续使用Jenkins声明性管道语法中的失败阶段

dol*_*phy 11 jenkins jenkins-pipeline jenkins-declarative-pipeline

我想在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"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为了澄清,我不是在寻找如何在脚本语法中完成此任务.我试图理解这种流控制是否实际上是在声明性语法中支持和形式化的.为此,我将尝试准确定义我正在寻找的内容:

需要

  • 没有尝试/捕获.我不想下载到脚本模式,或者在另一个共享库或脚本块中"包装"我的声明性管道.
  • 没有post step恶作剧.我想要真正的多个阶段,而不是一个post always包含我所有其他逻辑的步骤

可选的

  • 失败的阶段应被视为失败; 我不希望失败的舞台显示为绿色,因为它被"跳过"或"继续".
  • 任何失败阶段的构建都应标记为红色(或黄色,或任何非绿色).

相关但不充分

Eri*_*k B 18

这现在是可能的:

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'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

管道示例

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

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

编辑:这是这个答案最初写的问题。这也是其他一些问题的正确答案,这就是为什么我也在那里发布了这个答案。这是多个类似问题的正确解决方案。我已经针对他们的具体问题量身定制了我的其他答案,以阐明这一点。我只是复制了答案以节省一些时间。这并不意味着它不是一个好的正确答案。


mvk*_*_il 4

我可能遗漏了一些东西,但声明式、固执己见的管道的想法是覆盖大多数简单的用例。当您需要固执己见尚未涵盖的内容时,您必须诉诸脚本化管道,这仅指“声明式管道”的“要求”:现在不会发生。

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

    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"
          }
        }
      }
    })
Run Code Online (Sandbox Code Playgroud)

当然,您必须找到或实现这样的mylib类,并且failable_stages会得到一个闭包,并将其包装在各种管道/样板代码片段中。

希望这有帮助。

  • 我将尊重地不同意共享库的目的。我的理解是它们的目的是抽象可共享的代码,而不是丑陋的代码。如果将代码放入共享库只是为了隐藏它,而不是为了在多个地方重用它,那么这就是语言或开发人员或两者的失败。也许这只是两种不同观点的情况,也许我的问题的答案确实是“你做不到”,但我确实想知道这一点。我问这个问题是因为我知道我不是这里最聪明的人。 (2认同)