Jenkins 管道清除工作空间

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

有没有与管道兼容的插件,我可以清除一个成功的构建的工作区?

307192 次浏览

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

实际上,delete/dir 函数递归地删除工作目录及其内容。符号链接和连接将不会被遵循,但将被删除。

若要删除工作区的特定目录,请将 deteDir 步骤换行到 dir 步骤中。

dir('directoryToDelete') {
deleteDir()
}

就像@gotgene 在 詹金斯版本2.74中指出的那样,下面的代码可以使用,但不确定是从什么时候开始的,也许有人可以编辑并添加上面的版本

cleanWs()

我用的是 詹金斯版本2.16工作区清理插件

step([$class: 'WsCleanup'])

删除工作区。

你可以通过

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

然后从示例步骤中选择“ Step: General Build Step”,然后从 Build 步骤中选择“ Delete workspace when Build is done”

我们通过使用 git 插件的一个特性来确保我们使用的是一个干净的工作空间。您可以添加其他行为,如“结账前清理”。我们也将其用于“修剪陈旧的远程跟踪分支”。

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

= > 在大多数情况下,你可能应该把它放在像 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

清理 : 由于管道的 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 */
}
}
}

我使用了 delete teDir () ,如下所示:

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

然而,我随后还要运行一个成功或失败之后总是,但你不能命令后期条件。 当前的秩序总是,改变,中止,失败,成功,然后不稳定。

然而,有一个非常有用的后置条件,清理现场总是运行在最后,看到 https://jenkins.io/doc/book/pipeline/syntax/

所以最后我的帖子是这样的:

post {
always {


}
success{


}
failure {


}
cleanup{
deleteDir()
}
}

希望这对一些困难的案例有所帮助

使用以下管道脚本:

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

遵循以下步骤:

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

如果您在 Jenkins 中使用了自定义工作区,那么 delete teDir ()将不会删除@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
}
}

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

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

我觉得这应该是詹金斯的问题, 这里有什么启示吗?

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

我通常用这个:

post {
success {
cleanWs()
}
}