将管道阶段限制为特定共享资源的最直接方法是什么?
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)但以这种方式限制执行:
- Suite1 只能 运行 在具有“USB”
的 UUT 上
- Suite2 只能 运行 在具有“LCD 显示屏”
的 UUT 上
- Suite3 可以运行任何地方
.. 等等,那么我的 UUT 可能具有如下属性:
- UUT#1‘USB LCD 显示器’
- UUT#2“以太网”
- UUT#3‘RS-232 USB’
等等
阅读有关代理的内容,似乎代理上的 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"
这似乎是参数检查中的一个小错误。根据文档,您只需指定 resource
或 label
参数。只需传递 null
作为此参数的值。
如果未指定参数quantity
,则所有匹配给定标签的资源都将被锁定。
我们有一个现有的 Jenkins 安装,它正在嵌入式 tart 上测试固件 运行ning。多阶段管道看起来像:Checkout -> Build -> Download -> 冒烟测试 -> 单元测试。这很好用,只是 运行 管道需要 9 个小时。为了加快速度并测试不同的目标变体,我们向系统添加了 3 个以上的目标(UUT#1、#2 等)。
我的问题是,允许并行化同时将套件限制为具有特定属性的 UUT 的最直接方法是什么。例如,我们的 单元测试 包含大约 10 个不同的套件(suite1 suite2 等等),我想做的是将它们分散在 4 个 UUT 中(因此有 4 个套件运行一次 ning)但以这种方式限制执行:
- Suite1 只能 运行 在具有“USB” 的 UUT 上
- Suite2 只能 运行 在具有“LCD 显示屏” 的 UUT 上
- Suite3 可以运行任何地方
.. 等等,那么我的 UUT 可能具有如下属性:
- UUT#1‘USB LCD 显示器’
- UUT#2“以太网”
- UUT#3‘RS-232 USB’
等等
阅读有关代理的内容,似乎代理上的 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"
这似乎是参数检查中的一个小错误。根据文档,您只需指定
resource
或label
参数。只需传递null
作为此参数的值。如果未指定参数
quantity
,则所有匹配给定标签的资源都将被锁定。