当前位置: 首页 > 知识库问答 >
问题:

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

南宫阳冰
2023-03-14

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

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

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

EXECUTOR_NUMBER=1
WORKSPACE=xxx\yyy\jobname

在某个时刻,构建开始在executor 2上运行,但仍然使用与以前相同的工作区。

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

WORKSPACE=xxx\yyy\jobname@2

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

因此,我的问题是:

  • 如何准确地确定工作区路径?为什么突然有了@2后缀

谢谢你的见解!

我们用的是詹金斯LTS 2.107。2和最新的管道插件(我不知道哪个版本特别有趣)。

共有3个答案

南门焱
2023-03-14

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

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

def workspace = pwd()

在节点作用域的开始,使用工作区作为变量,它像一个魅力一样工作。

如果你打开一个新的节点范围,你应该知道它可能使用一个不同的工作区文件夹。

dir (worspace){
 do something
}

使用workspace变量,以便可以控制它,以便使用与上一个节点作用域完全相同的工作空间。

我希望有帮助

潘青青
2023-03-14

可以手动更改工作区后缀分隔符(即@)的默认值,而无需使用hudson.slaves.WorkspaceList属性重新编译Jenkins(详情请参阅本文)。也就是说,在Debian中,我把它改成了-,这一行 /etc/default/jenkins:

JAVA_ARGS="-Djava.awt.headless=true -Dhudson.slaves.WorkspaceList=-"
轩辕华辉
2023-03-14

工作空间分配在工作空间列表中完成。JAVA

可以在工作区上获取锁,然后导致@

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

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

 类似资料:
  • 问题内容: 在Jenkins管道中,当在特定节点上运行构建时,会在该代理上分配工作区。我们没有设置工作空间路径,因此它是自动确定的。我了解,当同一作业在同一代理上同时运行时,工作空间必须包含执行程序编号以隔离构建。 但是…工作空间路径究竟是如何构建的? 我们的构建被分配给一个特定的节点(具有4个执行程序),并且被配置为不允许并行构建。通常分配给它: 在某个时候,该构建开始在执行程序2上运行,但仍使

  • 我们现在正在试验多分支管道构建。该功能的主要优点是,它允许我们在创建新分支时自动创建新的Jenkins工作。 然而,它也比选择如何使用用户界面进行构建的旧方法更难实现。另外,某些功能似乎丢失了。 例如,在Jenkins Freestyle作业中,我们可以使用Jenkins UI浏览工作区,下载单个文件,甚至删除工作区。我们发现,当构建出错或开发人员需要未归档的特定构建资产时,这一点很有用。 我注意

  • 问题内容: 我们正在运行Jenkins 2.x,并且喜欢新的Pipeline插件。但是,由于存储库中有如此多的分支,因此磁盘空间会迅速填满。 是否有任何与Pipeline兼容的插件,我可以在成功构建后清除工作空间? 问题答案: 您可以将其用作管道Jenkinsfile的最后一步(假设您没有更改工作目录)。

  • 我正在尝试从管道中自动创建Jenkins管道构建。 我有一个管道,它创建一个比特桶存储库并向其提交一些代码,包括一个Jenkinsfile。 我需要向此管道添加另一个步骤,然后为其创建管道生成,这将运行 Jenkinsfile 中的步骤。 我认为Jobs DSL应该能够处理这一点,但我找到的文档非常稀少,我仍然不完全确定是否有可能或如何做到这一点。 任何帮助都将不胜感激。我想生成的Pipeline

  • 我从Jenkins管道开始,我想从任何jenkins目录外部复制一些视频文件到我的作业工作区目录。我正在使用文件操作插件为我的其他作业执行一些文件操作。有了这个插件,我可以将文件从我的工作区内部复制到外部: 例如,通过这一步,我可以将位于我的工作区中的4个视频文件复制到位于另一个磁盘中的上述目录中。 但我想做相反的事。我想将视频文件从另一个磁盘的源目录复制到工作区。我尝试了几种方法,但似乎“inc

  • 我希望在我的Jenkinsfile中添加一个条件阶段,该阶段根据构建的触发方式运行。目前,我们设置为构建由以下方式触发: 对 git 存储库的更改,这些更改是在分支索引中选取的 用户使用 UI 中的“立即生成”按钮手动触发生成。 是否有任何方法可以根据这些操作中的哪些操作触发了构建来运行不同的管道步骤?