Jenkins限流构建生成多个自定义工作区,如何确保仅用单个工作区?
我们已将构建任务配置为每个节点最多运行1个并发构建,并在节点代理配置中设置了customworkspace。但经过一段时间运行后,发现Jenkins工作区目录中生成了多个工作区,执行ls命令显示如下:
$ ls bazel-workspace bazel-workspace@2 bazel-workspace@tmp bazel-workspace@2@tmp
请问是否存在其他可配置项,能够确保始终仅使用单个工作区?
当前配置信息
全局限流配置
全局配置中设置了每个节点的最大并发构建数为1。
Jenkinsfile配置
pipeline { agent { node { label 'bazel-worker' customWorkspace 'bazel-workspace' } } options { disableConcurrentBuilds(abortPrevious: !isMainline()) throttleJobProperty( categories: ['bazel-build'], throttleEnabled: true, throttleOption: 'category' ) } }
流水线有效配置
流水线的有效配置中,已禁用并发构建,且启用了类别级别的限流策略。
出现带@2、@tmp后缀的多工作区,通常是Jenkins在处理构建中断、重试或临时文件操作时自动创建的——即便限制了单节点并发,仍可能因构建意外中止、插件隐式创建临时目录等场景触发。
要确保始终使用单个工作区,可通过以下配置实现:
1. 关闭临时目录清理行为
进入Jenkins全局配置(Manage Jenkins > Configure System),找到Workspace Cleanup相关设置,取消勾选“使用临时目录进行清理”(不同版本表述可能略有差异),强制清理操作直接在目标工作区内执行,避免生成@tmp后缀目录。
2. 添加工作区锁定策略
安装Workspace Lock Plugin,在流水线中添加工作区锁定配置,确保同一时间只有一个构建实例占用目标工作区:
pipeline { agent { node { label 'bazel-worker' customWorkspace 'bazel-workspace' } } options { disableConcurrentBuilds(abortPrevious: !isMainline()) throttleJobProperty( categories: ['bazel-build'], throttleEnabled: true, throttleOption: 'category' ) // 新增工作区锁定配置 lock(resource: 'bazel-workspace-lock', inversePrecedence: true) } }
该插件会锁定指定工作区资源,阻止任何并行的工作区创建操作。
3. 调整节点代理的工作区模式
进入节点代理配置页面(Manage Jenkins > Nodes > 目标节点 > Configure),找到Workspace Root Directory设置,选择“使用固定工作区”(而非默认的“唯一工作区”),确保该节点上的所有任务复用同一个指定工作区目录。
4. 添加构建后清理步骤
在流水线末尾添加工作区清理步骤,构建完成后自动清理临时文件,避免@tmp或@2目录残留积累:
pipeline { // 原有配置... post { always { cleanWs(deleteDirs: true, notFailBuild: true) } } }
需提前安装Workspace Cleanup Plugin才能使用cleanWs步骤。
内容的提问来源于stack exchange,提问作者xiaoyi

