Из-за неправильной конфигурации у меня более 1700 неудачных сборок в задании Jenkins.
Как я могу эффективно очистить их?
Из-за неправильной конфигурации у меня более 1700 неудачных сборок в задании Jenkins.
Как я могу эффективно очистить их?
У вас есть несколько вариантов:
Временно установите количество сборок, которые нужно сохранить в конфигурации задания (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, перемещать любые изменения в последующую сборку для выполнения своей работы.
Как правильно сказал Аарон, вы также можете использовать CLI Jenkins для этой цели:
java -jar jenkins-cli.jar -s http://yourserver.com delete-builds <JobName> 11-1717
Просто сделайте вызов API:
curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete
Чтобы получить APIToken: войдите в Jenkins> Конфигурация> Показать API-токен.
Шаблон для запуска скрипта в консоли скриптов Jenkins. Используйте флаг 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 - путь к каталогу сборки задания
range(start_build_no, end_build_no) - range(11, 1718) ищет все сборки, начиная от сборки №. 11 построить нет. 1717. Пожалуйста, установите его соответственно.
shutil.rmtree(build_dir_fullpath) - удаляет каждый каталог сборки, находящийся в диапазоне.
Версия Python: 2.7