当 dsl 插件删除作业时删除工作区

问题描述 投票:0回答:2

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

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

我想知道是否有一个更优雅的解决方案来自动删除刚刚被 dsl 插件删除的 jenkins 作业的过时工作空间。

jenkins jenkins-job-dsl
2个回答
2
投票

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

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

我使用以下脚本,基于这个答案中的这个

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

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


0
投票

为了跟进@Jelaby的答案,您可以在脚本控制台中运行它:/manage/script以进行测试和快速修改。

我在检查工作区时发现@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}!"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.