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

Jenkins:忽略管道构建步骤中的失败,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,使用jenkins build flow插件,这是可能的: ignore(FAILURE){ build( "system-check-flow" ) } 如何使用声明性管道语法实现这一点?在新管道中,可以使用try-catch实现这一点 node{ try{ build job: 'system-check-flow' } catch (err){ echo "system-check-flow failed" } try

使用jenkins build flow插件,这是可能的:

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

如何使用声明性管道语法实现这一点?

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

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

  • 使用
    script
    step和
    try catch
    block(类似于R_K之前的主张,但采用声明式)
  • 使用
    catchError
  • 在这两种情况下,生成作业“系统检查流”中出现异常时,生成不会中止。。在这两种情况下,都将执行
    echo
    步骤(以及以下任何其他步骤)

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


    这一点很重要,因为在第一种情况下(通过设置
    currentBuild.result='FAILURE'
    ),您始终可以使整个生成失败,但是无法在第二种情况下修复生成(
    currentBuild.result='SUCCESS'
    ).

    在最新版本中,可以将
    propogate=false
    选项传递到构建步骤

    链接:

    示例:
    构建作业:“jobName”,传播:false

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

    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可能已经停止,因为之前的管道运行失败。

    我一直在寻找答案,我发现了一个解决方法!我把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"
     }
    
    因此,您将得到如下结果:


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

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

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

    正如您可能已经猜到的,您可以自由选择
    buildResult
    stageResult
    ,以防它不稳定或其他任何情况。您甚至可以使构建失败并继续执行管道

    只需确保您的Jenkins是最新的,因为此功能仅在之后可用。在此之前,
    catchError
    仍然可用,但没有参数:

            steps {
                catchError {
                    sh "exit 1"
                }
            }
    
    有关完整的讨论,请参阅。

    尝试以下示例:

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

    如果是像拆卸一样的步骤,可以将步骤脚本放在“post”步骤中

    代码如下:

        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
                )
            }
        }
    

    虽然这看起来可以工作,但它不是使用声明性管道语法构建的。@Sven这不是问题-您可以将
    try{}..catch(){}
    包装到
    脚本{}
    块中,使其在声明性syntaxcatchError中工作,现在不推荐使用。宁愿尝试catch
    catch(err){echo err}
    ,引发错误
    java.lang.ClassCastException:org.jenkinsci.plugins.workflow.steps.EchoStep.message需要类java.lang.String,但收到类hudson.AbortException
    。首选
    echo err.getMessage()
    @lenkovi您在哪里读到的catchError不推荐?在jenkins文档中找不到任何此类语句。在侧节点上,您可以将
    catchError
    也用作stage选项。如果您有多个子阶段希望捕获父阶段中的错误,则此功能非常有用。例如
    stage('Test'){options{catchError(消息:“Test failed”,stageResult:'UNSTABLE',buildResult:'UNSTABLE')}stages{…}
    @Jroger谢谢,我刚刚建议解决这个问题!我的用例是许多独立的构建,由于硬件限制,它们无法并行运行,但即使第一个构建失败,它们仍然必须全部运行@Stacey我喜欢你的解决方案,你可以捕获阶段内的所有错误,并通过将所有坏的阶段添加到一个长列表中来忽略它们,然后在任何构建失败时“重新抛出”,就在最后。因为在这里,坏的阶段仍然超出了失败的“范围”。主要是因为它消除了重新抛出代码中的逻辑错误和捕获中的任何意外错误。这对我不起作用。我在«try»上遇到以下错误:«WorkflowScript:预期为一个阶段»。您知道这是什么版本吗?好吧,这不是关于构建步骤,而是关于是否将faile从“jobName”传播到运行它的构建。
    stage('StageName1')
    {
        steps
        {
            catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE')
            {
                SomeCodeThatCanBeErrored
            }
        }
    }
    stage('StageName2')
    {
        steps
        {
            ContinueOtherCode
        }
    }
    
        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
                )
            }
        }