gpt4 book ai didi

Jenkins多分支管道: clean workspace/delete directory when build ends

转载 作者:行者123 更新时间:2023-12-02 17:17:02 26 4
gpt4 key购买 nike

我们正在使用 Jenkins 多分支(脚本化)管道来并行运行多个构建。每个目录都会创建一个新的、唯一命名的目录来 checkout 代码并运行测试。目录的命名是唯一的,因为它们包含分支名称,但也包含随机部分,例如“JAA2A5HUZB7TRE4OTVXU7S...”。

这意味着每次构建后 X 个目录(X = 并行作业数 * 分支数)保留在 Jenkins 节点上,填充磁盘空间。

我想知道如何自动删除这些目录。

我的初始管道的简化版本如下所示

// Initialize the matrix
def matrix = [
'foo',
'bar',
]

// Initialize empty tasks map
def tasks = [:]

// Job status
successful = true

// Fill our tasks map from the Matrix data
for (x in matrix) {

def job_name = x

tasks[job_name] = {
node('libvirt') {
// Checkout repository first
stage("$job_name - Checkout") {
checkout scm
}

// Then build the machine
gitlabCommitStatus('build') {
stage("$job_name - Build") {
sh "./bin/build.sh ${job_name}"
}
}
}
}
}
}


//// Pipeline ////

notifyBuild('STARTED')

// Run tasks in parallel
try {
parallel tasks
} catch(e) {
throw e
} finally {
if (successful) {
notifyBuild('SUCCESS')
} else {
notifyBuild('FAILED')
}
}

// Methods
def notifyBuild(String buildStatus = 'STARTED') {
// used to send formatted e-mails
}

我首先像这样添加了deleteDir()

} finally {
if (successful) {
notifyBuild('SUCCESS')
} else {
notifyBuild('FAILED')
}
node('libvirt') {
deleteDir()
}
}

它会引发错误并使构建失败。

然后我添加了一个像这样的cleanWs()

} finally {
if (successful) {
notifyBuild('SUCCESS')
} else {
notifyBuild('FAILED')
}
node('libvirt') {
cleanWs()
}
}

输出为

Running on node in /srv/jenkins/workspace/pipeline-deletedir-DRD7EKBEMMWJQZW6KKMQVVBTJTPTKLRAE2ITDK7V7IB5PTFXZUZA
[Pipeline] {
[Pipeline] step
[WS-CLEANUP] Deleting project workspace...[WS-CLEANUP] done
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

但目录/srv/jenkins/workspace/pipeline-deletedir-DRD7EKBEMMWJQZW6KKMQVVBTJTPTKLRAE2ITDK7V7IB5PTFXZUZA 仍然存在。

我正在寻找任何解决方案来适应此脚本化管道(以及声明式管道,如果您知道如何的话),以便能够删除构建创建的所有目录。

最佳答案

解决方案是在 stage("$job_name - Build") 步骤中添加 try/catch/finally ,类似于

gitlabCommitStatus('build') {
stage("$job_name - Build") {
try {
sh "./bin/build.sh ${job_name}"
} catch (Exception e) {
raise e
} finally {
deleteDir()
}
}
}

这不会删除所有涉及的目录(因为 Jenkins 问题 https://issues.jenkins-ci.org/browse/JENKINS-41805 ),但会删除所有大量目录(包含 code/build/artifacts...)。

您需要添加“raise e”,否则构建将始终返回 Success,即使其中一个失败。

关于Jenkins多分支管道: clean workspace/delete directory when build ends,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44949165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com