Espace de travail d'effacement du pipeline Jenkins


142

Nous utilisons Jenkins 2.x et adorons le nouveau plugin Pipeline. Cependant, avec autant de branches dans un référentiel, l'espace disque se remplit rapidement.

Existe-t-il un plugin compatible avec Pipeline que je peux effacer l'espace de travail lors d'une compilation réussie?

Réponses:


110

Vous pouvez utiliser deleteDir()comme dernière étape du pipeline Jenkinsfile (en supposant que vous n'ayez pas changé le répertoire de travail).


7
J'ai des problèmes avec deleteDir (). Il semble impossible de supprimer au hasard le répertoire actuel lorsque le nœud est construit sur un esclave. La construction échoue bien sûr si cela se produit. Soyez donc conscient si vos travaux échouent au hasard. Je ne comprends pas pourquoi le nœud ne nettoie pas seulement son espace de travail lorsque le nœud commence à se construire. Comme le nœud peut s'exécuter n'importe où, vous ne pouvez de toute façon pas faire d'hypothèses sur les fichiers de l'espace de travail.
ssindelar

1
Mais je pense que supprimera uniquement l'espace de travail sur le nœud actuel. Dans le cas général, votre pipeline fonctionnera sur plusieurs esclaves différents.
Marcus Philip

21
J'ai mis cela au début juste avant checkout scm.
jpbochi

2
Je mets cela au début également, au cas où le projet échouerait avant qu'il n'atteigne la fin, ou que la prochaine construction soit sur un esclave différent.
davegallant

2
Il s'agit de la commande documentée pour nettoyer l'espace de travail dans la section "Nettoyage et notifications" de la documentation Jenkins.
vossad01

131

Comme @gotgenes l'a souligné avec Jenkins Version. 2.74 , le ci-dessous fonctionne, je ne sais pas depuis quand, peut-être si quelqu'un peut éditer et ajouter la version ci-dessus

cleanWs()

Avec, Jenkins Version 2.16 et le plugin Workspace Cleanup que j'ai, j'utilise

step([$class: 'WsCleanup'])

pour supprimer l'espace de travail.

Vous pouvez le visualiser en accédant à

JENKINS_URL/job/<any Pipeline project>/pipeline-syntax

Puis en sélectionnant "étape: Étape de construction générale" à partir de l'étape Exemple, puis en sélectionnant "Supprimer l'espace de travail une fois la construction terminée" dans l'étape de construction


Cela fonctionne pour moi: Jenkins 2.7.2, plugin de nettoyage de l'espace de travail 0.30
dsh

4
Selon ce PR , inclus dans 0.33 , cela s'appelle dans le pipeline comme cleanWs.
gotgenes

93

Les solutions mentionnées deleteDir()et cleanWs()(si vous utilisez le plugin de nettoyage de l' espace de travail ) fonctionnent toutes les deux, mais la recommandation de l'utiliser dans une étape de construction supplémentaire n'est généralement pas la solution souhaitée . Si la génération échoue et que le pipeline est abandonné, cette étape de nettoyage n'est jamais atteinte et, par conséquent, l'espace de travail n'est pas nettoyé sur les générations ayant échoué.

=> Dans la plupart des cas, vous devriez probablement le mettre dans une condition post-built-step comme always:

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
    post { 
        always { 
            cleanWs()
        }
    }
}

5
C'était absolument essentiel pour mon cas d'utilisation. J'ai besoin d'archiver les artefacts du travail et l'exécution en cleanWs()tant qu'étape les supprime avant l'exécution de la commande d'archivage post build. cleanWs()devrait probablement toujours être exécuté en tant que commande post build
Brandon

23
Si vous n'avez qu'une seule postsection, cleanWs()peut être mis en sécurité en toute sécurité always, mais l'endroit le plus sûr est à l'intérieur de la cleanupcondition:post { cleanup { cleanWs() } }
ᴠɪɴᴄᴇɴᴛ

68

En fait, la fonction deleteDir supprime récursivement le répertoire courant et son contenu. Les liens symboliques et les jonctions ne seront pas suivis mais seront supprimés.

Pour supprimer un répertoire spécifique d'un espace de travail, encapsulez l'étape deleteDir dans une étape dir.

dir('directoryToDelete') {
    deleteDir()
}

10
Bien que le PO demande simplement comment supprimer l'espace de travail, cette réponse est la plus informative.
John McGehee

21

J'ai utilisé deleteDir () comme suit:

  post {
        always {
            deleteDir() /* clean up our workspace */
        }
    }

Cependant, j'ai dû également exécuter un succès ou un échec APRÈS toujours mais vous ne pouvez pas commander les conditions de publication. L'ordre actuel est toujours, modifié, annulé, échoué, réussi puis instable.

Cependant, il existe une post-condition très utile, le nettoyage qui s'exécute toujours en dernier, voir https://jenkins.io/doc/book/pipeline/syntax/

Donc, à la fin, mon message était le suivant:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

J'espère que cela peut être utile pour certains cas de coin


Nous obtenons une erreur "nettoyage de condition invalide", nous utilisons la version 2.89 de Jenkins
Aravind Murthy

19

À l'aide du script de pipeline suivant:

pipeline {
    agent { label "master" }
    options { skipDefaultCheckout() }
    stages {
        stage('CleanWorkspace') {
            steps {
                cleanWs()
            }
        }
    }
}

Suivez ces étapes:

  1. Accédez à la dernière version du travail de pipeline dont vous souhaitez nettoyer l'espace de travail.
  2. Cliquez sur le lien Replay dans le menu LHS.
  3. Collez le script ci-dessus dans la zone de texte et cliquez sur Exécuter

Ajoutez options { skipDefaultCheckout() }pour une exécution un peu plus rapide.
AkisK

Réponse améliorée avec votre suggestion @AkisK
Andrew Gray

On dirait que c'est la seule option qui fonctionne pour nettoyer l'espace de travail AVANT et PAS APRÈS l'exécution d'un pipeline, même si je ne voulais pas avoir une étape distincte pour simplement nettoyer. Merci
Sergey Pleshakov

11

Si vous avez utilisé un espace de travail personnalisé dans Jenkins, deleteDir () ne supprimera pas le dossier @tmp.

Donc, pour supprimer @tmp avec l'espace de travail, utilisez ce qui suit

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()
            }
        }
    }
}

Cet extrait fonctionnera également pour l'espace de travail par défaut.


1
Fonctionne également avec un pipeline dockerisé. Très utile, merci!
mcw

1
C'est aussi la seule réponse que j'ai vue qui peut tuer le dossier @libs ennuyeux aussi
David Lavender

4

Nous nous assurons de travailler avec un espace de travail propre en utilisant une fonctionnalité du plugin git. Vous pouvez ajouter des comportements supplémentaires tels que «Nettoyer avant de passer à la caisse». Nous l'utilisons également pour «Prune obsolètes des branches de suivi à distance».


4

L'utilisation de l'extension 'WipeWorkspace' semble également fonctionner. Il nécessite la forme la plus longue:

checkout([
   $class: 'GitSCM',
   branches: scm.branches,
   extensions: scm.extensions + [[$class: 'WipeWorkspace']],
   userRemoteConfigs: scm.userRemoteConfigs
])

Plus de détails ici: https://support.cloudbees.com/hc/en-us/articles/226122247-How-to-Customize-Checkout-for-Pipeline-Multibranch-

Extensions GitSCM disponibles ici: https://github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl


2

Pour Jenkins 2.190.1, cela fonctionne à coup sûr:

    post {
        always {
            cleanWs deleteDirs: true, notFailBuild: true
        }
    }

1

Nettoyage : étant donné que la section de publication d'un pipeline est garantie de s'exécuter à la fin de l'exécution d'un pipeline, nous pouvons ajouter une notification ou d'autres étapes pour effectuer la finalisation, la notification ou d'autres tâches de fin de 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 */
        }
    }
}

Cela ne fonctionne pas lorsque des étapes fonctionnent sur différents esclaves!
codeGeass

1

Dans mon cas, je souhaite effacer les anciens fichiers au début de la construction, mais cela pose problème car le code source a été extrait.

Ma solution est de demander à git de nettoyer tous les fichiers (de la dernière compilation) dont il ne connaît pas l'existence:

    sh "git clean -x -f"

De cette façon, je peux démarrer la compilation proprement, et si elle échoue, l'espace de travail n'est pas nettoyé et donc facilement débuggable.


0

Actuellement, deleteir () et cleanWs () ne fonctionnent pas correctement lors de l'utilisation du plugin Jenkins kubernetes, l'espace de travail du pod est supprimé mais l'espace de travail maître persiste

cela ne devrait pas être un problème pour les branches persistantes, lorsque vous avez une étape pour nettoyer l'espace de travail avant l'arnaque à la caisse. Il réutilisera fondamentalement le même espace de travail encore et encore: mais lors de l'utilisation de pipelines multibranch, le maître conserve tout l'espace de travail et le répertoire git

Je crois que cela devrait être un problème avec Jenkins, des lumières ici?

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.