Espacio de trabajo de eliminación de tuberías de Jenkins

142

Estamos ejecutando Jenkins 2.xy amamos el nuevo plugin Pipeline. Sin embargo, con tantas ramas en un repositorio, el espacio en disco se llena rápidamente.

¿Hay algún complemento que sea compatible con Pipeline que pueda borrar el espacio de trabajo en una compilación exitosa?

qmo
fuente

Respuestas:

110

Puede usarlo deleteDir()como el último paso de la tubería Jenkinsfile (suponiendo que no haya cambiado el directorio de trabajo).

Krzysztof Krasoń
fuente
77
Tengo problemas con deleteDir (). Parece que al azar no puede eliminar el directorio actual cuando el nodo se construye en un esclavo. La construcción falla, por supuesto, si esto sucede. Así que tenga en cuenta si sus trabajos fallan al azar. No entiendo por qué el nodo no solo limpia su espacio de trabajo cuando el nodo comienza a construir. Debido a que el nodo puede ejecutarse en cualquier lugar, no puede hacer suposiciones sobre los archivos en el espacio de trabajo de todos modos.
ssindelar
1
Pero creo que solo eliminará el espacio de trabajo en el nodo actual. En el caso general, su tubería se ejecutará en varios esclavos diferentes.
Marcus Philip
21
Puse esto al principio justo antes checkout scm.
jpbochi
2
Puse esto al principio también, en caso de que el proyecto falle antes de que llegue al final, o la próxima compilación esté en un esclavo diferente.
davegallant
2
Este es el comando documentado para limpiar el espacio de trabajo en la sección "Limpieza y notificaciones" de la documentación de Jenkins.
vossad01
131

Como @gotgenes señaló con la versión Jenkins. 2.74 , funciona a continuación, no estoy seguro desde cuándo, tal vez si alguien puede editar y agregar la versión anterior

cleanWs()

Con Jenkins Versión 2.16 y el Plugin de limpieza del espacio de trabajo que tengo, uso

step([$class: 'WsCleanup'])

para eliminar el espacio de trabajo.

Puedes verlo yendo a

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

Luego, seleccione "paso: paso de compilación general" en el paso de muestra y luego seleccione "Eliminar espacio de trabajo cuando finalice la compilación" del paso de compilación

cursed_axes
fuente
Esto funciona para mí: Jenkins 2.7.2, Workspace Cleanup Plugin 0.30
dsh
44
De acuerdo con este PR , incluido en 0.33 , esto se llama en la tubería como cleanWs.
gotgenes
93

Las soluciones mencionadas deleteDir()y cleanWs()(si se usa el complemento de limpieza del espacio de trabajo ) funcionan, pero la recomendación de usarlo en un paso de compilación adicional generalmente no es la solución deseada . Si la compilación falla y se cancela la canalización, esta etapa de limpieza nunca se alcanza y, por lo tanto, el espacio de trabajo no se limpia en compilaciones fallidas.

=> En la mayoría de los casos, probablemente debería ponerlo en una condición de paso posterior a la construcción como always:

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
    post { 
        always { 
            cleanWs()
        }
    }
}
MattDiMu
fuente
55
Esto fue absolutamente clave para mi caso de uso. Necesito archivar los artefactos del trabajo, y ejecutarlos cleanWs()como un paso los elimina antes de que se ejecute el comando post build archive. cleanWs()debe más probable es que siempre se ejecute como un comando de generación de post
Brandon
23
Si solo tiene una postsección, cleanWs()se puede poner de forma segura en la alwayscondición, pero el lugar más seguro está dentro de la cleanupcondición:post { cleanup { cleanWs() } }
ᴠɪɴᴄᴇɴᴛ
68

De hecho, la función deleteDir elimina recursivamente el directorio actual y su contenido. Los enlaces simbólicos y las uniones no se seguirán, pero se eliminarán.

Para eliminar un directorio específico de un espacio de trabajo, ajuste el paso deleteDir en un paso dir.

dir('directoryToDelete') {
    deleteDir()
}
Sebastien
fuente
10
Aunque el OP preguntó simplemente cómo eliminar el espacio de trabajo, esta respuesta es la más informativa.
John McGehee
21

Usé deleteDir () de la siguiente manera:

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

Sin embargo, también tuve que ejecutar un Éxito o Fracaso DESPUÉS siempre, pero no puede solicitar las condiciones de publicación. El orden actual es siempre, modificado, abortado, fallido, exitoso y luego inestable.

Sin embargo, hay una condición de publicación muy útil, la limpieza que siempre se ejecuta al final, consulte https://jenkins.io/doc/book/pipeline/syntax/

Así que al final mi publicación fue la siguiente:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

Esperemos que esto pueda ser útil para algunos casos de esquina

usuario3586383
fuente
Recibimos un error "limpieza de condición no válida", estamos utilizando Jenkins versión 2.89
Aravind Murthy
18

Usando el siguiente script de canalización:

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

Sigue estos pasos:

  1. Vaya a la última compilación del trabajo de canalización del que desea limpiar el espacio de trabajo.
  2. Haga clic en el enlace Reproducir en el menú LHS.
  3. Pegue la secuencia de comandos anterior en el cuadro de texto y haga clic en Ejecutar
Andrew Gray
fuente
Agregue options { skipDefaultCheckout() }para una ejecución un poco más rápida.
AkisK
Respuesta mejorada con su sugerencia @AkisK
Andrew Gray
Parece que esta es la única opción que funciona para limpiar el espacio de trabajo ANTES y NO DESPUÉS de ejecutar una tubería, a pesar de que no quería tener un paso separado solo para limpiar. Gracias
Sergey Pleshakov
11

Si ha utilizado un espacio de trabajo personalizado en Jenkins, deleteDir () no eliminará la carpeta @tmp.

Entonces, para eliminar @tmp junto con el espacio de trabajo, use el siguiente

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

Este fragmento también funcionará para el espacio de trabajo predeterminado.

Pankaj Shinde
fuente
1
También funciona con una tubería dockerizada. Muy útil, gracias!
mcw 01 de
1
Esta es también la única respuesta que he visto que también puede matar la molesta carpeta @libs
David Lavender
4

Nos aseguramos de trabajar con un espacio de trabajo limpio mediante el uso de una característica del complemento git. Puede agregar comportamientos adicionales como 'Limpiar antes de pagar'. Usamos esto también para 'Podar ramas de seguimiento remoto obsoletas'.

NOTtardy
fuente
4

El uso de la extensión 'WipeWorkspace' parece funcionar también. Requiere la forma más larga:

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

Más detalles aquí: https://support.cloudbees.com/hc/en-us/articles/226122247-How-to-Customize-Checkout-for-Pipeline-Multibranch-

Extensiones de GitSCM disponibles aquí: https://github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl

blindsnowmobile
fuente
2

Para Jenkins 2.190.1 esto funciona con seguridad:

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

Limpieza : dado que la sección de publicación de una tubería está garantizada para ejecutarse al final de la ejecución de una tubería, podemos agregar alguna notificación u otros pasos para realizar la finalización, notificación u otras tareas de finalización de la tubería.

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
fuente
¡Esto no funciona cuando hay etapas que se ejecutan en diferentes esclavos!
codeGeass
1

En mi caso, quiero borrar los archivos antiguos al principio de la compilación, pero esto es problemático ya que el código fuente ha sido desprotegido.

Mi solución es pedirle a git que limpie cualquier archivo (de la última compilación) que no conozca:

    sh "git clean -x -f"

De esa manera, puedo comenzar la compilación limpia y, si falla, el espacio de trabajo no se limpia y, por lo tanto, se puede depurar fácilmente.

djhaskin987
fuente
0

Actualmente, deleteir () y cleanWs () no funcionan correctamente cuando se usa el complemento Jenkins kubernetes, el espacio de trabajo del pod se elimina pero el espacio de trabajo maestro persiste

No debería ser un problema para las ramas persistentes, cuando tiene un paso para limpiar el espacio de trabajo antes de la estafa de pago. Básicamente, reutilizará el mismo espacio de trabajo una y otra vez: pero cuando se usan tuberías de múltiples ramas, el maestro mantiene todo el espacio de trabajo y el directorio git

Creo que esto debería ser un problema con Jenkins, ¿alguna iluminación aquí?

Joel Almeida
fuente