我们正在运行 Jenkins 2.x,并且喜欢新的管道插件。但是,由于存储库中有这么多分支,磁盘空间很快就会被填满。
有没有与管道兼容的插件,我可以清除一个成功的构建的工作区?
您可以使用 deleteDir()作为管道 Jenkins 文件的最后一步(假设您没有更改工作目录)。
deleteDir()
实际上,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这样的 建成后的阶梯状况里:
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() } } } }
遵循以下步骤:
如果您在 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() } }