gpt4 book ai didi

Jenkins 管道 : Try/catch inside a retry block

转载 作者:行者123 更新时间:2023-12-04 14:41:18 27 4
gpt4 key购买 nike

我的 Jenkins 管道有问题。我想做以下事情:
如果工作区中已存在构建环境,则使用先前的环境执行(增量)构建。

如果失败,请使用干净的构建重试(删除以前的构建环境,然后重新构建)

我试图通过以下方式做到这一点:

retry(1) {
try {
prepareEnvironment()
setupBuildEnvironment() // sets up environment if it is not present yet
runBuild()
} catch (e) {
echo 'Err: Incremental Build failed with Error: ' + e.toString()
echo ' Trying to build with a clean Workspace'
removeOldBuildEnvironment()
} finally {
cleanupEnvironment()
}
}

当我在 Jenkins 和 runBuild() 中运行它时步骤失败我得到:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use new java.lang.Exception java.lang.String



我认为问题在于 retry(1) 块内的 try/catch。任何建议如何解决这个问题

我也试过了,没有重试。在这里我遇到了问题,如果
bat "..." 

runBuild() 内部的 step 返回一个异常,管道阶段被标记为失败,即使我捕获了异常并且干净的构建成功。

有什么建议?

最佳答案

错误消息不是因为 try/catch但是因为在 prepareEnvironment 中抛出异常, setupBuildEnvironmentrunBuild方法,如 throw new Exception("message")这在沙箱模式下是不允许的。允许使用 error步骤如下:

def runBuild() {
// ...
error "ERR"
}

这一步会抛出 hudson.AbortException与指定的消息。

代码中的 catch 块将捕获此异常并打印正确的消息,然后调用 removeOldBuildEnvironment
另一方面,完成此修改后,您的脚本仍无法按预期工作,因为异常被 catch 块吞下,因此重试步骤不会再次执行代码。为了使其工作,需要从 catch 块中再次抛出异常(请注意,您必须使用 retry(2) 而不是 retry(1) )
retry(2) {
try {
prepareEnvironment()
setupBuildEnvironment() // sets up environment if it is not present yet
runBuild()
} catch (e) {
echo 'Err: Incremental Build failed with Error: ' + e.toString()
echo ' Trying to build with a clean Workspace'
removeOldBuildEnvironment()
throw e
} finally {
cleanupEnvironment()
}
}

关于 Jenkins 管道 : Try/catch inside a retry block,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38392254/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com