Как удалить сборки с 11 по 1717 в Дженкинс?

43816
Aaron Digulla

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

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

42
Здесь обсуждается несколько способов удаления сборок через командную строку: http://stackoverflow.com/questions/13052390/jenkins-remove-old-builds-with-command-line ThomasW 10 лет назад 2

5 ответов на вопрос

60
Daniel Beck

You have several options:

  • Temporarily set the number of builds to keep in the job configuration (Discard Old Builds) so that those builds will be deleted when the next build finishes. If the next build is 1800, set it to keep the most recent 85 or so. Mark all older builds (i.e. 1 to 10) as Keep This Build Forever before starting the next build. This option will fail to delete some builds if you have a downstream job that prevents upstream builds from being deleted (not a problem in your situation if all of them failed though).

  • Use the Script Console in Manage Jenkins. If it's a top level job (not in a folder), the following will do the trick:

    Jenkins.instance.getItemByFullName('JobName').builds.findAll { it.number > 10 && it.number < 1717 }.each { it.delete() }

    Of course, this approach generally requires good backups. There's a lot you can break using the script console.

  • Delete the builds' folders from disk (by default in $JENKINS_HOME/jobs/JobName/builds/, using the start time stamp as folder name) and restart Jenkins, or Reload Configuration From Disk. This option will not allow plugins that e.g. keep the SVN history in order by moving any changes to the subsequent build to do their job.

Я нашел другое решение: используя `jenkins-cli.jar -s ... delete-builds envjs 11-1717` Aaron Digulla 11 лет назад 8
Сделал Gist, чтобы перечислить все задания с количеством сборок через терминал. Облегчает поиск работы, которая нуждается в уборке. Может также использоваться через cron в качестве отчета по электронной почте. Nick 10 лет назад 0
@Nick Проверьте плагин Groovy, в частности, тип шага сборки системы Groovy. Для этого не нужно выходить на улицу Дженкинса, просто создайте работу, которая этим занимается. `jenkins.model.Jenkins.instance.getAllItems (hudson.model.Job.class) .each ; return` Сортировка, например, по сборкам также тривиальна. Daniel Beck 10 лет назад 0
16
jaltek

As Aaron stated correctly you can also use the Jenkins CLI for this purpose:

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

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

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

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

Я думаю, что это лучший подход к проблеме. он может быть выполнен удаленно и предоставляет широкий спектр действий через REST alfredocambera 9 лет назад 0
Лучший ответ, так как вам не нужно искать банку в установленной системе. Keith Tyler 8 лет назад 0
Я имел в виду "вам не нужно ничего скачивать" Keith Tyler 8 лет назад 0
«Лучший ответ, так как вам не нужно» - если ваш критерий не в том, чтобы загрузить файл размером менее 1 метра, это лучше, спасибо CLI. Если критерию не нужно вводить запутанные URL-адреса с токенами аутентификации, запомните синтаксис curl (при условии, что он установлен в первую очередь), и вы предпочитаете команды clear и help, и, возможно, у вас уже есть jar, CLI лучше. Если у вас есть только интерфейс we с установленной консолью сценариев, то она лучше. Как обычно это зависит. user17265 7 лет назад 0
для удаления оставьте сборки навсегда, запустите `toggleLogKeep` перед` doDelete`. Fancyoung 7 лет назад 0
3
Aaron Digulla

Шаблон для запуска скрипта в консоли скриптов 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: $");  def builds = Jenkins.instance.getItemByFullName(jobName).getBuilds(rs); println("Found $ builds"); builds.each{ b->  if (reallyDelete) { println("Deleting $"); b.delete(); } else { println("Found match $"); } } 
0
Shubham Soin

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

Не нужно ли вам перезапустить Дженкинс после этого? Что, если Дженкинс хранит информацию об этих папках в базе данных? Aaron Digulla 7 лет назад 0
Да @AaronDigulla, для отражения изменений на портале Jenkins потребуется перезапуск сервера Jenkins. Shubham Soin 7 лет назад 0

Похожие вопросы