【问题标题】:Jenkins concurrent builds on docker slavesJenkins 在 docker slaves 上并发构建
【发布时间】:2020-09-04 01:06:09
【问题描述】:

我有一个带有 Docker 插件 (1.1.9) 和一个 docker 云 API 的 Jenkins 服务器 (2.204.1)。

我与 Jenkins docker 代理(奴隶)一起工作 我在容器和主机之间映射了 docker slave build 工作区,以便能够路径 工件到下游作业。

在 Jenkins 配置 - Docker 云详细信息 - 容器设置中:

Volumes /var/lib/jenkins:/var/lib/jenkins

这适用于单个构建,当我运行并发构建时问题就开始了, 它们都映射到 Docker 主机上的同一个工作区并相互干扰。 使用 docker slaves 并将工作空间映射为卷时,最佳做法是什么?

我不想在构建过程中使用 $CustomWorkspace 或应对工件,因为这很难管理和清除。 我更喜欢将 @2 添加到第二个并发构建的 Jenkins 常规从属方法,但这不是在 docker slaves 上运行并发构建时的行为

【问题讨论】:

    标签: jenkins jenkins-pipeline jenkins-plugins jenkins-docker


    【解决方案1】:

    一个远程 Jenkins 代理无法知道给定的工作区目录是否被同一台机器上运行的另一个代理使用。对于通过卷挂载共享公共目录的基于 docker 的代理也是如此。理想情况下,在同一台机器上工作的所有代理都可以通过某种方式相互交谈,以免踩到对方的脚趾(例如,工作区中的锁定文件在工作终止时被删除),但目前情况并非如此。

    解决方案 #1:独特的构建工作区

    如果我们使用 Jenkins 管道,我们可以在每个构建的基础上将一个唯一的子目录附加到工作区目录。此解决方案干净、简单且易于实施。

    agent {
        node {
            customWorkspace "${env.BUILD_NUMBER}"
        }
    }
    

    参考:https://www.jenkins.io/doc/book/pipeline/syntax/#agent

    解决方案 #2:唯一代理工作区

    如果这不可行或不可取,另一种可能的解决方案是更改 Jenkins 代理本身的根工作目录,这可以通过向代理的启动命令提供附加参数来完成:

    -workDir FILE : Declares the working directory of the
                    remoting instance (stores cache and logs by
                    default)
    

    来源:java -jar agent.jar -help

    当在同一台机器上动态启动多个代理时,我们可以将此 -workDir 值设置为更独特的值,以便为每个代理提供自己的工作目录,从而有效地减少工作区冲突。像这样的东西应该很好用:

    java -classpath agent.jar hudson.remoting.jnlp.Main -headless \
         -workDir /var/lib/jenkins/workspace/$(date +%3N) ...
    

    神奇之处在于$(date +%3N),它将系统时钟纳秒返回到三位精度。我们可能希望使用更多或更少的数字,因为有一个折衷:更高的精度将导致更高的工作空间目录的最大数量,但会降低工作空间冲突的风险;精度越低会产生相反的效果 - 目录越少,冲突风险越大。

    此命令的配置方式将根据您的 Jenkins 设置而有所不同。例如,我们在 Jenkins 2.249.3 上使用 Docker Swarm plugin (v1.9)。我们的代理命令可在 Manage Jenkins >> Manage Nodes and Clouds >> Configure Clouds >> Docker Swarm Cloud Configuration >> Docker Agent templates >> Command 进行配置。

    参考:https://man7.org/linux/man-pages/man1/date.1.html

    【讨论】:

      猜你喜欢
      • 2017-07-21
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      • 2018-01-23
      • 2020-10-18
      • 2023-03-03
      • 1970-01-01
      • 2021-09-01
      相关资源
      最近更新 更多