【问题标题】:How do Jenkins pipeline builds determine the workspace folder?Jenkins 管道构建如何确定工作区文件夹?
【发布时间】:2018-10-25 06:05:21
【问题描述】:

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

【问题讨论】:

    标签: jenkins jenkins-pipeline


    【解决方案1】:

    工作空间分配在WorkspaceList.java 中完成。

    可能会在工作区上获取锁,然后导致@<number>suffix,请参阅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 手动清理工作区,以确保不会产生副作用。

    【讨论】:

      【解决方案2】:

      可以手动更改工作区后缀分隔符(即@)的默认值,而无需使用“hudson.slaves.WorkspaceList”属性重新编译 Jenkins(有关详细信息,请参阅this article)。 IE。在 Debian 中,我在 /etc/default/jenkins 中使用这一行将其更改为“-”:

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

      【讨论】:

        【解决方案3】:

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

        在我的工作中,我只是做

        def workspace = pwd()
        

        在节点范围的开头并将工作区用作变量,它就像一个魅力。

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

        dir (worspace){
         do something
        }
        

        使用工作区变量,以便您可以控制它,以便使用与前一个节点范围完全相同的工作区。

        希望对你有帮助

        【讨论】:

        • 嗯,EXECUTOR_NUMBER 和 WORKSPACE 是 Jenkins 设置的属性,而不是我们的脚本。所以关键是 Jenkins 由于一些未知的规则而选择将“@”符号添加到工作区,不幸的是这确实影响了构建(一些旧的构建脚本认为这是一个路径分隔符)。顺便说一句,我们正在使用声明性管道。
        • 我的管道我更喜欢自己设置它以便我可以控制它。
        • 错字-dir (worspace);缺少“k”,但 S/O 不允许我保存编辑
        猜你喜欢
        • 1970-01-01
        • 2018-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多