这个问题与旧版Lockable Resources Plugin有关。自版本2.1以来,旧版本中的错误已得到修复。
但是没有描述如何在自由式作业中正确使用Groovy Expression的答案。我将添加一个答案来解释这一点。
原始问题如下:对于有兴趣的人:
我最初试图让Lockable Resources Plugin锁定特定资源,同时还评估系统环境变量的值。评估系统环境变量工作正常,但是,我似乎无法锁定正确的资源。
在自由式项目中使用时,这个问题集中在锁定问题上!
我创建了一个名为 A_TEST , B_TEST 和 C_TEST 的三种资源。他们都没有任何标签。它们都可以从我的 Jenkins_URL / lockable-resources / 中看到,在这些地方可以毫无问题地获取和发布它们。
在我的Jenkins作业配置中,我选择了此版本需要可锁定的资源选项,这样我就可以指定资源,标签或 Groovy Expression (以及其他类路径)。它还允许我指定预留资源变量名称和要请求的资源数量。
根据文档,Groovy脚本必须返回一个布尔值,所以我决定尝试一下:
我做的第一个测试是通过设置以下内容来验证基本功能:
这导致作业在B_TEST资源上执行锁定。控制台输出显示为:
[lockable-resources]获得[B_TEST]
的锁定
在这个测试中,我设置了以下内容:
尝试执行作业时,错误会永远等待文字:(pending--Waiting for the resourced [B_TEST])
在这个测试中,我设置了以下内容:
这会导致错误资源 A_TEST 被锁定。控制台输出显示为:
[lockable-resources]获得[A_TEST]
的锁定
重新阅读插件中每个选项的帮助后,我发现该插件显然只允许我指定 资源, 标签或 Groovy Expression 所以在这个测试中我设置了以下内容:
这会导致作业错误地而不会锁定任何资源。控制台输出显示为:
[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'
因此我开始尝试包含lock('B_TEST')
调用的变体的 Groovy脚本,但这会导致更多的混乱和错误,同时作业尝试启动,例如:< / p>
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(){ }
调用似乎只适合在捕获期间释放锁定。
现在最大的问题是,所有这些实际上是如何运作的? 我的猜测是某处有一个groovy命令来指定你想要保留的资源/标签,并且返回值(true / false)决定实际是否锁定。我试图潜入消息来源,但没有任何运气。
非常感谢任何答案。
答案 0 :(得分:1)
案例1:使用资源名称本身
您只需列出资源&#39;。
中所需的资源案例2:构建参数的资源名称
Groovy Expression:选中
Groovy脚本:&#39; resourceName == buildParam1 ||资源名称== buildParam2&#39;
答案 1 :(得分:0)
您可以简单地使用Groovy脚本: 例如,你可以写:
返回resourceName.contains(RESOURCELOCK)
并且您不需要设置任何其他字段(资源/标签)
鉴于RESOURCELOCK是一个参数。然后,您只需设置RESOURCELOCK的值并获取正确的锁。例如,如果RESOURCELOCK设置为A_TEST,则获取A_TEST。
答案 2 :(得分:0)
首先要警告。在此插件中调试Groovy非常困难,并且可以快速填充您的Jenkins日志。唯一的可能性是在脚本中使用println
,并且所有输出最终都将在jenkins日志中,因为它是在初始化作业控制台日志之前进行评估的。
作业调度程序连续调用该脚本,每次使用新的资源名称。该脚本的任务是评估资源名称,并返回 true 或 false 。如果满足所有其他预运行条件,则true将导致作业执行。
要测试特定资源,请在此处使用Printer1或Printer2:
if (resourceName.startsWith("Printer")) {
// println "Gotit"
return true
}
return false
要测试传递给作业的字符串参数,只需指定字符串参数名称:
if (resourceName.equals(SELECTED_PRINTER)) {
return true
}
return false