【发布时间】:2016-09-24 21:45:28
【问题描述】:
我们正在运行 Jenkins 2.x,并且喜欢新的 Pipeline 插件。但是,由于存储库中有如此多的分支,磁盘空间很快就会被填满。
是否有任何与 Pipeline 兼容的插件,我可以在成功构建时清除工作区?
【问题讨论】:
标签: jenkins continuous-integration jenkins-pipeline jenkins-plugins workspace
我们正在运行 Jenkins 2.x,并且喜欢新的 Pipeline 插件。但是,由于存储库中有如此多的分支,磁盘空间很快就会被填满。
是否有任何与 Pipeline 兼容的插件,我可以在成功构建时清除工作区?
【问题讨论】:
标签: jenkins continuous-integration jenkins-pipeline jenkins-plugins workspace
您可以使用deleteDir() 作为管道 Jenkinsfile 的最后一步(假设您没有更改工作目录)。
【讨论】:
checkout scm之前的开头。
实际上 deleteDir 函数递归地删除当前目录及其内容。符号链接和交汇点将不被遵循,但将被删除。
要删除工作区的特定目录,请将 deleteDir 步骤包装在 dir 步骤中。
dir('directoryToDelete') {
deleteDir()
}
【讨论】:
就像@gotgenes 在Jenkins 版本中指出的那样。 2.74,下面的工作,不知道从什么时候开始,也许有人可以编辑和添加上面的版本
cleanWs()
有了 Jenkins 版本 2.16 和 Workspace 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”
我们通过使用 git 插件的功能确保我们使用干净的工作区。您可以添加其他行为,例如“结帐前清洁”。我们也将其用于“修剪陈旧的远程跟踪分支”。
【讨论】:
提到的解决方案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() } }
使用“WipeWorkspace”扩展似乎也可以。它需要更长的形式:
checkout([
$class: 'GitSCM',
branches: scm.branches,
extensions: scm.extensions + [[$class: 'WipeWorkspace']],
userRemoteConfigs: scm.userRemoteConfigs
])
此处提供的 GitSCM 扩展:https://github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl
【讨论】:
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 */
}
}
}
【讨论】:
我使用 deleteDir() 如下:
post {
always {
deleteDir() /* clean up our workspace */
}
}
但是,我必须始终在之后运行 Success 或 Failure,但您不能订购后置条件。 当前的顺序总是,改变,中止,失败,成功,然后不稳定。
但是,有一个非常有用的后置条件,cleanup,它总是最后运行,参见https://jenkins.io/doc/book/pipeline/syntax/
所以最后我的帖子如下:
post {
always {
}
success{
}
failure {
}
cleanup{
deleteDir()
}
}
希望这可能对某些极端情况有所帮助
【讨论】:
使用以下管道脚本:
pipeline {
agent { label "master" }
options { skipDefaultCheckout() }
stages {
stage('CleanWorkspace') {
steps {
cleanWs()
}
}
}
}
按照以下步骤操作:
【讨论】:
options { skipDefaultCheckout() } 以加快执行速度。
如果您在 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 也适用于默认工作区。
【讨论】:
在我的例子中,我想在构建的开始清除旧文件,但这有问题,因为源代码已经被签出。
我的解决方案是让 git 清除它不知道的所有文件(来自上次构建):
sh "git clean -x -f"
这样我可以干净地开始构建,如果它失败了,工作区不会被清理掉,因此很容易调试。
【讨论】:
对于 Jenkins 2.190.1,这肯定有效:
post {
always {
cleanWs deleteDirs: true, notFailBuild: true
}
}
【讨论】:
目前在使用 Jenkins kubernetes 插件时,deletedir() 和 cleanWs() 都不能正常工作,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()
}
}
}
【讨论】: