Как удалить сборки с 11 по 1717 в Jenkins?
Из-за неправильной конфигурации у меня более 1700 неудачных сборок в задании Дженкинса.
Как я могу эффективно их очищать?
5 ответов
У вас есть несколько вариантов:
-
Временно установите количество построений для сохранения в конфигурации задания ( Discard Old Builds ), чтобы эти сборки были удалены при завершении следующей сборки. Если следующая сборка - 1800, установите ее, чтобы сохранить самые последние 85 или около того. Отметьте все старые сборки (например, от 1 до 10) как Keep This Build Forever перед началом следующей сборки. Эта опция не сможет удалить некоторые сборки, если у вас есть работа по нисходящему потоку, которая предотвращает удаление восходящих сборников (не проблема в вашей ситуации, если все из них не удалось).
-
Используйте Консоль сценариев в Управление Jenkins . Если это задание на верхнем уровне (не в папке), следующее будет делать трюк:
Jenkins.instance.getItemByFullName('JobName').builds.findAll { it.number > 10 && it.number < 1717 }.each { it.delete() }
Конечно, этот подход обычно требует хороших резервных копий. Существует много возможностей, которые можно разбить с помощью консоли сценария.
-
Удаление папок сборки с диска (по умолчанию в
$JENKINS_HOME/jobs/JobName/builds/
, используя отметку времени начала в качестве имени папки) и перезапустите Jenkins или Перезагрузить конфигурацию с диска . Этот параметр не позволит плагинам, например, сохраняйте историю SVN в порядке, перемещая любые изменения в последующую сборку, чтобы выполнять свою работу.
Как Aaron правильно, вы также можете использовать Jenkins CLI для этой цели:
java -jar jenkins-cli.jar -s http://yourserver.com delete-builds <JobName> 11-1717
Просто выполните вызов API:
curl -X POST http://jenkinUser:[email protected]/job/theJob/[11-1717]/doDelete
Чтобы получить APIToken: войдите в Jenkins> Конфигурация> Показать токен API.
Шаблон сценария для запуска в Jenkins Script-Console. Используйте флажок reallyDelete
, чтобы проверить его до фактического удаления:
// Jenkins job
def jobName = 'foo'
// Range of builds to delete
def rs = Fingerprint.RangeSet.fromString("11-1717", false);
// Set to true to actually delete. Use false to test the script.
def reallyDelete = false;
// ----------------------------------
def job = Jenkins.instance.getItemByFullName(jobName);
println("Job: ${job.fullName}");
def builds = Jenkins.instance.getItemByFullName(jobName).getBuilds(rs);
println("Found ${builds.size()} builds");
builds.each{ b->
if (reallyDelete) {
println("Deleting ${b}");
b.delete();
} else {
println("Found match ${b}");
}
}
Я создал небольшой скрипт python, который будет служить этой цели. Ниже приведен скрипт:
delete_jenkins_builds.py
from os import listdir, path
import shutil
job_build_fullpath = '/var/lib/jenkins/jobs/My-Jenkins-Project/builds'
print listdir(job_build_fullpath)
for build_dir in listdir(job_build_fullpath):
if build_dir.isdigit() and int(build_dir) in range(11, 1718):
build_dir_fullpath = path.join(job_build_fullpath, build_dir)
print "Deleting: " + build_dir_fullpath
shutil.rmtree(build_dir_fullpath)
-
job_build_fullpath - путь к каталогу сборки Job
-
range (start_build_no, end_build_no) - range (11, 1718) ищет все сборки, начиная с build no. 11 построить нет. 1717. Пожалуйста, установите его соответствующим образом.
-
shutil.rmtree (build_dir_fullpath) - удаляет каждый каталог сборки, находящийся в диапазоне.
Версия Python: 2.7