Jenkins管道擦除工作区


140

我们正在运行Jenkins 2.x,并且喜欢新的Pipeline插件。但是,由于存储库中有如此多的分支,因此磁盘空间会迅速填满。

是否有任何与Pipeline兼容的插件,我可以在成功构建后清除工作空间?

Answers:


110

您可以将其deleteDir()用作管道Jenkinsfile的最后一步(假设您没有更改工作目录)。


7
我在deleteDir()中遇到问题。当节点在从属服务器上构建时,似乎无法随机删除当前目录。如果发生这种情况,构建当然会失败。因此,请注意您的工作是否随机失败。我不明白为什么节点在开始构建时不只是清理工作区。由于该节点可以在任何地方运行,因此无论如何您都无法对工作空间中的文件做任何假设。
ssindelar '16

1
但是我认为只会删除当前节点上的工作空间。通常,您的管道将在几个不同的从站上运行。
马库斯·菲利普

21
我把这个放在刚开始的时候checkout scm
jpbochi 2016年

2
我也将此放在开头,以防项目在到达末尾之前失败,或者下一个构建在其他从属上。
davegallant

2
这是在Jenkins文档的“清理和通知”部分中记录的用于清理工作区的命令。
vossad01

130

就像@gotgenes指出的那样 Jenkins版本中。2.74,下面的方法有效,不确定何时开始,也许有人可以编辑和添加上面的版本

cleanWs()

Jenkins 2.16版工作区清理插件,我有,我使用

step([$class: 'WsCleanup'])

删除工作区。

您可以通过以下方式查看

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

然后从“示例”步骤中选择“步骤:常规构建步骤”,然后从“构建”步骤中选择“完成构建时删除工作空间”


这对我有用:Jenkins 2.7.2,工作区清理插件0.30
dsh

4
根据此PR,包含在0.33中,在管道中称为cleanWs
gotgenes

93

提到的解决方案deleteDir()cleanWs()(如果使用工作空间清理插件)都可以使用,但是建议不要在额外的构建步骤中使用它通常不是理想的解决方案。如果构建失败并且管道中止,则永远不会到达此清理阶段,因此不会在失败的构建上清理工作空间。

=>在大多数情况下,您可能应该将其置于构建后的状态,例如always

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

5
这绝对是我用例的关键。我需要从作业中归档工件,并且在运行cleanWs()post build archive命令之前,将其作为一步运行将其删除。 cleanWs()应该最有可能总是作为后构建命令运行
Brandon '18

23
如果只有一个post部分,cleanWs()可以安全地置于always状况中,但最安全的地方是cleanup状况内:post { cleanup { cleanWs() } }
ᴠɪɴᴄᴇɴᴛ

68

实际上,deleteDir函数以递归方式删除当前目录及其内容。符号链接和结点将不被遵循,但将被删除。

要删除工作空间的特定目录,请将deleteDir步骤包装在dir步骤中。

dir('directoryToDelete') {
    deleteDir()
}

10
尽管OP仅询问如何删除工作空间,但此答案最有用。
John McGehee

21

我使用deleteDir()如下:

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

但是,之后我还必须始终运行“成功”或“失败”,但是您无法订购后期条件。当前顺序总是,更改,中止,失败,成功然后不稳定。

但是,有一个非常有用的后置条件,清理总是最后执行,请参见 https://jenkins.io/doc/book/pipeline/syntax/

所以最后我的帖子如下:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

希望这对某些极端情况可能有所帮助


我们收到错误消息“无效条件清除”,我们使用的是Jenkins版本2.89
Aravind Murthy,

18

使用以下管道脚本:

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

跟着这些步骤:

  1. 导航到您要清理工作空间的管道作业的最新版本。
  2. 单击LHS菜单中的Replay链接。
  3. 将上面的脚本粘贴到文本框中,然后单击“运行”。

添加options { skipDefaultCheckout() }以加快执行速度。
AkisK

您的建议得到了改进的答案@AkisK
Andrew Gray

似乎这是在执行管道之前和之后清理工作空间的唯一选项,即使我不想单独进行清理。谢谢
谢尔盖·普列沙科夫

11

如果您在Jenkins中使用了自定义工作区,则deleteDir()不会删除@tmp文件夹。

所以要删除@tmp以及工作区,请使用以下命令

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

此代码段也适用于默认工作空间。


1
也可用于dockerized管道。非常有帮助,谢谢!
mcw

1
这也是我所见过的唯一答案,它也可以杀死烦人的@libs文件夹
David Lavender

4

我们确保使用git插件的功能来处理干净的工作空间。您可以添加其他行为,例如“在结帐前清洁”。我们也将其用于“修剪陈旧的远程跟踪分支”。


4

使用“ WipeWorkspace”扩展名似乎也可以使用。它需要更长的形式:

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

此处有更多详细信息:https : //support.cloudbees.com/hc/en-us/articles/226122247-How-to-Customize-Checkout-for-Pipeline-Multibranch-

可用的GitSCM扩展在这里:https : //github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl


2

对于Jenkins 2.190.1,这可以肯定地起作用:

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

1

清理:由于一定要在管道执行结束时运行管道的发布部分,因此我们可以添加一些通知或其他步骤来执行终结,通知或其他管道末端任务。

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 */
        }
    }
}

当阶段在不同的从站上运行时,这不起作用!
codeGeass

1

就我而言,我想在构建开始时清除旧文件,但这是有问题的,因为源代码已被检出。

我的解决方案是要求git清除所有它不知道的文件(来自上一个版本):

    sh "git clean -x -f"

这样一来,我就可以开始清理构建,如果失败,则不会清理工作区,因此很容易调试。


0

当前,在使用Jenkins kubernetes插件时,Deletedir()和cleanWs()均无法正常工作,已删除pod工作区,但主工作区仍然存在

当您在结帐欺诈之前有步骤清理工作区时,对于持久性分支应该不是问题。基本上,它将一遍又一遍地重用同一工作空间:但是当使用多分支管道时,主服务器将保留整个工作空间和git目录

我认为这应该与詹金斯有关,这里有什么启示吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.