Risposte:
È possibile utilizzare deleteDir()
come ultimo passaggio della pipeline Jenkinsfile (presupponendo che non sia stata modificata la directory di lavoro).
checkout scm
.
Come sottolineato da @gotgenes versione di Jenkins. 2.74 , il seguito funziona, non sono sicuro da quando, forse se qualcuno può modificare e aggiungere la versione sopra
cleanWs()
Con, Jenkins versione 2.16 e il plug-in di pulizia dell'area di lavoro , che ho, io uso
step([$class: 'WsCleanup'])
per eliminare l'area di lavoro.
Puoi vederlo andando a
JENKINS_URL/job/<any Pipeline project>/pipeline-syntax
Quindi selezionando "passaggio: passaggio di generazione generale" dal passaggio Esempio e quindi selezionando "Elimina area di lavoro al termine della creazione" dal passaggio di creazione
Le soluzioni menzionate deleteDir()
e cleanWs()
(se si utilizza il plug-in di pulizia dell'area di lavoro ) funzionano entrambe, ma la raccomandazione di utilizzarlo in un passaggio di build aggiuntivo non è in genere la soluzione desiderata . Se la compilazione fallisce e la pipeline viene interrotta, questa fase di cleanup non viene mai raggiunta e quindi lo spazio di lavoro non viene ripulito su build fallite.
=> Nella maggior parte dei casi dovresti probabilmente metterlo in una condizione post-build come always
:
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
post {
always {
cleanWs()
}
}
}
cleanWs()
come un passo li elimina prima che venga eseguito il comando post build archive. cleanWs()
molto probabilmente dovrebbe essere sempre eseguito come comando post build
post
sezione, cleanWs()
puoi tranquillamente metterlo nella always
condizione, ma il punto più sicuro è all'interno della cleanup
condizione:post { cleanup { cleanWs() } }
Infatti, la funzione deleteDir elimina in modo ricorsivo la directory corrente e il suo contenuto. Collegamenti simbolici e incroci non verranno seguiti ma verranno rimossi.
Per eliminare una directory specifica di un'area di lavoro, avvolgere il passaggio deleteDir in un passaggio dir.
dir('directoryToDelete') {
deleteDir()
}
Ho usato deleteDir () come segue:
post {
always {
deleteDir() /* clean up our workspace */
}
}
Tuttavia, ho dovuto eseguire anche un Esito positivo o negativo DOPO sempre, ma non è possibile ordinare le condizioni postali. L'ordine corrente è sempre, modificato, interrotto, errore, successo e quindi instabile.
Tuttavia, esiste una condizione post molto utile, la pulizia che viene eseguita per ultima, vedi https://jenkins.io/doc/book/pipeline/syntax/
Quindi alla fine il mio post era il seguente:
post {
always {
}
success{
}
failure {
}
cleanup{
deleteDir()
}
}
Speriamo che questo possa essere utile per alcuni casi d'angolo
Utilizzando il seguente script della pipeline:
pipeline {
agent { label "master" }
options { skipDefaultCheckout() }
stages {
stage('CleanWorkspace') {
steps {
cleanWs()
}
}
}
}
Segui questi passi:
options { skipDefaultCheckout() }
per un'esecuzione leggermente più veloce.
Se hai utilizzato lo spazio di lavoro personalizzato in Jenkins, deleteDir () non eliminerà la cartella @tmp.
Quindi, per eliminare @tmp insieme all'area di lavoro, utilizzare quanto segue
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()
}
}
}
}
Questo frammento funzionerà anche per lo spazio di lavoro predefinito.
Anche l'utilizzo dell'estensione "WipeWorkspace" sembra funzionare. Richiede la forma più lunga:
checkout([
$class: 'GitSCM',
branches: scm.branches,
extensions: scm.extensions + [[$class: 'WipeWorkspace']],
userRemoteConfigs: scm.userRemoteConfigs
])
Maggiori dettagli qui: https://support.cloudbees.com/hc/en-us/articles/226122247-How-to-Customize-Checkout-for-Pipeline-Multibranch-
Estensioni GitSCM disponibili qui: https://github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl
Pulizia : poiché la sezione post di una pipeline è garantita alla fine dell'esecuzione di una pipeline, possiamo aggiungere alcune notifiche o altri passaggi per eseguire operazioni di finalizzazione, notifica o altre attività di fine pipeline.
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 */
}
}
}
Nel mio caso, desidero cancellare i vecchi file all'inizio della compilazione, ma questo è problematico poiché il codice sorgente è stato estratto.
La mia soluzione è chiedere a git di ripulire tutti i file (dall'ultima build) di cui non è a conoscenza:
sh "git clean -x -f"
In questo modo posso avviare la compilazione in modo pulito e, se non riesce, l'area di lavoro non viene ripulita e quindi facilmente eseguibile il debug.
Attualmente sia deleteir () che cleanWs () non funzionano correttamente quando si utilizza il plugin kubernetes Jenkins, l'area di lavoro del pod viene eliminata ma l'area di lavoro principale persiste
non dovrebbe essere un problema per i rami persistenti, quando hai un passaggio per pulire l'area di lavoro prima del checkout della truffa. Fondamentalmente riutilizzerà più volte lo stesso spazio di lavoro: ma quando si utilizzano pipeline multibranch il master mantiene l'intero spazio di lavoro e la directory git
Credo che questo dovrebbe essere un problema con Jenkins, qualche illuminazione qui?