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

Jenkins管道构建如何确定工作区文件夹?,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,在Jenkins管道中,在特定节点上运行构建时,会在该代理上分配一个工作区。我们没有设置工作区路径,因此它是自动确定的。我理解,当同一作业在同一代理上并发运行时,工作区必须包含执行器编号,以隔离构建 但是。。。工作区路径是如何构造的 我们的构建被分配给一个特定的节点(有4个执行器),并且被配置为不允许并发构建。通常分配给: EXECUTOR_NUMBER=1 WORKSPACE=xxx\yyy\jobname 在某个时刻,构建开始在executor 2上运行,但仍然使用与以前相同的工作区 后来

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

但是。。。工作区路径是如何构造的

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

EXECUTOR_NUMBER=1
WORKSPACE=xxx\yyy\jobname
在某个时刻,构建开始在executor 2上运行,但仍然使用与以前相同的工作区

后来,构建再次在executor 1上运行,但现在使用

WORKSPACE=xxx\yyy\jobname@2
它破坏了生成,因为它无法处理路径中的“@”符号。从那时起,构建继续使用该工作区,即使在将构建机器上的执行者数量设置为1、手动删除代理的工作区目录等之后也是如此

因此,我的问题是:

  • 如何准确地确定工作区路径?为什么突然有了@2后缀
  • Jenkins是否重复使用以前的工作区,而不考虑执行者编号
  • 如果是,这些信息存储在哪里?我在作业配置中找不到与上次使用的工作区路径相关的任何内容
谢谢你的见解


我们使用的是Jenkins LTS 2.107.2和最新的管道插件(我不知道哪个版本特别受关注)。

工作空间不应该影响管道脚本

在我的工作中,我就是这么做的

def workspace = pwd()
在节点作用域的开始处,使用工作空间作为变量,它就像一个符咒

如果打开新的节点作用域,您应该知道它可能使用不同的工作区文件夹。 只需打开一个目录范围:

dir (worspace){
 do something
}
使用workspace变量,以便可以控制它,以便使用与上一个节点作用域完全相同的工作空间


我希望这会有所帮助

工作区分配在中完成

工作区上可能会获得锁,然后会产生
@
后缀,请参阅
分配
方法,该方法声明
此方法不会阻止延长的时间。无论何时使用所需的工作空间,都会添加唯一的变体。
查看末尾的
COMBINATOR
变量

如果这真的是一个大问题,您可以自己编译jenkins并更改此分隔符。更少的麻烦可能是自己分配工作区,即选择自己的路径,同时检查它们是否未被使用(或使用某些时间戳后缀),但请注意,此分隔符也用于可能使用的其他路径,即使用
workspace@script

编辑:错过了你的其他问题。正如您在这个源文件中看到的,执行器编号与工作区命名无关。唯一的原因是,当某个锁位于基本工作区路径上时,没有后缀+数字(
inUse.get(candidate.getRemote());
。因此,一旦工作区被使用,它只需使用
@n+1

据我所知,詹金斯将重用工作区。根据您的SCM签出策略,您甚至可以考虑在构建之前手动清理工作区,以确保不会产生副作用。工作空间后缀分隔符(即@)的默认值可以手动更改,而不必重新编译詹金斯。“hudson.slaves.WorkspaceList”属性(有关详细信息,请参阅)。例如,在Debian中,我已将其更改为“-”,并在/etc/default/jenkins中使用此行:

JAVA_ARGS="-Djava.awt.headless=true -Dhudson.slaves.WorkspaceList=-"

当然,ExcutoRoSo号和工作区是詹金斯设置的属性,而不是我们的脚本。因此,詹金斯选择了一些未知的规则将“@”符号添加到工作区,这很不幸地影响了构建(一些遗留的构建脚本认为这是一个路径分隔符)。。我们正在使用声明性管道。顺便说一句,我的管道我更喜欢自己设置,这样我就可以控制它。输入错误-
dir(worspace)
;缺少“k”,但S/O不允许我保存编辑