这个问题是针对旧版本提出的可锁定资源插件 https://wiki.jenkins-ci.org/display/JENKINS/Lockable+Resources+Plugin。旧版本中的错误自2.1版本以来已得到修复。
然而,没有描述如何在自由式作业中正确使用 Groovy 表达式的答案。我将添加一个答案来解释这一点。
对于那些有兴趣的人来说,原来的问题如下:
我最初试图获得可锁定资源插件 https://wiki.jenkins-ci.org/display/JENKINS/Lockable+Resources+Plugin锁定特定资源,同时评估系统环境变量的值。评估系统环境变量工作正常,但是,我似乎无法锁定正确的资源。
这个问题主要集中在自由式项目中使用时的锁定问题!
我创建了三个资源,名为A_TEST, B_TEST and C_TEST。他们都没有任何标签。他们都可以从我的Jenkins_URL/可锁定资源/可以毫无问题地带走和释放它们。
在我的 Jenkins 作业配置中,我选择了此构建需要可锁定的资源选项,它允许我指定一个Resource, Label or 常规表达 (and 附加类路径)。它还允许我指定保留资源变量名 and 请求的资源数量.
根据文档,Groovy脚本必须返回一个布尔值,所以我决定尝试一下:
Test 1
我做的第一个测试是通过设置以下内容来验证基本功能:
- 资源 = B_TEST
- Groovy 表达式 = 未选中
- 请求的资源数量 = 1
这会导致作业在 B_TEST 资源上被锁定而执行。控制台输出如下:
[可锁定资源] 已获取 [B_TEST] 上的锁定
Test 2
在这个测试中我设置了以下内容:
- 资源 = B_TEST
- Groovy 表达式 = 选中
- Groovy 脚本 =返回错误
- 请求的资源数量 = 1
当尝试执行作业时,这wrongly永远等待文本:(pending--Waiting for the resourced [B_TEST])
Test 3
在这个测试中我设置了以下内容:
- 资源 = B_TEST
- Groovy 表达式 = 选中
- Groovy 脚本 = 返回true
- 请求的资源数量 = 1
这导致wrong资源A_TEST被锁定。控制台输出如下:
[可锁定资源] 已获取 [A_TEST] 上的锁定
Test 4
在重新阅读插件中每个选项的帮助后,我发现该插件显然只允许我指定either a Resource, Label or 常规表达所以在这个测试中我设置了以下内容:
- Groovy 表达式 = 选中
- Groovy 脚本 = 返回false
- 保留资源变量名称 = MyResourceName
这会导致作业执行wrongly无需锁定任何资源。控制台输出如下:
[可锁定资源] 已获取 [] 上的锁定
Test 5
所以在这个测试中我设置了以下内容:
- Groovy 表达式 = 选中
- Groovy 脚本 = 返回true
- 保留资源变量名称 = MyResourceName
这导致了工作wrongly锁定所有资源。控制台输出如下:
[可锁定资源] 已获取 [A_TEST、B_TEST、C_TEST] 上的锁定
Test 6
根据插件的文档,在 Jenkins-Pipelines 中,该插件可以这样使用:
echo 'Starting'
lock('my-resource-name') {
echo 'Do something here that requires unique access to the resource'
// any other build will wait until the one locking the resource leaves this block
}
echo 'Finish'
所以我开始尝试Groovy 脚本包含的变体lock('B_TEST')
调用,但这通常会在作业尝试启动时导致更多混乱和错误,例如:
No signature of method: Script1.lock() is applicable for argument types: (java.util.LinkedHashMap) values: [[resource:B_TEST]]
Possible solutions: each(groovy.lang.Closure), wait(), run(), run(), any(), find())
但我想这一切都是有道理的,因为lock(){ }
call 似乎只适合在捕获期间获取和释放锁。
问题
现在最大的问题是,这一切实际上是如何运作的?
我的猜测是,某个地方有一个常规命令来指定您想要保留的资源/标签,并且返回值(true/false)决定是否实际获取锁定。我曾尝试深入研究源头,但没有任何运气。
任何答案都将不胜感激。