我试图找到有关如何在Jenkinsfile管道中捕获用户在jenkins Web UI中取消作业时发生的错误的文档。
我还没有拿到post或try/catch/finally当某事在构建内无法接近的工作,他们只工作。
post
try/catch/finally
当某人取消工作时,这将导致资源无法释放。
我今天拥有的是 声明式管道中 的脚本,如下所示:
pipeline { stage("test") { steps { parallell ( unit: { node("main-builder") { script { try { sh "<build stuff>" } catch (ex) { report } finally { cleanup } } } } ) } } }
因此,当从UI中手动取消作业时,将忽略catch(ex)和finally块中的所有内容。
catch(ex)
finally
非声明性方法:
当您中止管道脚本生成时,org.jenkinsci.plugins.workflow.steps.FlowInterruptedException将引发类型异常。catch阻塞释放资源,然后重新引发异常。
org.jenkinsci.plugins.workflow.steps.FlowInterruptedException
catch
import org.jenkinsci.plugins.workflow.steps.FlowInterruptedException def releaseResources() { echo "Releasing resources" sleep 10 } node { try { echo "Doing steps..." sleep 20 } catch (FlowInterruptedException interruptEx) { releaseResources() throw interruptEx } }
声明式方法(更新11/2019):
相同,但一个内script {}的块steps的stage。不是最巧妙的解决方案,而是我已经测试并开始工作的解决方案。
script {}
steps
stage
在最初回答时,没有条件aborted或cleanup后置条件(而IIRC仅pipeline具有后置条件,但stage没有条件)。
aborted
cleanup
pipeline
根据Jenkins声明性管道文档,在post部分下:
cleanup 在评估所有其他发布条件之后,无论管道或阶段的状态如何,都请在此发布条件中运行步骤。
在评估所有其他发布条件之后,无论管道或阶段的状态如何,都请在此发布条件中运行步骤。
因此,无论管道是否中止,这都是释放资源的好地方。
def releaseResources() { echo "Releasing resources" sleep 10 } pipeline { agent none stages { stage("test") { steps { parallel ( unit: { node("main-builder") { script { echo "Doing steps..." sleep 20 } } } ) } post { cleanup { releaseResources() } } } } }