在Jenkins管道中,当在特定节点上运行构建时,将在该代理上分配工作区。我们不设置工作空间路径,因此它会自动确定。据我所知,当同一个作业在同一个代理上同时运行时,工作空间必须包含执行者编号以隔离构建。
但是......工作空间路径究竟是如何构建的?
我们的构建分配给特定节点(具有4个执行程序),并配置为不允许并发构建。通常它被分配:
EXECUTOR_NUMBER=1
WORKSPACE=xxx\yyy\jobname
在某些时候,构建开始在执行程序2上运行,但仍然使用与以前相同的工作区。
稍后,构建再次在执行程序1上运行,但现在使用
WORKSPACE=xxx\yyy\jobname@2
打破了构建,因为它无法处理' @'签到路径。从那时起,即使在构建计算机上将执行程序数设置为1之后,构建仍继续使用该工作空间,手动删除代理程序的工作空间目录等。
所以我的问题是:
感谢您的任何见解!
我们正在使用Jenkins LTS 2.107.2和最新的Pipeline插件(我不知道哪个版本特别感兴趣)。
答案 0 :(得分:5)
工作空间分配在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并更改此分隔符。减少麻烦的可能是自己分配工作区,即在选择自己的路径时以某种方式检查它们是否未使用(或使用一些时间戳后缀),但要注意,此分隔符还用于其他可能使用的路径,例如使用Global Shared Libraries,该路径使用workspace@script
等路径。
编辑:错过了您的其他问题。如您在此源文件中所看到的,执行器编号与工作空间命名无关。唯一的原因是基本工作区路径上有一些没有后缀+数字(inUse.get(candidate.getRemote());
的锁。因此,一旦使用了工作区,它将仅使用@n+1
检查下一个候选对象。
据我所知,詹金斯将重用工作空间。根据您的scm签出策略,您甚至可以考虑在使用deleteDir构建之前手动清理工作区,以确保不会产生副作用。
答案 1 :(得分:1)
无需使用“ hudson.slaves.WorkspaceList”属性重新编译Jenkins,就可以手动更改工作空间后缀分隔符(即@)的默认值(有关详细信息,请参见this article)。即在Debian中,我在/ etc / default / jenkins中将此行更改为“-”:
JAVA_ARGS="-Djava.awt.headless=true -Dhudson.slaves.WorkspaceList=-"
答案 2 :(得分:0)
工作空间不应影响您的管道脚本。
在我刚刚完成的工作中
def workspace = pwd()
在节点范围的开头,并将工作空间用作变量,它就像魅力一样。
如果您打开一个新的节点范围,您应该知道它可能使用不同的工作区文件夹。 打开一个目录范围:
dir (worspace){
do something
}
使用workspace变量,以便您可以控制它,以便使用与前一个节点范围完全相同的工作空间。
我希望它有所帮助