Jenkins 管道和大量并行步骤

Jenkins Pipeline and huge amount of parallel steps

我已经在整个互联网上搜索了 2 周,在 freenode IRC 和 Jenkins 用户组邮件列表中询问了这个问题,但没有得到答案,所以我在这里,你是我最后的希望(没有压力)

我有一个 Jenkins 脚本管道,它生成数百个并行分支,这些分支必须在数百个从节点上同时 运行。目前看来 Jenkins BlueOcean 用户界面不适合那个。我们到达了无法显示所有步骤的地步。

我需要提供一些背景知识让您了解我们的需求:我们公司有一个庞大的项目,其中有数千个 Behat/Selenium,现在 运行 需要 30 多小时如果按顺序进行。前段时间我们实施了一个基本解决方案,我们使用队列系统 (RabbitMq) 来存储所有测试和 运行 测试的消费者,方法是从 Jenkins 下载源代码并将工件上传回 Jenkins,但这是不像 Jenkins 本机奴隶那样可扩展,而且它不够可维护(例如,我们没有从实时输出日志和使用统计中受益)。

我知道有一个未解决的问题描述了这里的问题:https://issues.jenkins-ci.org/browse/JENKINS-41205 但是,基本上,我需要一个在下周工作的解决方法(我们的开发团队正在等待这个新管道很长时间现在)。

我们的管道目前看起来像这样:

Build --- Unit Tests --- Integration Tests --- Functional Tests ---
                |                |                    |
              tool A            suite A        matrix-A-A-batch 0
              tool B            suite B        matrix-A-A-batch 1
              tool C                           matrix-A-A-batch 2
                                               matrix-A-A-batch 3
                                                     ....
                                              "Unable to display more"

您可以在这里找到我们 Jenkinsfile 的完整版本:https://github.com/willy-ahva/pim-community-dev/blob/086e4ed48ef1a3d880ca16b6f5572f350d26eb03/Jenkinsfile(它可能看起来很复杂,但基本上,真正的问题是 "Functional Tests" 阶段)

我的问题是:

  1. 我使用并行的方式好吗?
  2. 这只是一个 Jenkins/BlueOcean 问题,我应该为我链接的问题做出贡献吗? (如果是,怎么办?我根本不是 Java 开发人员)
  3. 我应该尝试使用 MultiJob 并并行化作业而不是步骤吗?
  4. 除了 parallel 之外,还有其他工具可以使用吗? (某种叉子或其他)?

非常感谢您的帮助。我喜欢 Jenkins 通过 Pipeline 和 BlueOcean UI 取得的成果,我真的想让它在我们的团队中发挥作用。

  1. 这可能不是执行并行任务的好方法。相反,我会将每个并行映射条目视为一个工作人员,并将您的测试放入队列/堆栈/数据结构中。每个工作线程都可以根据需要从队列中弹出,然后您就不会坐在那里等待一百万个任务。您必须更加小心地记录日志,以便清楚地知道哪个测试失败了,但这应该不会太难。
  2. 这可能不是一件容易修复的事情,因为它与其他任何问题一样都是 UI 设计问题。不过,我建议您戳一下!谁知道呢,也许有适合您的解决方案?
  3. 可能不会。在我看来,这使它变得更加混乱
  4. 并行是您分叉的选项。

如果你真的想继续这样做,但又不想让 UI 变得如此怪异,你可以停止将每个测试定义为一个阶段。当一个人失败时,会不太清楚什么失败了,但 UI 应该更快乐。