在Groovy编译器异常的情况下,try/catch/finally掩盖了Jenkinsfile问题。

26

我在Jenkinsfile中有类似以下代码:

node {
   checkout scm
   // do some stuff
   try {
       // do some maven magic
   } catch (error) {
       stage "Cleanup after fail"
       emailext attachLog: true, body: "Build failed (see ${env.BUILD_URL}): ${error}", subject: "[JENKINS] ${env.JOB_NAME} failed", to: 'someone@example.com'
       throw error
   } finally {
       step $class: 'JUnitResultArchiver', testResults: '**/TEST-*.xml'
   }
}

如果以上代码由于一些与Jenkins管道相关的错误在try { }中失败(例如使用未批准的静态方法),脚本会悄无声息地失败。 当我删除try / catch / finally时,我可以看到错误。 我做错了什么吗?重新抛出error不应该使管道错误显示在日志中吗?

编辑: 我已经找到了问题的症结所在,即groovy语法,例如:当我使用尚未分配的变量时。 例子: echo foo 如果foo没有在任何地方声明/分配,则Jenkins将失败构建,并且如果它位于重新抛出异常的try / catch / finally内部,则不会显示原因。


如果这是普通的Groovy,那么它肯定可以工作,但因为这是一个Groovy DSL,DSL运行器可以对异常做任何想做的事情...也许你应该尝试这个:https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-error-code-error-signal - Renato
@RenatoBut 在 https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-catcherror-code-catch-error-and-set-build-result 中建议尝试/catch/finally也应该起作用。 - Krzysztof Krasoń
没错,但如果你遇到了这个问题,看起来它并不... - Renato
2
你解决了这个问题吗?我也遇到了完全相同的问题,但我无法编写代码将构建结果保留在try块内。 - sorin
如何将try块中的shell错误输出存储到变量中? https://dev59.com/DJ_ha4cB1Zd3GeqP7_zk - jugal
https://dev59.com/n1oV5IYBdhLWcg3wAqvy#42828546 - treehouse
1个回答

8

当在finally块内或在catch中重新抛出之前发生额外的异常时,就会发生这种情况。在这些情况下,RejectedAccessException被吞噬了,script-security没有捕获它。


在 finally 中不会抛出任何异常,因为当我移除 try 块中的有问题的行时,它可以正常工作。 - Krzysztof Krasoń
那么它必须在catch内的重新抛出之前。 - amuniz
不,如果Groovy脚本使用了未声明的变量,这个问题很容易再现。当我移除try/catch/finally语句时,就会出现异常堆栈跟踪。 - Krzysztof Krasoń
这听起来像是一个bug。如果有一个最小化重现测试用例,请将它作为这样的文件提交。 - Jesse Glick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接