将管道阶段限制为特定共享资源的最直接方法是什么?

What is the most straightforward way to restrict pipeline stages to a specific shared resource?

我们有一个现有的 Jenkins 安装,它正在嵌入式 tart 上测试固件 运行ning。多阶段管道看起来像:Checkout -> Build -> Download -> 冒烟测试 -> 单元测试。这很好用,只是 运行 管道需要 9 个小时。为了加快速度并测试不同的目标变体,我们向系统添加了 3 个以上的目标(UUT#1、#2 等)。

我的问题是,允许并行化同时将套件限制为具有特定属性的 UUT 的最直接方法是什么。例如,我们的 单元测试 包含大约 10 个不同的套件(suite1 suite2 等等),我想做的是将它们分散在 4 个 UUT 中(因此有 4 个套件运行一次 ning)但以这种方式限制执行:

.. 等等,那么我的 UUT 可能具有如下属性:

等等

阅读有关代理的内容,似乎代理上的 label 可能允许这样做,但代理似乎会带来很多开销,我不确定它们是否合适。

Jenkins 的长期用户,但这是我第一次尝试如此复杂的事情,管道对我来说是一个新概念。

一种直接的方法是使用 Lockable Resources plugin

这可以用作步骤和阶段选项(未记录)。如果您有嵌套阶段,而这些阶段都依赖于要锁定的资源,后者会派上用场。

声明性管道中的阶段选项

pipeline {
    agent any

    stages {
        stage('Test') {
            options {
                // Lock a single resource from all resources labeled 'mylabel'
                lock( label: 'mylabel', 
                      quantity: 1,
                      variable: 'MyResourceName' )
            }
            steps { // or 'parallel' or 'stages'
                echo "Locked resource $MyResourceName"
                sleep 10
                echo "Resource will be unlocked after this stage"
            }
        }
    }
}

脚本管道中的步骤

node {
    stage('Test') {
        lock( label: 'mylabel', 
              quantity: 1,
              variable: 'MyResourceName' ) {

            echo "Locked resource $MyResourceName"
            sleep 10
            echo "Resource will be unlocked after this stage"
        }
    }
}

注意事项

  • 如果lock被用作声明管道中的一个步骤,你可能会得到一个错误:

    Missing required parameter: "resource"

    这似乎是参数检查中的一个小错误。根据文档,您只需指定 resourcelabel 参数。只需传递 null 作为此参数的值。

  • 如果未指定参数quantity,则所有匹配给定标签的资源都将被锁定。