将 Jenkins 配置为在构建时根据构建参数以编程方式确定从属?

Configuring Jenkins to programmatically determine slave at build time from build parameter?

这可能是一个稍微不寻常的 Jenkins 查询,但我们有一个跨越许多项目的项目。它们都基于 Linux,但它们跨越多个架构(MIPS、SPARC、ARMv6、ARMv7)。

对于一个特定的组件,我们称之为 'video-encoder',因此我们将有 4 个项目:mips-video-encoder、sparc-video-encoder 等

每个项目都建立在 4 个独立的从设备上,带有与其架构相关的标签,即 MIPS 从设备具有标签 'mips' 'linux'。

我的目标是:

  1. 整合我们所有的独立工作。这应该使我们更容易修改作业属性,也更容易添加更多作业,而无需重复添加这么多特定于体系结构的作业。
  2. 允许我们一次只构建一个架构,如果我们愿意的话。如果 MIPS 作业失败,我们希望只为 MIPS 而不是为其他人构建。

我查看了 'Multi-configuration' 类型的作业——目前我们只使用简单的单一配置作业。我不确定多配置类型是否允许我们一次只构建单独的架构。我玩过配置矩阵,但不确定是否可以更改/修改它以仅构建一个 single 平台。看起来我可以使用 Groovy 语句来做到这一点?类似于:

(label=="mips".implies("slave"=="mips")

也许这可以简化为类似 slave == label 的东西,其中 label 是作业在其单一配置状态时的前名称,现在是构建参数?

我在想,如果我们可以为此以编程方式选择从站,那么我们不需要多配置作业。

我将非常感谢关于我们如何整合我们拥有的作业数量并根据作为构建参数的项目体系结构以编程方式更改目标从站的建议。

非常感谢,

您可以使用系统 groovy 脚本进行包装作业。为此,您需要 groovy 插件。让我们调用包装作业 - video-encoder-wrapper,这里是如何配置它的要点:

  • 定义参数ARCH
  • 通过步骤Execute system Groovy script

    根据ARCH参数给video-encoder作业分配标签
    import hudson.model.*
    encoder=Hudson.instance.getItem('video-encoder')
    def arch =build.buildVariableResolver.resolve("ARCH")
    label= Hudson.instance.getLabel(arch)
    encoder.setAssignedLabel(label)
    
  • 调用非阻塞下游工程video-encoder,不要忘记传递ARCH参数

  • 检查 video-encoder 作业配置中的选项 Set Build Name 并将其设置为 ${ENV,var="ARCH"} - #${BUILD_NUMBER}。它将允许您轻松跟踪构建历史。
  • 禁用 video-encoder-wrapper 作业的并发构建。它将防止同时将 2 个不同的标签分配给 video-encoder 作业

希望对您有所帮助