2015-09-11 2 views
2

Я использую плагин jenkins dsl для создания заданий jenkins для всех ветвей проекта. Когда ветка удаляется, плагин dsl также удаляет соответствующие задания jenkins.Удалить рабочее пространство, когда задание удалено плагином dsl

Проблема состоит в том, что рабочие пространства не удаляются вместе с заданиями, поэтому они в конечном итоге загромождают мой диск. Одним из найденных решений является периодическое перечисление всех рабочих областей и проверка того, существует или нет работа с одним и тем же именем.

Мне было интересно, есть ли, возможно, более элегантное решение для автоматического удаления устаревших рабочих пространств для заданий jenkins, которые только что были удалены плагином dsl.

+0

Как насчет использования [Files.delete()] (http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#delete-java.nio.file. Path-) вместе с [Прогулка по дереву файлов] (http://docs.oracle.com/javase/tutorial/essential/io/walk.html) из вашего DSL-кода? –

+0

Это будет в основном одно и то же решение, так как мне придется вручную сравнивать рабочие пространства и задания. Выполнение этого вместе с DSL-кодом имеет еще один недостаток, поскольку устаревшие задания удаляются после выполнения сценария DSL ... Поэтому я бы не обнаружил их как удаляемых. Я думал о, например, сравнивая 'DescriptorImpl.getGeneratedJobMap()' с моим списком ветвей, хотя было бы намного круче, чтобы каким-то образом получить доступ к списку удаленных заданий напрямую. –

ответ

0

Моим решением было добавить еще одно задание, которое запускает системный скрипт Groovy, который очищает все рабочие пространства для заданий, которые больше не существуют или которые были отключены, и вызвали это после выполнения задания DLS.

  1. Установите Jenkins Groovy plugin
  2. Создать вольную работу
  3. Tick Билд Trigger "Build после сборки других проектов", и установить DSL работу как "Project смотреть"
  4. Добавить " Выполнить «Системный скрипт Groovy», шаг сборки, с скриптом Groovy как «команда Groovy».

Я использую следующий сценарий, основанный на this one из 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, "") 
} 

Это предположить, что вы не используете пользовательские рабочие области.

+0

Thx! Однако я начал использовать плагин для Jenkins для создания папки для всех заданий одной ветви. Хороший побочный эффект: при удалении папки автоматически удаляются соответствующие задания + рабочие области на диске. –

Смежные вопросы