4

我正在使用 jenkins dsl 插件为项目的所有分支生成 jenkins 作业。删除分支时,dsl 插件也会删除相应的 jenkins 作业。

然而,问题是工作空间没有与作业一起删除,因此它们最终会弄乱我的磁盘。我发现的一种解决方案是定期列出所有工作区并检查是否存在同名的詹金斯作业。

我想知道是否有更优雅的解决方案可以自动删除刚刚被 dsl 插件删除的詹金斯作业的过时工作区。

4

1 回答 1

1

我对此的解决方案是添加另一个运行 Groovy 系统脚本的作业,该脚本会清除不再存在或已禁用的作业的所有工作区,并在 DLS 作业之后触发该作业。

  1. 安装Jenkins Groovy 插件
  2. 创建自由式工作
  3. 勾选构建触发器“构建其他项目后构建”,并将您的 DSL 作业设置为“要观看的项目”
  4. 添加“执行 Groovy 系统脚本”构建步骤,将 Groovy 脚本作为“Groovy 命令”。

我使用以下脚本,基于this answer

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, "")
}

这确实假设您不使用自定义工作区。

于 2015-11-27T19:46:53.003 回答