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

时间:2017-05-17 10:51:39

标签: jenkins jenkins-pipeline

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

ignore(FAILURE){
    build( "system-check-flow" )
}

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

9 个答案:

答案 0 :(得分:34)

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

  1. 使用script步骤和try-catch块(类似于之前的R_K命题,但采用声明式)
  2. stage('someStage') {
        steps {
            script {
                try {
                    build job: 'system-check-flow'
                } catch (err) {
                    echo err
                }
            }
            echo currentBuild.result
        }
    }
    
    1. 使用catchError
    2. stage('someStage') {
          steps {
              catchError {
                  build job: 'system-check-flow'
              }
              echo currentBuild.result
          }
      }
      

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

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

      这一点很重要,因为在第一种情况下你总是可以通过整体构建失败(通过设置currentBuild.result = 'FAILURE'),但无法 修复构建在第二个选项(currentBuild.result = 'SUCCESS'赢得了工作)。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

很长时间以来,我一直在寻找答案,但我发现了一个破解方法!我把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"
 }

结果是您将获得以下内容: enter image description here

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

答案 3 :(得分:2)

尝试以下示例:

stage('StageName1')
{
    steps
    {
        catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE')
        {
            SomeCodeThatCanBeErrored
        }
    }
}
stage('StageName2')
{
    steps
    {
        ContinueOtherCode
    }
}

答案 4 :(得分:1)

在新管道中,您可以使用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"
   }
}

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

答案 5 :(得分:1)

除了简单地通过阶段之外,现在还可以使阶段失败,但继续执行管道并通过构建:

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将显示为失败:

Pipeline Example

您可能已经猜到了,可以随意选择buildResultstageResult,以防不稳定或其他原因。您甚至可以使构建失败并继续执行管道。

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

答案 6 :(得分:1)

有关完整的讨论,请参见this post

答案 7 :(得分:0)

对于我的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
   }
 }

sh命令在Unix平台上执行脚本的功能相同。

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

答案 8 :(得分:0)

您可以将步骤脚本放在“发布”步骤中,如果它是像步骤这样的拆解

代码如下:

    post {
    always {
        script {
            try{
                echo 'put your alway need run scripts here....if it's a teardown like step'
            }catch (err) {
                echo 'here failed'
        }
        script{
            emailext (
                xxxx
            )
        }
    }