【问题标题】:Jenkins Pipeline Wipe Out Workspace詹金斯管道清除工作区
【发布时间】:2016-09-24 21:45:28
【问题描述】:

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

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

【问题讨论】:

    标签: jenkins continuous-integration jenkins-pipeline jenkins-plugins workspace


    【解决方案1】:

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

    【讨论】:

    • 我在使用 deleteDir() 时遇到问题。当节点在从属设备上构建时,似乎无法随机删除当前目录。如果发生这种情况,构建当然会失败。因此,请注意您的工作是否随机失败。我不明白为什么节点不只是在节点开始构建时清理它的工作区。因为节点可以在任何地方运行,所以无论如何您都不能对工作区中的文件做出任何假设。
    • 但我认为只会删除当前节点上的工作区。在一般情况下,您的管道将在多个不同的从属服务器上运行。
    • 我把它放在checkout scm之前的开头。
    • 我也把它放在开头,以防项目在结束之前失败,或者下一个构建在不同的从站上。
    • 这是在 Jenkins 文档的 "Cleaning up and notifications" 部分中记录的用于清理工作区的命令。
    【解决方案2】:

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

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

    dir('directoryToDelete') {
        deleteDir()
    }
    

    【讨论】:

    • 虽然 OP 只询问了如何删除工作区,但这个答案是最有用的。
    【解决方案3】:

    就像@gotgenes 在Jenkins 版本中指出的那样。 2.74,下面的工作,不知道从什么时候开始,也许有人可以编辑和添加上面的版本

    cleanWs()
    

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

    step([$class: 'WsCleanup'])
    

    删除工作区。

    您可以前往

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

    然后从 Sample step 中选择“step: General Build Step”,然后从 Build step 中选择“Delete workspace when build is done”

    【讨论】:

    • 这对我有用:Jenkins 2.7.2,工作区清理插件 0.30
    • 根据this PR,包含在0.33中,这在管道中被称为cleanWs
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      => 在大多数情况下,您可能应该将其放在 post-built-step condition 中,例如 always

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

      【讨论】:

      • 这绝对是我用例的关键。我需要从作业中归档工件,并运行cleanWs() 作为一个步骤,在构建后归档命令运行之前删除它们。 cleanWs() 很可能总是作为构建后命令运行
      • 如果你只有一个post 部分,cleanWs() 可以安全地放入always 条件中,但最安全的位置是在cleanup 条件内:post { cleanup { cleanWs() } }
      【解决方案6】:

      使用“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

      【讨论】:

        【解决方案7】:

        Cleaning up : 由于管道的 post 部分保证在管道执行结束时运行,我们可以添加一些通知或其他步骤来执行终结、通知或其他管道结束任务。

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

        【讨论】:

        • 当stage在不同的slave上运行时这不起作用!
        【解决方案8】:

        我使用 deleteDir() 如下:

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

        但是,我必须始终在之后运行 Success 或 Failure,但您不能订购后置条件。 当前的顺序总是,改变,中止,失败,成功,然后不稳定。

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

        所以最后我的帖子如下:

        post {
            always {
        
            }
            success{
        
            }
            failure {
        
            }
            cleanup{
                deleteDir()
            }
        }
        

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

        【讨论】:

        • 我们收到错误“无效条件清理”,我们使用的是 Jenkins 2.89 版
        • 在我看来,这是最好的答案之一,但是,我建议不要在失败的情况下删除数据,例如您保留调试数据。而且,删除开头的数据也是一个不错的解决方案。
        【解决方案9】:

        使用以下管道脚本:

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

        按照以下步骤操作:

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

        【讨论】:

        • 添加 options { skipDefaultCheckout() } 以加快执行速度。
        • 用你的建议改进答案@AkisK
        • 似乎这是在执行管道之前而不是之后清理工作区的唯一选项,即使我不想有一个单独的步骤来清理。谢谢
        【解决方案10】:

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

        此 sn-p 也适用于默认工作区。

        【讨论】:

        • 也适用于 dockerized 管道。很有帮助,谢谢!
        • 这也是我见过的唯一可以杀死烦人的@libs 文件夹的答案
        • cleanWs 和 deleteDir 有什么区别?
        【解决方案11】:

        在我的例子中,我想在构建的开始清除旧文件,但这有问题,因为源代码已经被签出。

        我的解决方案是让 git 清除它不知道的所有文件(来自上次构建):

            sh "git clean -x -f"
        

        这样我可以干净地开始构建,如果它失败了,工作区不会被清理掉,因此很容易调试。

        【讨论】:

          【解决方案12】:

          对于 Jenkins 2.190.1,这肯定有效:

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

          【讨论】:

            【解决方案13】:

            目前在使用 Jenkins kubernetes 插件时,deletedir() 和 cleanWs() 都不能正常工作,pod 工作区被删除但主工作区仍然存在

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

            我认为这应该是 Jenkins 的问题, 这里有什么启示吗?

            【讨论】:

              【解决方案14】:
              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()
                      }
                  }
              }
              

              【讨论】:

              • cleanWs 和 deleteDir 有什么区别?支持你
              猜你喜欢
              • 1970-01-01
              • 2022-09-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-01-09
              • 2018-11-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多