Jenkins管道脚本中的Try-Catch块

j2cgzkjk  于 2022-09-20  发布在  Jenkins
关注(0)|答案(5)|浏览(392)

我尝试使用以下代码来执行构建,并最终在构建成功时执行构建后操作。尽管如此,我还是得到了一个多重编译错误异常,说明我的try块不是有效的节定义。请帮帮忙,我试了很多次重新组织区块,但似乎无法解决这个问题。

pipeline{

agent any 
    try {
        stages{
            stage("Parallel 1") {
                steps {
                    parallel (
                       'firstTask' : { 
                            build( "DSL-Controll-Demo-Fibonacci-1" )
                        },
                        'secondTask' : { 
                            build( "DSL-Controll-Demo-Fibonacci-2" )
                        }
                    )
                }
            }
            stage("Feature") {
                steps {
                        build( "DSL-Controll-Demo-Fibonacci-5" )
                        build( "DSL-Controll-Demo-Fibonacci-6" )
                }
            }
            stage("Parallel 2") {
                steps{
                    parallel (
                        "thirdTask" : { 
                            build( "DSL-Controll-Demo-Fibonacci-3" )
                        },
                        "forthTask" : { 
                            build( "DSL-Controll-Demo-Fibonacci-4" )
                        }
                    )
                }
            }
        }
    }   

    catch(all) {
        currentBuild.result = 'FAILURE'
    }   

    if(currentBuild.result != 'FAILURE') {
        stages{
            stage("Post Build") {
                steps {
                    build("DSL-Controll-Demo-Fibonacci-7")
                }   
            }   
        }
    }
}
vptzau2j

vptzau2j1#

试着这样做(顺便说一句,没有双关语)

script {
  try {
      sh 'do your stuff'
  } catch (Exception e) {
      echo 'Exception occurred: ' + e.toString()
      sh 'Handle the exception!'
  }
}

关键是使用声明性管道语法将TRY...CATCH放在脚本块中。那么它就会奏效。如果您想说尽管失败仍继续流水线执行(例如:测试失败,仍需要报告..),这可能很有用。

uelo1irk

uelo1irk2#

您使用的是声明性样式来指定管道,因此不能使用try/Catch块(用于脚本化管道),而必须使用POST部分。请参阅:https://jenkins.io/doc/book/pipeline/syntax/#post-conditions

f0ofjuux

f0ofjuux3#

查找Jenkins的AbortException类。您应该能够使用这些方法来获取简单的消息或堆栈跟踪。在一个简单的例子中,当在脚本块中进行调用时(如其他人所指出的),您可以调用getMessage()来获得要回显给用户的字符串。示例:

script {
        try {
            sh "sudo docker rmi frontend-test"
        } catch (err) {
            echo err.getMessage()
            echo "Error detected, but we will continue."
        }
        ...continue with other code...
}
tjjdgumg

tjjdgumg4#

这个answer适用于我:

pipeline {
  agent any
  stages {
    stage("Run unit tests"){
      steps {
        script {
          try {
            sh  '''
              # Run unit tests without capturing stdout or logs, generates cobetura reports
              cd ./python
              nosetests3 --with-xcoverage --nocapture --with-xunit --nologcapture --cover-package=application
              cd ..
              '''
          } finally {
            junit 'nosetests.xml'
          }
        }
      }
    }
    stage ('Speak') {
      steps{
        echo "Hello, CONDITIONAL"
      }
    }
  }
}
lkaoscv7

lkaoscv75#

Try/Catch是脚本化语法。因此,无论何时使用声明性语法来使用脚本中的内容,通常都可以通过将脚本化语法包含在声明性管道中的脚本块中来实现。因此,您的try/Catch应该放在Stage>Steps>脚本中。

这也适用于您希望在声明性管道中使用的任何其他脚本化管道语法。

相关问题