O espaço de trabalho para limpeza do pipeline Jenkins

142

Estamos executando o Jenkins 2.xe adoramos o novo plug-in Pipeline. No entanto, com tantas ramificações em um repositório, o espaço em disco é preenchido rapidamente.

Existe algum plug-in compatível com o Pipeline que eu possa eliminar o espaço de trabalho em uma compilação bem-sucedida?

qmo
fonte

Respostas:

110

Você pode usar deleteDir()como a última etapa do Jenkinsfile do pipeline (supondo que você não alterou o diretório de trabalho).

Krzysztof Krasoń
fonte
7
Estou com problemas com deleteDir (). Parece que não é possível excluir aleatoriamente o diretório atual quando o nó é construído em um escravo. A construção falha, é claro, se isso acontecer. Esteja ciente de que seus trabalhos falham aleatoriamente. Não entendo por que o nó não apenas limpa o espaço de trabalho quando o nó começa a ser construído. Como o nó pode ser executado em qualquer lugar, você não pode fazer nenhuma suposição sobre os arquivos na área de trabalho.
ssindelar
1
Mas acho que apenas excluirá o espaço de trabalho no nó atual. No caso geral, seu pipeline será executado em vários escravos diferentes.
Marcus Philip
21
Eu coloquei isso no começo logo antes checkout scm.
jpbochi
2
Também coloquei isso no começo, caso o projeto falhe antes de chegar ao fim ou a próxima compilação esteja em um escravo diferente.
davegallant
2
Este é o comando documentado para limpar a área de trabalho na seção "Limpeza e notificações" da documentação do Jenkins.
vossad01
131

Como @gotgenes apontou com a versão Jenkins. 2.74 , o abaixo funciona, não tenho certeza desde quando, talvez se alguém puder editar e adicionar a versão acima

cleanWs()

No Jenkins Versão 2.16 e no Plugin de Limpeza da Área de Trabalho , que eu tenho, eu uso

step([$class: 'WsCleanup'])

para excluir a área de trabalho.

Você pode visualizá-lo acessando

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

Em seguida, selecione "etapa: Etapa Geral de Construção" na etapa Amostra e, em seguida, selecione "Excluir área de trabalho quando a construção terminar" na etapa Construção

cursed_axes
fonte
Isso funciona para mim: Jenkins 2.7.2, Workspace Cleanup Plugin 0,30
dsh
4
De acordo com este PR , incluído em 0,33 , isso é chamado no pipeline como cleanWs.
gotgenes 18/09/17
93

As soluções mencionadas deleteDir()e cleanWs()(se estiver usando o plug-in de limpeza da área de trabalho ) funcionam, mas a recomendação para usá-la em uma etapa de construção extra geralmente não é a solução desejada . Se a construção falhar e o pipeline for abortado, esse estágio de limpeza nunca será atingido e, portanto, o espaço de trabalho não será limpo em construções com falha.

=> Na maioria dos casos, você provavelmente deve colocá-lo em uma condição pós-compilação, como always:

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
    post { 
        always { 
            cleanWs()
        }
    }
}
MattDiMu
fonte
5
Isso foi absolutamente essencial para o meu caso de uso. Preciso arquivar artefatos do trabalho, e executar cleanWs()como uma etapa os exclui antes que o comando pós-compilação seja executado. cleanWs()provavelmente deve sempre ser executado como um comando de compilação pós
Brandon
23
Se você tem apenas uma postseção, cleanWs()pode seguramente ser colocado na alwayscondição, mas o local mais seguro é dentro da cleanupcondição:post { cleanup { cleanWs() } }
ᴠɪɴᴄᴇɴᴛ
68

De fato, a função deleteDir exclui recursivamente o diretório atual e seu conteúdo. Links e junções simbólicas não serão seguidos, mas serão removidos.

Para excluir um diretório específico de uma área de trabalho, envolva a etapa deleteDir em uma etapa dir.

dir('directoryToDelete') {
    deleteDir()
}
Sebastien
fonte
10
Embora o OP tenha perguntado apenas como excluir o espaço de trabalho, esta resposta é a mais informativa.
John McGehee
21

Eu usei deleteDir () da seguinte maneira:

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

No entanto, tive que executar também um Sucesso ou Falha APÓS sempre, mas você não pode solicitar as condições de postagem. A ordem atual é sempre, alterada, abortada, falha, sucesso e, em seguida, instável.

No entanto, existe uma condição pós muito útil, a limpeza que sempre é executada por último, consulte https://jenkins.io/doc/book/pipeline/syntax/

Então, no final, meu post foi o seguinte:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

Espero que isso possa ser útil para alguns casos de canto

user3586383
fonte
Recebemos um erro "limpeza de condição inválida", estamos usando a versão 2.89 do Jenkins
Aravind Murthy
18

Usando o seguinte script de pipeline:

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

Siga esses passos:

  1. Navegue até a versão mais recente do trabalho de pipeline do qual você deseja limpar a área de trabalho.
  2. Clique no link Replay no menu LHS.
  3. Cole o script acima na caixa de texto e clique em Executar
Andrew Gray
fonte
Adicione options { skipDefaultCheckout() }uma execução um pouco mais rápida.
AkisK 9/04/19
Resposta aprimorada com a sua sugestão @AkisK
Andrew Gray
Parece que esta é a única opção que funciona para limpar a área de trabalho ANTES e NÃO DEPOIS de executar um pipeline, mesmo que eu não quisesse ter uma etapa separada para apenas limpar. Obrigado
Sergey Pleshakov 09/07/19
11

Se você usou o espaço de trabalho personalizado no Jenkins, o deleteDir () não excluirá a pasta @tmp.

Para excluir @tmp junto com a área de trabalho, use o seguinte

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

Esse trecho também funcionará no espaço de trabalho padrão.

Pankaj Shinde
fonte
1
Também funciona com um pipeline dockerized. Muito útil, obrigado!
Mcw 01/07/19
1
Esta é também a única resposta que eu vi que pode matar os @libs irritantes pasta também
David Lavender
4

Garantimos que estamos trabalhando com um espaço de trabalho limpo usando um recurso do plugin git. Você pode adicionar comportamentos adicionais como 'Limpar antes do checkout'. Usamos isso também para 'Remover ramificações antigas de rastreamento remoto'.

NOTtardy
fonte
4

O uso da extensão 'WipeWorkspace' também parece funcionar. Requer o formato mais longo:

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

Mais detalhes aqui: https://support.cloudbees.com/hc/pt-br/articles/226122247-How-to-Customize-Checkout-for-Pipeline-Multibranch-

Extensões GitSCM disponíveis aqui: https://github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl

blindsnowmobile
fonte
2

Para o Jenkins 2.190.1, isso funciona com certeza:

    post {
        always {
            cleanWs deleteDirs: true, notFailBuild: true
        }
    }
MAZux
fonte
1

Limpeza : Como a seção de postagem de um pipeline é garantida para ser executada no final da execução de um pipeline, podemos adicionar algumas notificações ou outras etapas para executar a finalização, notificação ou outras tarefas de final 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 */
        }
    }
}
YourAboutMeIsBlank
fonte
Isso não funciona quando estágios são executados em escravos diferentes!
precisa saber é o seguinte
1

No meu caso, quero limpar os arquivos antigos no início da compilação, mas isso é problemático, pois o código-fonte foi retirado.

Minha solução é pedir ao git para limpar todos os arquivos (desde a última compilação) que ele não conhece:

    sh "git clean -x -f"

Dessa forma, eu posso iniciar a construção limpa e, se falhar, o espaço de trabalho não será limpo e, portanto, facilmente depurável.

djhaskin987
fonte
0

Atualmente, deleteir () e cleanWs () não funcionam corretamente ao usar o plug-in Jenkins kubernetes, o espaço de trabalho do pod é excluído, mas o espaço de trabalho principal persiste

não deve ser um problema para ramificações persistentes, quando você tem uma etapa para limpar a área de trabalho antes da farsa do checkout. Basicamente, reutilizará o mesmo espaço de trabalho repetidamente: mas, ao usar pipelines com várias filiais, o mestre mantém todo o espaço de trabalho e o diretório git

Eu acredito que isso deve ser um problema para Jenkins, alguma iluminação aqui?

Joel Almeida
fonte