一尘不染

Jenkins管道构建如何确定工作空间文件夹?

jenkins

在Jenkins管道中,当在特定节点上运行构建时,会在该代理上分配工作区。我们没有设置工作空间路径,因此它是自动确定的。我了解,当同一作业在同一代理上同时运行时,工作空间必须包含执行程序编号以隔离构建。

但是…工作空间路径究竟是如何构建的?

我们的构建被分配给一个特定的节点(具有4个执行程序),并且被配置为不允许并行构建。通常分配给它:

EXECUTOR_NUMBER=1
WORKSPACE=xxx\yyy\jobname

在某个时候,该构建开始在执行程序2上运行,但仍使用与以前相同的工作空间。

稍后,该构建再次在执行程序1上运行,但现在使用

WORKSPACE=xxx\yyy\jobname@2

由于无法处理路径中的“ @”符号,因此中断了构建。从那时起,即使将构建计算机上的执行程序的数量设置为1,手动删除代理的工作区目录等,构建仍继续使用该工作区。

所以我的问题是:

  • 如何确定工作空间路径?为什么突然出现@ 2后缀?
  • Jenkins是否重新使用先前的工作空间,而不管执行者的编号是多少?
  • 如果是这样,此信息存储在哪里?我在与上次使用的工作空间路径相关的作业配置中找不到任何内容…

感谢您的任何见解!

我们正在使用Jenkins LTS 2.107.2和最新的Pipeline插件(我不知道哪个版本特别有趣)。


阅读 269

收藏
2020-07-25

共1个答案

一尘不染

工作区分配在WorkspaceList.java中完成。

在工作空间上可能会获得一些锁,这些锁随后会导致@<number>后缀,请参见allocate指出最后This method doesn't block prolonged amount of time. Whenever a desired workspace is in use, the unique variation is added.检查COMBINATOR变量的方法。

如果这确实是一个大问题,那么您可以自己编译jenkins并更改此分隔符。减少麻烦的可能是自己分配工作区,即在选择自己的路径时以某种方式检查它们是否未使用(或使用一些时间戳后缀),但要注意,此分隔符还用于其他可能使用的路径,例如使用全局共享库,这些使用类似workspace@script等的路径。

编辑:错过了您的其他问题。如您在此源文件中所看到的,执行器编号与工作空间命名无关。唯一理由是,当一些锁是基础工作空间的路径上没有后缀的+号(inUse.get(candidate.getRemote());。所以一旦工作区是INUSE它只是检查下一个候选与@n+1
据我所知,詹金斯将重用的工作空间。根据你的供应链结算策略,你可能甚至考虑在使用deleteDir进行构建之前手动清理工作区,以确保不会产生副作用。

2020-07-25