我们有一个Jenkins管道脚本,该脚本在所有准备步骤完成后才实际应用更改,要求用户批准。
我们要在此步骤中添加一个超时,以便如果用户没有输入,则构建将中止,并且当前正在使用这种方法进行操作:
try {
timeout(time: 30, unit: 'SECONDS') {
userInput = input("Apply changes?")
}
} catch(err) {
def user = err.getCauses()[0].getUser()
if (user.toString == 'SYSTEM') { // if it's system it's a timeout
didTimeout = true
echo "Build timed out at approval step"
} else if (userInput == false) { // if not and input is false it's the user
echo "Build aborted by: [${user}]"
}
}
此代码基于以下示例:https://support.cloudbees.com/hc/en-us/articles/226554067-Pipeline-How-to-add-an-input-step-with-timeout-that-continues-if-timeout-is-reached-using-a-default-value和其他在线位置,但是我真的不喜欢捕获所有 错误,然后使用err.getCauses()[0].getUser()
找出导致异常的原因。我宁愿明确地catch(TimeoutException)
或类似的东西。
所以我的问题是,批准步骤超时或userInput为false会引发哪些实际异常?到目前为止,我在文档或Jenkins代码库中都找不到任何东西。
答案 0 :(得分:5)
他们引用的异常类是org.jenkinsci.plugins.workflow.steps.FlowInterruptedException
。
无法相信这是CloudBeeds提供的示例。
大多数(或可能所有?)其他异常甚至都没有getCauses()
方法,该方法当然会从catch块内引发另一个异常。
此外,正如您已经提到的,仅捕获所有异常不是一个好主意。
编辑:
顺便说一句:在评论中向下滚动该帖子-您将找到捕获FlowInterruptedException
的示例。