Jenkins Pipeline擦除工作区

时间:2016-05-26 18:25:21

标签: jenkins jenkins-pipeline

我们正在运行Jenkins 2.x并喜欢新的Pipeline插件。但是,如果存储库中有如此多的分支,则磁盘空间会很快填满。

是否有任何与Pipeline兼容的插件可以在成功构建时清除工作区?

15 个答案:

答案 0 :(得分:99)

就像@gotgenes用 Jenkins Version指出的那样。 2.74 ,以下作品,不确定从什么时候开始,也许有人可以编辑并添加上面的版本

cleanWs()

使用 Jenkins版本2.16 Workspace Cleanup Plugin,我使用

step([$class: 'WsCleanup'])

删除工作区。

您可以转到

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

然后选择&#34;步骤:一般构建步骤&#34;从Sample步骤开始,然后在构建完成时选择&#34;删除工作区&#34;来自构建步骤

答案 1 :(得分:82)

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

答案 2 :(得分:56)

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

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

dir('directoryToDelete') {
    deleteDir()
}

答案 3 :(得分:44)

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

=&GT;在大多数情况下,您应该将其放在post-built-step condition always

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

答案 4 :(得分:11)

我按如下方式使用deleteDir():

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

但是,随后我必须始终始终执行成功或失败操作,但是您无法订购发布条件。 当前顺序总是,更改,中止,失败,成功然后不稳定。

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

所以最后我的帖子如下:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

希望这对某些极端情况可能有用

答案 5 :(得分:4)

使用以下管道脚本:

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

请按照以下步骤操作:

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

答案 6 :(得分:3)

我们通过使用git插件的功能确保我们正在使用干净的工作区。您可以添加其他行为,例如&#39;结帐前清洁&#39;。我们也将此用于修剪陈旧的远程跟踪分支机构&#39;。

答案 7 :(得分:3)

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

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

答案 8 :(得分:2)

Cleaning up:由于管道的post部分保证在Pipeline执行结束时运行,我们可以添加一些通知或其他步骤来执行最终化,通知或其他End-of-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 */
        }
    }
}

答案 9 :(得分:1)

使用&#39; WipeWorkspace&#39;扩展似乎也有效。它需要更长的形式:

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

答案 10 :(得分:0)

高级克隆行为中使用 Git浅层克隆 enter image description here

另一种方法是使用git clean -fdx

清理树

答案 11 :(得分:0)

如果您在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()
            }
        }
    }
}

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

答案 12 :(得分:0)

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

我的解决方案是要求git清除所有它不知道的文件(从上一版本开始)

    sh "git clean -x -f"

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

答案 13 :(得分:0)

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

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

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

答案 14 :(得分:0)

pipeline {
    agent any

    tools {nodejs "node"}
    
    environment {

    }

    parameters {
        string(name: 'FOLDER', defaultValue: 'ABC', description: 'FOLDER', trim: true)

    }

    stages {
        stage('1') {
            steps{
            }
        }
        stage("2") {
            steps {
            }     
        }
    }
    post {
        always {
            echo "Release finished do cleanup and send mails"
            deleteDir()
        }
        success {
            echo "Release Success"
        }
        failure {
            echo "Release Failed"
        }
        cleanup {
            echo "Clean up in post work space"
            cleanWs()
        }
    }
}