(我在这里和其他地方看到了一些涉及 NodeLabel 插件来解决类似问题的建议,但还没有找到一个可靠的例子来说明如何为此目的实际使用 NodeLabel。)
现在,gerrit 触发器基于我的一个项目的 git 存储库中的给定分支开始构建。
这将创建一个父作业 P,它使用参数化触发器插件在具有两个不同操作系统(X1 和 Y1)的两个从属设备上生成另外两个项目构建(由两个标签标识)。
明天,我要为 Y2 构建一个新版本的 Y1,而 X1 已被弃用。我可以在代码的 git 存储库中识别此版本代码的有效目标。
那时我有一个父节点 (P) 和三个节点类型 (X1, Y1 Y2) 来处理。由于分支,我还必须支持构建遗留代码(用于 X1 和 Y1)或新代码(仅限 Y2)的能力。
我可以创建另一个作业 Y2(它与 Y1 相同,除了节点类型将构建限制为使用静态标签),然后在每个子作业执行期间我可以决定是否提前中止作业(不推荐使用的目标) 或执行该构建。但是,每次构建时,我现在都会获得四个 git 克隆,为 git 服务器添加冗余负载和流量:一个用于父级,一个用于每个目标,包括在第一个“执行 shell”步骤中我可能确定已过时的两个!
这听起来可能不多,但是当我们进入 OS Y9 时,我们可以为一个给定的分支运行多达 10 个作业,其中 8 个是不需要的……这是站不住脚的。尽管最终会删除较旧的操作系统目标,但在任何给定时间都需要提供多个版本,即使给定构建只需要一个版本。
今天,我在 Jenkins 上为任何目标构建的第一个构建步骤使用“执行 shell”来收集有用的信息以传递给子作业。
但是,子作业在“触发器/调用在其他项目上构建->要构建的项目”字段中进行硬编码(以及其他重要设置,例如它们的阻塞方式和时间!)如果相反,我可以放置一个变量在那里(或以某种方式引用我以编程方式设置的变量),我可以简单地在它之前的 shell 步骤中设置该变量,然后它会完全填充它需要的子项目!子项目“知道”它们被允许在哪些节点/节点组上执行。
简而言之,我的项目执行一个脚本,该脚本设置了一个变量,该变量定义了要调用的子项目,就像我为此构建编辑了配置一样(例如,MY_PROJ_TO_BUILD="X1 Y1" 填充了“要构建的项目” “ 场地)。下一步继续以通常的方式构建这些子项目。这就是我需要它做的所有事情,而且肯定不会丢失任何当前功能,也不会直接入侵 Jenkins。(由于这些是由 gerrit 触发的,因此运行多个版本的 gerrit 和/或 Jenkins 也不是一个可行的选择。)
已经提到过 NodeLabel,但我还没有看到如何有效地使用它来解决这类问题的示例(我看到的示例非常模糊)。因此,如果您有一个符合要求的示例或指向一个示例,我将很高兴看到它。同样,如果您有不同的想法/解决方案,我很高兴听到它。我可以想象为什么我希望工作的一些原因(“要构建的项目”字段中的变量子)没有,也可能不能,但肯定会运行大量不必要的克隆来确定给定目标的一小部分分支的构建也不是最佳的。
(注意:这是针对一个项目/回购......实际上我正在处理几十个,我不得不说为每个创建几个相同但针对节点类型的他们运行子项目一个本身就是一场闹剧......但这是我迄今为止发现的唯一方法,当可能需要为给定的分支构建构建多个目标时,它可以确保向后构建兼容性。)