我正在使用 jenkins dsl 插件为项目的所有分支生成 jenkins 作业。删除分支时,dsl 插件也会删除相应的 jenkins 作业。
然而,问题是工作空间没有与作业一起删除,因此它们最终会弄乱我的磁盘。我发现的一种解决方案是定期列出所有工作区并检查是否存在同名的詹金斯作业。
我想知道是否有更优雅的解决方案可以自动删除刚刚被 dsl 插件删除的詹金斯作业的过时工作区。
我正在使用 jenkins dsl 插件为项目的所有分支生成 jenkins 作业。删除分支时,dsl 插件也会删除相应的 jenkins 作业。
然而,问题是工作空间没有与作业一起删除,因此它们最终会弄乱我的磁盘。我发现的一种解决方案是定期列出所有工作区并检查是否存在同名的詹金斯作业。
我想知道是否有更优雅的解决方案可以自动删除刚刚被 dsl 插件删除的詹金斯作业的过时工作区。
我对此的解决方案是添加另一个运行 Groovy 系统脚本的作业,该脚本会清除不再存在或已禁用的作业的所有工作区,并在 DLS 作业之后触发该作业。
import hudson.FilePath
import jenkins.model.Jenkins
import hudson.model.Job
def deleteUnusedWorkspace(FilePath root, String path) {
root.list().sort{child->child.name}.each { child ->
String fullName = path + child.name
def item = Jenkins.instance.getItemByFullName(fullName);
if (item.class.canonicalName == 'com.cloudbees.hudson.plugins.folder.Folder') {
deleteUnusedWorkspace(root.child(child.name), "$fullName/")
} else if (item == null) {
println "Deleting (no such job): '$fullName'"
child.deleteRecursive()
} else if (item instanceof Job && !item.isBuildable()) {
println "Deleting (job disabled): '$fullName'"
child.deleteRecursive()
} else {
println "Leaving: '$fullName'"
}
}
}
for (node in Jenkins.instance.nodes) {
println "Processing $node.displayName"
def workspaceRoot = node.rootPath.child("workspace");
deleteUnusedWorkspace(workspaceRoot, "")
}
这确实假设您不使用自定义工作区。