如何在Freestyle项目中使用Lockable Resources插件中的Groovy Expression

时间:2017-05-05 15:29:36

标签: jenkins groovy jenkins-plugins jenkins-pipeline

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

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

原始问题如下:对于有兴趣的人:

我最初试图让Lockable Resources Plugin锁定特定资源,同时还评估系统环境变量的值。评估系统环境变量工作正常,但是,我似乎无法锁定正确的资源。

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

我创建了一个名为 A_TEST B_TEST C_TEST 的三种资源。他们都没有任何标签。它们都可以从我的 Jenkins_URL / lockable-resources / 中看到,在这些地方可以毫无问题地获取和发布它们。

在我的Jenkins作业配置中,我选择了此版本需要可锁定的资源选项,这样我就可以指定资源标签 Groovy Expression (以及其他类路径)。它还允许我指定预留资源变量名称要请求的资源数量

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

测试1

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

  • 资源= B_TEST
  • Groovy Expression =未选中
  • 请求的资源数量= 1

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

  

[lockable-resources]获得[B_TEST]

的锁定

测试2

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

  • 资源= B_TEST
  • Groovy Expression = Checked
  • Groovy Script = return false
  • 请求的资源数量= 1

尝试执行作业时,错误会永远等待文字:(pending--Waiting for the resourced [B_TEST])

测试3

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

  • 资源= B_TEST
  • Groovy Expression = Checked
  • Groovy Script =返回 true
  • 请求的资源数量= 1

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

  

[lockable-resources]获得[A_TEST]

的锁定

测试4

重新阅读插件中每个选项的帮助后,我发现该插件显然只允许我指定 资源标签 Groovy Expression 所以在这个测试中我设置了以下内容:

  • Groovy Expression = Checked
  • Groovy Script =返回 false
  • 保留资源变量名称= MyResourceName

这会导致作业错误地而不会锁定任何资源。控制台输出显示为:

  

[lockable-resources]获得锁定[]

测试5

所以在这个测试中我设置了以下内容:

  • Groovy Expression = Checked
  • Groovy Script =返回 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'

因此我开始尝试包含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)决定实际是否锁定。我试图潜入消息来源,但没有任何运气。

非常感谢任何答案。

3 个答案:

答案 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