Jenkins 管道清除工作区

Jenkins Pipeline Wipe Out Workspace

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

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

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

实际上deleteDir 函数递归地删除当前目录及其内容。符号链接和连接点不会被跟踪,但会被删除。

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

dir('directoryToDelete') {
    deleteDir()
}

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

cleanWs()

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

step([$class: 'WsCleanup'])

删除工作区。

您可以前往

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

然后从示例步骤中选择 "step: General Build Step",然后从构建步骤中选择 "Delete workspace when build is done"

我们通过使用 git 插件的一项功能来确保我们在干净的工作区中工作。您可以添加其他行为,例如 'Clean before checkout'。我们也将其用于 'Prune stale remote-tracking branches'.

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

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

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

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

Cleaning up :由于 Pipeline 的 post 部分保证在 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 */
        }
    }
}

我使用 deleteDir() 如下:

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

但是,我还必须 运行 总是在成功或失败之后,但您不能订购 post 条件。 当前订单总是,更改,中止,失败,成功然后不稳定。

然而,有一个非常有用的 post 条件,cleanup 总是 运行s 最后,见 https://jenkins.io/doc/book/pipeline/syntax/

所以最后我的post如下:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

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

使用以下管道脚本:

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

按照以下步骤操作:

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

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

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

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

我的解决方案是让 git 清除它不知道的任何文件(从上次构建中):

    sh "git clean -x -f"

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

对于 Jenkins 2.190.1 这肯定有效:

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

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

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

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

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