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

时间:2018-05-15 11:58:53

标签: jenkins jenkins-pipeline

在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插件(我不知道哪个版本特别感兴趣)。

3 个答案:

答案 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变量,以便您可以控制它,以便使用与前一个节点范围完全相同的工作空间。

我希望它有所帮助