Через неправильну конфігурацію, у мене понад 1700 невдалих складок у роботі Дженкінса.
Як я можу їх ефективно очистити?
Через неправильну конфігурацію, у мене понад 1700 невдалих складок у роботі Дженкінса.
Як я можу їх ефективно очистити?
Відповіді:
У вас є кілька варіантів:
Тимчасово встановіть кількість збірок, які слід зберігати в конфігурації завдання ( Відхилити старі збірки ), щоб ці збірки були видалені, коли наступна збірка закінчиться. Якщо наступна збірка - 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 в порядку, переміщуючи будь-які зміни до наступної збірки, щоб виконати свою роботу.
jenkins-cli.jar -s ... delete-builds envjs 11-1717
jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { println it.fullDisplayName + " has " + it.builds.size() + " builds" } ; return
Сортування, наприклад, за складаннями, аналогічно тривіальне.
JobName/branch
Просто зробіть виклик API:
curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete
Щоб отримати APIToken: увійдіть до Дженкінса> Конфігурація> Показати маркер API.
toggleLogKeep
раніше doDelete
.
Як правильно заявив Аарон , ви також можете використовувати CLI Jenkins для цієї мети:
java -jar jenkins-cli.jar -s http://yourserver.com delete-builds <JobName> 11-1717
Шаблон сценарію для запуску в скрипті-консолі Дженкінса. Використовуйте прапор, 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}");
}
}
Я зіткнувся з тим же завданням, коли перейняв сервер Дженкінса, де є трохи більше 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
Я створив невеликий сценарій 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