提出了与旧版本的Lockable Resources Plugin有关的问题。自2.1版以来,旧版本中的错误已得到修复。
但是,没有描述如何在自由式作业中正确使用Groovy表达式的答案。我将添加一个答案来解释这一点。
对于感兴趣的人,最初的问题如下:
我最初尝试获取可锁定资源插件来锁定特定资源,同时还要评估系统环境变量的值。评估系统环境变量是否运行良好,但是,我似乎无法锁定正确的资源。
在自由样式项目中使用时,这个问题集中在锁定问题上!
我创建了三个资源,分别称为 A_TEST , B_TEST 和 C_TEST 。它们都没有标签。从我的 Jenkins_URL / lockable-resources / 中都可以看到它们,可以在不出现任何问题的情况下将它们获取和释放。
在我的Jenkins Job配置中,我选择了“ 此构建需要可锁定的资源” 选项,该选项使我可以指定 Resource , Label 或 Groovy Expression (以及 Additional classpath )。此外,它还允许我指定“ 预留资源”变量名称 和 “要请求的资源数” 。
根据文档,Groovy脚本必须返回一个布尔值,因此我决定尝试一下:
我所做的第一个测试是通过设置以下内容来验证基本功能:
这导致作业在B_TEST资源上执行锁定。控制台输出为:
[lockable-resources]在[B_TEST]获得了锁定
在此测试中,我设置了以下内容:
尝试执行作业时,这将 错误地 永久等待以下文本:(pending--Waiting for the resourced [B_TEST])
(pending--Waiting for the resourced [B_TEST])
这导致 错误的 资源 A_TEST 被锁定。控制台输出为:
[lockable-resources]在[A_TEST]获得了锁定
重读在插件每个选项的帮助下,我发现这个插件显然只允许我指定 任何 一个 资源 , 标签 或 Groovy的表达 在这个测试中,我设置以下这样:
这导致作业执行 错误, 而没有锁定任何资源。控制台输出为:
[lockable-resources]已获得对[]的锁定
因此,在此测试中,我设置了以下内容:
这导致作业 错误地 锁定了所有资源。控制台输出为:
[lockable-resources]已获得对[A_TEST,B_TEST,C_TEST]的锁定
根据该插件的文档,在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'),但这在工作尝试开始时主要导致更多的混乱和错误,例如:
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(){ }调用似乎只适合在捕获期间获取和释放锁。
lock(){ }
现在最大的问题是,所有这些实际上如何工作?我的猜测是,在某处有一个常规命令指定要保留的资源/标签,并且返回值(true / false)确定是否实际获取锁定。我曾尝试深入探究消息来源,但没有任何运气。
任何答案都将不胜感激。
情况1:使用资源名称本身
您只需要在“资源”中列出所需的资源。
情况2:来自构建参数的资源名称
Groovy表达式:已检查
Groovy脚本:’resourceName == buildParam1 || resourceName == buildParam2’