44

Из-за неправильной конфигурации у меня более 1700 неудачных сборок в задании Jenkins.

Как я могу эффективно очистить их?

5 ответов5

64

У вас есть несколько вариантов:

  • Временно установите количество сборок, которые нужно сохранить в конфигурации задания (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, перемещать любые изменения в последующую сборку для выполнения своей работы.

16

Как правильно сказал Аарон, вы также можете использовать CLI Jenkins для этой цели:

java -jar jenkins-cli.jar -s http://yourserver.com delete-builds <JobName> 11-1717
13

Просто сделайте вызов API:

curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete

Чтобы получить APIToken: войдите в Jenkins> Конфигурация> Показать API-токен.

3

Шаблон для запуска скрипта в консоли скриптов 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}");
  }
}
0

Я создал небольшой скрипт на 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .