Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jenkins dsl插件删除作业时删除工作区_Jenkins_Jenkins Job Dsl - Fatal编程技术网

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

Jenkins dsl插件删除作业时删除工作区,jenkins,jenkins-job-dsl,Jenkins,Jenkins Job Dsl,我正在使用jenkins dsl插件为项目的所有分支生成jenkins作业。当一个分支被删除时,dsl插件也会删除相应的jenkins作业 然而,问题是工作区并没有和作业一起删除,所以它们最终会把我的磁盘弄得乱七八糟。我发现的一个解决方案是定期列出所有工作区,并检查是否存在同名的jenkins作业 我想知道是否有更优雅的解决方案可以自动删除dsl插件刚刚删除的jenkins作业的过时工作区。我的解决方案是添加另一个作业,该作业运行Groovy系统脚本,清除不再存在或已被禁用的作业的所有工作区,并

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

然而,问题是工作区并没有和作业一起删除,所以它们最终会把我的磁盘弄得乱七八糟。我发现的一个解决方案是定期列出所有工作区,并检查是否存在同名的jenkins作业


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

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

  • 安装
  • 创建自由式作业
  • 勾选构建触发器“在构建其他项目后构建”,并将DSL作业设置为“要监视的项目”
  • 添加一个“执行Groovy系统脚本”构建步骤,将Groovy脚本作为“Groovy命令”
  • 我使用以下脚本,基于来自:


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

    在DSL代码中与一起使用如何?这基本上是相同的解决方案,因为我必须手动比较工作区和作业。与DSL代码一起运行还有另一个缺点,因为在执行DSL脚本后会删除过时的作业。。。因此,我不会检测到它们被删除。例如,我正在考虑将
    DescriptorImpl.getGeneratedJobMap()
    与我的分支列表进行比较,尽管直接访问已删除作业的列表要酷得多。Thx!然而,我开始使用Jenkins文件夹插件为一个分支的所有作业创建一个文件夹。很好的副作用:删除文件夹会自动删除磁盘上相应的作业和工作空间。
    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, "")
    }