Antworten:
Sie können deleteDir()
als letzten Schritt der Pipeline Jenkinsfile verwenden (vorausgesetzt, Sie haben das Arbeitsverzeichnis nicht geändert).
checkout scm
.
Wie @gotgenes mit Jenkins Version hervorgehoben. 2.74 , das Folgende funktioniert, nicht sicher seit wann, vielleicht ob jemand die obige Version bearbeiten und hinzufügen kann
cleanWs()
Mit Jenkins Version 2.16 und dem Workspace Cleanup Plugin , das ich habe, verwende ich
step([$class: 'WsCleanup'])
um den Arbeitsbereich zu löschen.
Sie können es anzeigen, indem Sie zu gehen
JENKINS_URL/job/<any Pipeline project>/pipeline-syntax
Wählen Sie dann im Beispielschritt "Schritt: Allgemeiner Erstellungsschritt" und im Erstellungsschritt "Arbeitsbereich löschen, wenn die Erstellung abgeschlossen ist"
Die genannten Lösungen deleteDir()
und cleanWs()
(wenn das Plugin zur Bereinigung des Arbeitsbereichs verwendet wird) funktionieren beide, aber die Empfehlung, es in einem zusätzlichen Erstellungsschritt zu verwenden, ist normalerweise nicht die gewünschte Lösung . Wenn der Build fehlschlägt und die Pipeline abgebrochen wird, wird diese Bereinigungsphase nie erreicht und daher wird der Arbeitsbereich bei fehlgeschlagenen Builds nicht bereinigt.
=> In den meisten Fällen sollten Sie es wahrscheinlich in einen Zustand nach dem Bau versetzen, wie always
:
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
post {
always {
cleanWs()
}
}
}
cleanWs()
als Schritt ausführen löscht sie, bevor der Befehl zum Erstellen nach dem Erstellen ausgeführt wird. cleanWs()
sollte höchstwahrscheinlich immer als Post-Build-Befehl ausgeführt werden
post
Abschnitt haben, cleanWs()
können Sie sicher in den always
Zustand versetzt werden, aber der sicherste Punkt befindet sich innerhalb des cleanup
Zustands:post { cleanup { cleanWs() } }
Tatsächlich löscht die Funktion deleteDir das aktuelle Verzeichnis und seinen Inhalt rekursiv. Symbolische Links und Kreuzungen werden nicht befolgt, sondern entfernt.
Um ein bestimmtes Verzeichnis eines Arbeitsbereichs zu löschen, schließen Sie den Schritt deleteDir in einen Verzeichnisschritt ein.
dir('directoryToDelete') {
deleteDir()
}
Ich habe deleteDir () wie folgt verwendet:
post {
always {
deleteDir() /* clean up our workspace */
}
}
Allerdings musste ich dann immer NUR immer einen Erfolg oder Misserfolg ausführen, aber Sie können die Post-Bedingungen nicht bestellen. Die aktuelle Reihenfolge ist immer geändert, abgebrochen, fehlgeschlagen, erfolgreich und dann instabil.
Es gibt jedoch eine sehr nützliche Nachbedingung, die Bereinigung, die immer zuletzt ausgeführt wird (siehe https://jenkins.io/doc/book/pipeline/syntax/).
Am Ende war mein Beitrag also wie folgt:
post {
always {
}
success{
}
failure {
}
cleanup{
deleteDir()
}
}
Hoffentlich kann dies für einige Eckfälle hilfreich sein
Verwenden des folgenden Pipeline-Skripts:
pipeline {
agent { label "master" }
options { skipDefaultCheckout() }
stages {
stage('CleanWorkspace') {
steps {
cleanWs()
}
}
}
}
Folge diesen Schritten:
options { skipDefaultCheckout() }
ein wenig schnellere Ausführung.
Wenn Sie in Jenkins einen benutzerdefinierten Arbeitsbereich verwendet haben, löscht deleteDir () den Ordner @tmp nicht.
Um @tmp zusammen mit dem Arbeitsbereich zu löschen, verwenden Sie Folgendes
pipeline {
agent {
node {
customWorkspace "/home/jenkins/jenkins_workspace/${JOB_NAME}_${BUILD_NUMBER}"
}
}
post {
cleanup {
/* clean up our workspace */
deleteDir()
/* clean up tmp directory */
dir("${workspace}@tmp") {
deleteDir()
}
/* clean up script directory */
dir("${workspace}@script") {
deleteDir()
}
}
}
}
Dieses Snippet funktioniert auch für den Standardarbeitsbereich.
Wir stellen sicher, dass wir mit einem sauberen Arbeitsbereich arbeiten, indem wir eine Funktion des Git-Plugins verwenden. Sie können zusätzliche Verhaltensweisen wie "Vor dem Auschecken bereinigen" hinzufügen. Wir verwenden dies auch für 'Prune veraltete Remote-Tracking-Zweige'.
Die Verwendung der Erweiterung 'WipeWorkspace' scheint ebenfalls zu funktionieren. Es erfordert die längere Form:
checkout([
$class: 'GitSCM',
branches: scm.branches,
extensions: scm.extensions + [[$class: 'WipeWorkspace']],
userRemoteConfigs: scm.userRemoteConfigs
])
Weitere Details finden Sie hier: https://support.cloudbees.com/hc/en-us/articles/226122247-How-to-Customize-Checkout-for-Pipeline-Multibranch-
Verfügbare GitSCM-Erweiterungen finden Sie hier: https://github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl
Bereinigen : Da der Post-Abschnitt einer Pipeline am Ende der Ausführung einer Pipeline garantiert ausgeführt wird, können wir einige Benachrichtigungen oder andere Schritte hinzufügen, um Finalisierungs-, Benachrichtigungs- oder andere Aufgaben am Ende der Pipeline auszuführen.
pipeline {
agent any
stages {
stage('No-op') {
steps {
sh 'ls'
}
}
}
post {
cleanup {
echo 'One way or another, I have finished'
deleteDir() /* clean up our workspace */
}
}
}
In meinem Fall möchte ich alte Dateien zu Beginn des Builds löschen, dies ist jedoch problematisch, da der Quellcode ausgecheckt wurde.
Meine Lösung besteht darin, git zu bitten, alle Dateien (aus dem letzten Build) zu bereinigen, von denen es nichts weiß:
sh "git clean -x -f"
Auf diese Weise kann ich den Build-Out bereinigen. Wenn dies fehlschlägt, wird der Arbeitsbereich nicht bereinigt und ist daher leicht zu debuggen.
Derzeit funktionieren sowohl deletedir () als auch cleanWs () nicht ordnungsgemäß, wenn das Jenkins-Kubernetes-Plugin verwendet wird. Der Pod-Arbeitsbereich wird gelöscht, der Master-Arbeitsbereich bleibt jedoch bestehen
Dies sollte für dauerhafte Zweige kein Problem sein, wenn Sie den Arbeitsbereich vor dem Auschecken betrügen müssen. Grundsätzlich wird derselbe Arbeitsbereich immer wieder verwendet. Bei Verwendung von Multibranch-Pipelines behält der Master jedoch den gesamten Arbeitsbereich und das Git-Verzeichnis bei
Ich glaube, das sollte ein Problem mit Jenkins sein, irgendeine Erleuchtung hier?