一尘不染

如何在Jenkinsfile中捕获手动UI取消作业

jenkins

我试图找到有关如何在Jenkinsfile管道中捕获用户在jenkins Web UI中取消作业时发生的错误的文档。

我还没有拿到posttry/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块中的所有内容。


阅读 218

收藏
2020-07-25

共1个答案

一尘不染

非声明性方法:

当您中止管道脚本生成时,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 {}的块stepsstage。不是最巧妙的解决方案,而是我已经测试并开始工作的解决方案。

在最初回答时,没有条件abortedcleanup后置条件(而IIRC仅pipeline具有后置条件,但stage没有条件)。

根据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()
                }
            }
        }
    }
}
2020-07-25