Як видалити склади від 11 до 1717 року в Дженкінсі?


51

Через неправильну конфігурацію, у мене понад 1700 невдалих складок у роботі Дженкінса.

Як я можу їх ефективно очистити?


2
Ряд способів видалити збірки з допомогою командного рядка обговорюється тут: stackoverflow.com/questions/13052390 / ...
ThomasW

Відповіді:


74

У вас є кілька варіантів:

  • Тимчасово встановіть кількість збірок, які слід зберігати в конфігурації завдання ( Відхилити старі збірки ), щоб ці збірки були видалені, коли наступна збірка закінчиться. Якщо наступна збірка - 1800, встановіть її для збереження останніх 85 або близько того. Позначте всі старі збірки (тобто від 1 до 10) як Зберегти цю збірку назавжди перед початком наступної збірки. Цей параметр не зможе видалити деякі збірки, якщо у вас є завдання нижче, які не дозволяють видалити збільшити вершини потоку (не проблема в вашій ситуації, якщо всі вони не вдалися).

  • Використовуйте консоль сценарію в керуванні Дженкінсом . Якщо це робота вищого рівня (не в папці), фокус виконає наступне:

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

    Звичайно, такий підхід, як правило, вимагає хороших резервних копій. Можна багато зламати, використовуючи консоль сценарію.

  • Видаліть папки збірок з диска (за замовчуванням у $JENKINS_HOME/jobs/JobName/builds/, використовуючи позначку часу початку як ім'я папки) та перезапустіть Дженкінс або Перезавантажте конфігурацію з диска . Ця опція не дозволить плагінам, які, наприклад, зберігають історію SVN в порядку, переміщуючи будь-які зміни до наступної збірки, щоб виконати свою роботу.


10
Я знайшов інше рішення: Використанняjenkins-cli.jar -s ... delete-builds envjs 11-1717
Аарон Дігулла

Зробив історію, щоб перерахувати всі завдання з кількістю збірок через термінал. Полегшує пошук роботи, яка потребує прибирання. Може використовуватися через cron і як електронний звіт.
Нік

@Nick Ознайомтеся з плагіном Groovy, зокрема системою крокового типу збірки Groovy. Для цього не потрібно виходити за межі Дженкінса, просто створіть роботу, яка це робить. jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { println it.fullDisplayName + " has " + it.builds.size() + " builds" } ; returnСортування, наприклад, за складаннями, аналогічно тривіальне.
Даніель Бек

Для багатогалузевих трубопроводів можна використовувати синтаксис JobName/branch
waitinforatrain

17

Просто зробіть виклик API:

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

Щоб отримати APIToken: увійдіть до Дженкінса> Конфігурація> Показати маркер API.


Я думаю, що це найкращий підхід до проблеми. це може бути виконано віддалено. Забезпечує широкий спектр дій через REST
alfredocambera

Найкраща відповідь, оскільки вам не доведеться шукати банку в встановленій системі.
Кіт Тайлер

Я мав на увазі "вам нічого не потрібно завантажувати"
Кіт Тайлер

"Найкраща відповідь, оскільки вам цього не потрібно" - якщо ваші критерії не завантажують файл <1м, ніж це, краще подякуйте CLI. Якщо критеріям не потрібно вводити брудні URL-адреси з автентичними маркерами, пам’ятайте синтаксис curl (припускаючи, що він встановлений в першу чергу), і ви віддаєте перевагу чіткі команди та допомогу, і, можливо, у вас вже є jar, CLI краще. Якщо у вас є лише інтерфейс, на якому встановлена ​​консоль сценаріїв, тоді це краще. Як завжди це залежить.
користувач17265

для видалення зберігає назавжди збірки, запустіть toggleLogKeepраніше doDelete.
Fancyoung

16

Як правильно заявив Аарон , ви також можете використовувати CLI Jenkins для цієї мети:

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

4

Шаблон сценарію для запуску в скрипті-консолі Дженкінса. Використовуйте прапор, 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}");
  }
}

1

Я зіткнувся з тим же завданням, коли перейняв сервер Дженкінса, де є трохи більше 150 робочих місць з до 3000 старих збірок, тому я написав невеликий скрипт bash, який зберігає лише останні 10 збірок:

#! /bin/bash

initialPath=$(pwd);

find /var/lib/jenkins/ -type d -name builds | while read jobs
 do

    #############################################################
    ## Enter build-directory of current job and get some numbers
    #############################################################
    cd "$jobs" ;
    ls -d [[:digit:]]* &>/dev/null ;
    rc=$? ;
    if [[ $rc -eq 0 ]] ;
     then
        buildName=$(ls -d [[:digit:]]*)  ;
        latestBuild=$(echo $buildName | awk '{print $NF}') ; # highest number
        oldestBuild=$(echo $buildName | awk '{print $1}') ; # lowest number
        amountOfBuilds=$(echo $buildName | wc -w ) ;
        lastBuildToKeep=$(echo "${latestBuild} 9" | awk '{print $1 - $2}') ;

        ############################################################
        ## Skip Folder if it contains less than 10 builds
        ############################################################
        if [ ${amountOfBuilds} -le 10 ] ;
         then
            echo "Skipping $(pwd) --> less than 10 builds";
         else
            ############################################################
            ## Delete all build-directories except the last 10
            ############################################################
            for (( i=$oldestBuild; i<$lastBuildToKeep; i++))
             do
                echo "Deleting $(pwd)/${i} ..."
                rm -r "$i" ;
            done ;
        fi ;
     else
        echo "Skipping $(pwd) --> Zero builds";
    fi ;
done ;

############################################################
## go back to $initialPath
############################################################
cd "$initialPath" ;

Після цього перезапуск Дженкінса настійно рекомендується уникати проблем. Thx @Aaron Digulla


Чому ви не використали сценарій для консолі Дженкінса?
Аарон Дігулла

Тому що я більше знайомий з басом. Це єдина причина.
Anyesto

Зрозумів. Будь ласка, відредагуйте своє запитання та додайте, що після того, як уникнути проблем, слід перезапустити Дженкінса.
Аарон Дігулла

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 - Шлях до каталогу створення роботи

  • діапазон (start_build_no, end_build_no) - діапазон (11, 1718) шукає всі складання, починаючи від № збірки. 11 будувати ні. 1717. Будь ласка, встановіть його відповідно.

  • shutil.rmtree (build_dir_fullpath) - видаляє кожен каталог збірок, який знаходиться в діапазоні.

Версія Python: 2.7


Не доведеться після цього перезавантажувати Дженкінса? Що робити, якщо Дженкінс зберігає інформацію про ці папки в базі даних?
Аарон Дігулла

Так @AaronDigulla, для відображення змін на порталі Jenkins знадобиться перезапуск сервера Jenkins.
Shubham Soin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.