我正在使用 jenkins dsl 插件为项目的所有分支生成 jenkins 作业。当删除分支时,dsl 插件也会删除相应的 jenkins 作业。
但问题是工作区不会与作业一起删除,因此它们最终会弄乱我的磁盘。我发现的一种解决方案是定期列出所有工作区并检查是否存在同名的 jenkins 作业。
我想知道是否有一个更优雅的解决方案来自动删除刚刚被 dsl 插件删除的 jenkins 作业的过时工作空间。
我的解决方案是添加另一个运行 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, "")
}
这确实假设您不使用自定义工作区。
为了跟进@Jelaby的答案,您可以在脚本控制台中运行它:
我在检查工作区时发现@Jelaby 的脚本不包含 Jenkins 主节点 本身。 我需要对 NPE 进行一些小的更改并包含主节点。 我在 Jenkins 版本上运行这个:2.387.1.
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'"
}
}
}
jenkins.model.Jenkins.instance.computers.each { c ->
def workspaceRoot = c?.node?.rootPath?.child("workspace");
if (workspaceRoot) {
println "Processing node: ${c.node.displayName}, workspace: ${workspaceRoot}"
deleteUnusedWorkspace(workspaceRoot, "")
} else {
println "Could not get workspace for: ${c.node.displayName}!"
}
}