Aufgrund einer fehlerhaften Konfiguration habe ich über 1700 fehlerhafte Builds in einem Jenkins-Job.
Wie kann ich sie effizient reinigen?
Eine Reihe von Möglichkeiten zum Löschen von Builds über die Befehlszeile werden hier beschrieben: http://stackoverflow.com/questions/13052390/jenkins-remove-old-builds-with-command-line
ThomasW vor 10 Jahren
2
Legen Sie vorübergehend die Anzahl der Builds fest, die in der Jobkonfiguration beibehalten werden sollen ( Alte Builds verwerfen ), damit diese Builds gelöscht werden, wenn der nächste Build abgeschlossen ist. Wenn der nächste Build 1800 ist, legen Sie fest, dass der letzte Build 85 oder so beibehalten wird. Markieren Sie alle älteren Builds (dh 1 bis 10) als Keep This Build Forever, bevor Sie mit dem nächsten Build beginnen. Mit dieser Option können einige Builds nicht gelöscht werden, wenn Sie einen nachgelagerten Job haben, der verhindert, dass Upstream-Builds gelöscht werden (kein Problem in Ihrer Situation, wenn alle fehlschlagen).
Verwenden Sie die Skriptkonsole in " Jenkins verwalten" . Wenn es sich um einen Job auf oberster Ebene (nicht in einem Ordner) handelt, können Sie Folgendes tun:
Natürlich erfordert dieser Ansatz im Allgemeinen gute Sicherungen. Mit der Skriptkonsole können Sie eine Menge Fehler machen.
Löschen Sie die Ordner des Builds von der Festplatte (standardmäßig $JENKINS_HOME/jobs/JobName/builds/unter Verwendung des Startzeitstempels als Ordnername), und starten Sie Jenkins neu, oder starten Sie die Option "Konfiguration neu laden" . Diese Option lässt keine Plugins zu, die z. B. die SVN-Historie in der Reihenfolge halten, indem Änderungen an den nachfolgenden Build verschoben werden, um ihre Arbeit zu erledigen.
I've found another solution: Using `jenkins-cli.jar -s ... delete-builds envjs 11-1717`
Aaron Digulla vor 11 Jahren
8
Eine Liste erstellt, um alle Aufträge mit einer Build-Anzahl über das Terminal aufzulisten. Erleichtert das Auffinden von Aufträgen, die aufgeräumt werden müssen. Könnte via cron auch als E-Mail-Bericht verwendet werden.
Nick vor 10 Jahren
0
@Nick Überprüfen Sie das Groovy-Plugin, insbesondere den Build-Schritt-Typ des Systems. Sie müssen nicht außerhalb von Jenkins gehen, sondern erstellen Sie einen Job, der dies erledigt. `jenkins.model.Jenkins.instance.getAllItems (hudson.model.Job.class) .each ; return` Die Sortierung zB nach Builds ist ähnlich trivial.
Daniel Beck vor 10 Jahren
0
16
jaltek
Wie Aaron richtig angegeben hat, können Sie auch die Jenkins CLI für diesen Zweck verwenden:
curl -X POST http://jenkinUser:jenkinAPIToken@yourJenkinsURl.com/job/theJob/[11-1717]/doDelete
So erhalten Sie das APIToken: Melden Sie sich bei Jenkins> Configuration> Show API Token an.
Ich denke, das ist die beste Lösung für das Problem. Es kann remote ausgeführt werden und bietet eine breite Palette von Aktionen über REST
alfredocambera vor 9 Jahren
0
Beste Antwort, da Sie nicht auf einem installierten System nach dem Glas suchen müssen.
Keith Tyler vor 8 Jahren
0
Ich meinte "Sie müssen nichts herunterladen"
Keith Tyler vor 8 Jahren
0
"Beste Antwort, da Sie nicht müssen" - wenn Ihre Kriterien darin bestehen, keine <1m-Datei herunterzuladen, ist dies besser, danke der CLI. Wenn das Kriterium keine unordentlichen URLs mit Auth-Token eintippen muss, beachten Sie die Curl-Syntax (vorausgesetzt, es wird an erster Stelle installiert), und Sie bevorzugen klare Befehle und Hilfen. Vielleicht haben Sie bereits das Glas, und die CLI ist besser. Wenn Sie nur die we-Schnittstelle mit einer Skriptkonsole installiert haben, ist diese die bessere. Wie üblich kommt es darauf an.
user17265 vor 7 Jahren
0
Um zu löschen, dass Builds für immer aufbewahrt werden, führen Sie `toggleLogKeep` vor` doDelete` aus.
Fancyoung vor 7 Jahren
0
3
Aaron Digulla
Vorlage für ein Skript zur Ausführung in der Jenkins Script-Console. Verwenden Sie das Flag reallyDelete, um es zu testen, bevor Sie es tatsächlich löschen:
// 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
Ich habe ein kleines Python-Skript erstellt, das diesem Zweck dient. Folgendes ist das Skript:
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 - Pfad des Build-Verzeichnisses des Jobs
range (start_build_no, end_build_no) - range (11, 1718) sucht alle Builds, die von Build-Nr. 11 zu bauen nein. 1717. Bitte stellen Sie es entsprechend ein.
shutil.rmtree (build_dir_fullpath) - Löscht jedes Build-Verzeichnis, das sich im Bereich befindet.
Python-Version: 2.7
Müssen Sie Jenkins danach nicht neu starten? Was passiert, wenn Jenkins Informationen zu diesen Ordnern in einer Datenbank speichert?
Aaron Digulla vor 7 Jahren
0
Ja @AaronDigulla, ein Neustart des Jenkins-Servers wäre erforderlich, um die Änderungen im Jenkins-Portal wiederzugeben.
Shubham Soin vor 7 Jahren
0