忽略管道构建步骤中的失败

len*_*ovi 34 jenkins jenkins-pipeline

使用jenkins构建流程插件,这是可能的:

ignore(FAILURE){
    build( "system-check-flow" )
}
Run Code Online (Sandbox Code Playgroud)

如何使用Declarative Pipeline语法执行此操作?

use*_*510 48

要忽略声明性管道中的失败步骤,您基本上有两个选项:

  1. 使用script步和try-catch块(类似于以前的R_K命题,但是以声明式的方式)
stage('someStage') {
    steps {
        script {
            try {
                build job: 'system-check-flow'
            } catch (err) {
                echo err
            }
        }
        echo currentBuild.result
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 使用 catchError
stage('someStage') {
    steps {
        catchError {
            build job: 'system-check-flow'
        }
        echo currentBuild.result
    }
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,构建都不会在例外情况下中止build job: 'system-check-flow'.在这两种情况下,echo将执行步骤(以及任何其他步骤).

但这两个选项之间存在一个重要区别.在第一种情况下,如果该try部分引发异常,则不会更改整体构建状态(so echo currentBuild.result=> SUCCESS).在第二种情况下,整体构建将失败(so echo currentBuild.result=> FAILURE).

这很重要,因为在第一种情况下(通过设置currentBuild.result = 'FAILURE')总是可以使整体构建失败,但是你无法 在第二种选项中修复构建(currentBuild.result = 'SUCCESS'不起作用).

  • @lenkovi在哪里阅读catchError的,已弃用?在詹金斯文档中找不到任何这样的语句。 (3认同)
  • 在侧节点上,您也可以使用“catchError”作为**阶段选项**。如果您想在父阶段捕获多个子阶段的错误,那么该方法会派上用场。例如 `stage('Test'){ options{ catchError(message: "测试失败", stageResult: 'UNSTABLE', buildResult: 'UNSTABLE') } stage { ... }} ` (3认同)
  • catchError现在已弃用。优先尝试 (2认同)
  • `catch(err){echo err}`,会引发错误`java.lang.ClassCastException:org.jenkinsci.plugins.workflow.steps.EchoStep.message需要类java.lang.String但接收到类hudson.AbortException`。更喜欢`echo err.getMessage()`。 (2认同)

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是最新的,因为此功能仅在“ Pipeline:Basic Steps” 2.16(2019年5月14日)之后可用。在此之前,catchError仍然可用,但没有参数:

        steps {
            catchError {
                sh "exit 1"
            }
        }
Run Code Online (Sandbox Code Playgroud)

  • 您知道从什么版本开始可用吗? (2认同)

小智 10

我一直在寻找答案,并且找到了答案!我把try / catch块放在整个阶段:

 try {
   stage('some-stage') {
         //do something
   }
 } catch (Exception e) {
    echo "Stage failed, but we continue"  
 }
 try {
   stage("some-other-stage") {  // do something }
 } catch (Exception e) {
    echo "Stage failed, but we still continue"
 }
Run Code Online (Sandbox Code Playgroud)

结果,您将获得如下内容: 在此处输入图片说明

这仍然不是理想的,但是它给出了必要的结果。


Van*_*ano 6

在最新版本中,可以通过propogate=false选项来构建步骤。

链接: https //jenkins.io/doc/pipeline/steps/pipeline-build-step/

例: build job:"jobName", propagate:false

  • 好吧,这与构建步骤无关,而在于是否将失败从“jobName”传播到运行它的构建。 (2认同)

Pow*_*tat 5

对于我的 decalartive 管道,我找到了另一个解决方案:

stage('Deploy test')
 {
  steps
   {      
    bat returnStatus: true, script: 'sc stop Tomcat9'
    // The return value of the step will be the status code!
    // evaluate return status yourself, or ignore it
   }
 }
Run Code Online (Sandbox Code Playgroud)

这同样适用于 sh 命令在 Unix 平台上执行脚本。

该示例忽略了返回状态,因为由于先前的管道运行失败,tomcat 可能已经停止。


小智 5

试试这个例子:

stage('StageName1')
{
    steps
    {
        catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE')
        {
            SomeCodeThatCanBeErrored
        }
    }
}
stage('StageName2')
{
    steps
    {
        ContinueOtherCode
    }
}
Run Code Online (Sandbox Code Playgroud)


zet*_*t42 5

catchError作为对用作步骤脚本中的现有工作解决方案的补充,您还可以用作阶段catchError选项。

如果您想在父阶段捕获多个子阶段的错误,这非常有用:

pipeline {
    agent any
    stages {
        stage('Tests') {
            options { 
                catchError(message: "Test failed", stageResult: 'UNSTABLE', buildResult: 'UNSTABLE') 
            } 
            stages {
                stage('Test 1') {
                    echo 'test 1 succeeded'
                }        
                stage('Test 2') {
                    error 'test 2 failed'
                }        
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这没有明确记录,但有一个提示,您可以使用步骤作为选项(强调我的):

但是,阶段级选项只能包含重试、超时或时间戳等步骤,或与阶段相关的声明性选项,例如skipDefaultCheckout。

它列出了几个步骤作为示例,但并不是唯一可能用作选项的步骤。此外,如果您输入无效选项,Jenkins 会在错误消息中列出所有可用选项,其中包括catchError.


小智 3

在新的管道中,您可以使用 try-catch 来实现这一点。

node{
   try{
      build job: 'system-check-flow'
   }    
   catch (err){
      echo "system-check-flow failed"
   }
   try{
      build job: 'job2'
   }    
   catch (err){
      echo "job2 failed"
   }
}
Run Code Online (Sandbox Code Playgroud)

在这里它将构建“系统检查流程”作业。如果失败,它将捕获错误,忽略,然后继续构建“job2”

  • 虽然这看起来可行,但它不是使用声明性管道语法构建的。 (6认同)