我正在寻找一种解决方案,当我的(Jenkins)Groovy脚本结束时,该解决方案将递归删除使用Files.createTempDirectory()
创建的文件夹。
如果您阅读文档,createTempDirectory()不会删除文件夹,即使您尝试使用delete-on-exit,如果文件夹中包含其他文件,也会失败。
请注意,我正在寻找一种解决方案,不必在Groovy脚本的末尾添加额外的代码或添加try / catch方法。这是因为这些Groovy代码是从多个可重用部分编译而来的。
工作解决方案不需要在脚本末尾添加额外的代码,可能使用挂钩机制来注册目录删除操作。
import java.nio.file.Files
x = Files.createTempDirectory()
// <-- add some magic hook to tell to remove 'x' folder recursively on exit
// a lot of code I cannot touch
答案 0 :(得分:2)
下面怎么样?
def result = x.deleteDir()
assert result
答案 1 :(得分:2)
以下代码将在退出时从temp目录中递归删除所有文件和文件夹。
mydir = Files.createTempDirectory()
addShutdownHook {
mydir.deleteDir()
}
此代码适用于正常的Groovy执行,但在基于Jenkins Grooby的管道上失败,因为:
an exception which occurred:
in field delegate
in field closures
in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@782f5796
Caused: java.io.NotSerializableException: sun.nio.fs.UnixPath
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
所以,我仍在努力解决“CPS”问题,第一次尝试失败并出现同样的错误:
@NonCPS
def mkdtemp(String s) {
mydir = Files.createTempDirectory("cp-")
addShutdownHook {
mydir.deleteDir()
println "cleaned"
}
mydir.toString()
}
node {
mkdtemp('xxx')
}
答案 2 :(得分:0)
finally
怎么样?
def tmp = Files.createTempDirectory()
try {
// do something with tmp
}
finally {
tmp.toFile().deleteDir()
}