Удалить рабочее пространство, когда задание удаляется плагином dsl

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

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

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


person Jan Gassen    schedule 11.09.2015    source источник
comment
Как насчет использования Files.delete() вместе с прохождением дерево файлов из вашего DSL-кода?   -  person Gerold Broser    schedule 12.09.2015
comment
Это было бы в основном то же решение, так как мне пришлось бы вручную сравнивать рабочие пространства и задания. Запуск этого вместе с кодом DSL имеет еще один недостаток, поскольку устаревшие задания удаляются после выполнения сценария DSL... Поэтому я бы не обнаружил их как удаленные. Я думал о, например. сравнивая DescriptorImpl.getGeneratedJobMap() с моим списком веток, хотя было бы гораздо круче каким-то образом получить прямой доступ к списку удаленных заданий.   -  person Jan Gassen    schedule 13.09.2015


Ответы (1)


Мое решение состояло в том, чтобы добавить еще одно задание, которое запускает системный сценарий 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, "")
}

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

person Jelaby    schedule 27.11.2015
comment
Спасибо! Однако я начал использовать плагин папки Jenkins, чтобы создать папку для всех заданий одной ветки. Приятный побочный эффект: удаление папки автоматически удаляет соответствующие задания + рабочие пространства на диске. - person Jan Gassen; 06.12.2015