Jenkins Pipeline擦除工作区

qmo*_*qmo 121 workspace jenkins jenkins-pipeline

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

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

cur*_*xes 116

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

cleanWs()
Run Code Online (Sandbox Code Playgroud)

使用Jenkins版本2.16Workspace Cleanup插件,我使用

step([$class: 'WsCleanup'])
Run Code Online (Sandbox Code Playgroud)

删除工作区.

你可以去看看

JENKINS_URL/job/<any Pipeline project>/pipeline-syntax
Run Code Online (Sandbox Code Playgroud)

然后从Sample步骤中选择"step:General Build Step",然后从Build步骤中选择"在构建完成时删除工作区"

  • 根据[这个PR](https://github.com/jenkinsci/ws-cleanup-plugin/pull/30/files#diff-4b88580f361d14ff592e5f06a99026ccR258),包括在[0.33](https://wiki.jenkins.io/ display/JENKINS/Workspace + Cleanup + Plugin#WorkspaceCleanupPlugin-Release0.33(2017-04-24)),这在管道中称为`cleanWs`. (4认同)

Krz*_*soń 96

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

  • 我把它放在`checkout scm`之前的开头. (19认同)
  • 我有deleteDir()的问题.当节点在从属服务器上构建时,似乎随机无法删除当前目录.如果发生这种情况,构建当然会失败.因此,请注意您的工作是否随机失败.我不明白为什么节点不仅仅是在节点开始构建时清理它的工作空间.因为节点可以在任何地方运行,所以无论如何都无法对工作空间中的文件做出任何假设. (7认同)
  • 我也将此放在开头,以防项目在到达末尾之前失败,或者下一个构建在其他从属上。 (2认同)
  • 这是用于清理Jenkins文档的["清理和通知"](https://jenkins.io/doc/pipeline/tour/post/)部分中的工作区的命令. (2认同)

Mat*_*iMu 65

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

=>在大多数情况下,您应该将其置于后建步骤条件中,例如always:

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
    post { 
        always { 
            cleanWs()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你只有一个`post`部分,`cleanWs()`可以安全地进入`always`条件,但最安全的地方是`cleanup`条件:`post {cleanup {cleanWs()}}` (17认同)
  • 这对我的用例来说绝对是关键.我需要从作业中归档工件,并在运行post build archive命令之前运行`cleanWs()`作为步骤删除它们.`cleanWs()`应该总是作为post build命令运行 (4认同)

Seb*_*ien 62

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

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

dir('directoryToDelete') {
    deleteDir()
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然OP只询问如何删除工作区,但这个答案是最有用的. (9认同)

use*_*383 12

我使用deleteDir()如下:

  post {
        always {
            deleteDir() /* clean up our workspace */
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,我必须始终运行成功或失败,但您无法订购帖子条件.当前订单总是,更改,中止,失败,成功然后不稳定.

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

所以最后我的帖子如下:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可能对某些角落案件有所帮助


And*_*ray 11

使用以下管道脚本:

pipeline {
    agent { label "master" }
    options { skipDefaultCheckout() }
    stages {
        stage('CleanWorkspace') {
            steps {
                cleanWs()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

跟着这些步骤:

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

  • 添加“options {skipDefaultCheckout() }”以加快执行速度。 (2认同)

bli*_*ile 8

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

checkout([
   $class: 'GitSCM',
   branches: scm.branches,
   extensions: scm.extensions + [[$class: 'WipeWorkspace']],
   userRemoteConfigs: scm.userRemoteConfigs
])
Run Code Online (Sandbox Code Playgroud)

更多详情: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


Sac*_*mbh 8

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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • cleanWs 和 deleteDir 有什么区别?给你投了赞成票 (3认同)

Pan*_*nde 6

如果您在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()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这也是我见过的唯一可以杀死恼人的@libs文件夹的答案 (2认同)

MAZ*_*Zux 6

对于 Jenkins 2.190.1,这肯定有效:

    post {
        always {
            cleanWs deleteDirs: true, notFailBuild: true
        }
    }
Run Code Online (Sandbox Code Playgroud)