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

ami*_*ami 6 jenkins jenkins-pipeline

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

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

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

EXECUTOR_NUMBER=1
WORKSPACE=xxx\yyy\jobname
Run Code Online (Sandbox Code Playgroud)

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

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

WORKSPACE=xxx\yyy\jobname@2
Run Code Online (Sandbox Code Playgroud)

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

所以我的问题是:

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

感谢您的任何见解!

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

Dom*_*art 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并更改此分隔符。减少麻烦的可能是自己分配工作区,即在选择自己的路径时以某种方式检查它们是否未使用(或使用一些时间戳后缀),但要注意,此分隔符还用于其他可能使用的路径,例如使用全局共享库,这些使用类似workspace@script等的路径。

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