一尘不染

如何在Jenkins Freestyle项目中使用可锁定资源插件中的Groovy表达式

jenkins

提出了与旧版本的Lockable Resources Plugin有关的问题。自2.1版以来,旧版本中的错误已得到修复。

但是,没有描述如何在自由式作业中正确使用Groovy表达式的答案。我将添加一个答案来解释这一点。

对于感兴趣的人,最初的问题如下:

我最初尝试获取可锁定资源插件来锁定特定资源,同时还要评估系统环境变量的值。评估系统环境变量是否运行良好,但是,我似乎无法锁定正确的资源。

在自由样式项目中使用时,这个问题集中在锁定问题上!

我创建了三个资源,分别称为 A_TESTB_TESTC_TEST 。它们都没有标签。从我的 Jenkins_URL /
lockable-resources /
中都可以看到它们,可以在不出现任何问题的情况下将它们获取和释放。

在我的Jenkins Job配置中,我选择了“ 此构建需要可锁定的资源” 选项,该选项使我可以指定 ResourceLabel
Groovy Expression (以及 Additional classpath )。此外,它还允许我指定“
预留资源”变量名称“要请求的资源数”

根据文档,Groovy脚本必须返回一个布尔值,因此我决定尝试一下:

测试1

我所做的第一个测试是通过设置以下内容来验证基本功能:

  • 资源= B_TEST
  • Groovy表达式=未选中
  • 请求的资源数量= 1

这导致作业在B_TEST资源上执行锁定。控制台输出为:

[lockable-resources]在[B_TEST]获得了锁定

测试2

在此测试中,我设置了以下内容:

  • 资源= B_TEST
  • Groovy表达式=已检查
  • Groovy脚本= 返回false
  • 请求的资源数量= 1

尝试执行作业时,这将 错误地 永久等待以下文本:(pending--Waiting for the resourced [B_TEST])

测试3

在此测试中,我设置了以下内容:

  • 资源= B_TEST
  • Groovy表达式=已检查
  • Groovy脚本=返回 true
  • 请求的资源数量= 1

这导致 错误的 资源 A_TEST 被锁定。控制台输出为:

[lockable-resources]在[A_TEST]获得了锁定

测试4

重读在插件每个选项的帮助下,我发现这个插件显然只允许我指定 任何 一个 资源标签Groovy的表达
在这个测试中,我设置以下这样:

  • Groovy表达式=已检查
  • Groovy脚本=返回 false
  • 保留的资源变量名称= MyResourceName

这导致作业执行 错误, 而没有锁定任何资源。控制台输出为:

[lockable-resources]已获得对[]的锁定

测试5

因此,在此测试中,我设置了以下内容:

  • Groovy表达式=已检查
  • Groovy脚本=返回 true
  • 保留的资源变量名称= MyResourceName

这导致作业 错误地 锁定了所有资源。控制台输出为:

[lockable-resources]已获得对[A_TEST,B_TEST,C_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(){ }调用似乎只适合在捕获期间获取和释放锁。

问题

现在最大的问题是,所有这些实际上如何工作?我的猜测是,在某处有一个常规命令指定要保留的资源/标签,并且返回值(true /
false)确定是否实际获取锁定。我曾尝试深入探究消息来源,但没有任何运气。

任何答案都将不胜感激。


阅读 365

收藏
2020-07-25

共1个答案

一尘不染

情况1:使用资源名称本身

您只需要在“资​​源”中列出所需的资源。

情况2:来自构建参数的资源名称

Groovy表达式:已检查

Groovy脚本:’resourceName == buildParam1 || resourceName == buildParam2’

2020-07-25