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

2024-04-26

这个问题是针对旧版本提出的可锁定资源插件 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)决定是否实际获取锁定。我曾尝试深入研究源头,但没有任何运气。

任何答案都将不胜感激。


首先是警告。在这个插件中调试 Groovy 很困难,并且会很快填满您的 Jenkins 日志。唯一的可能性是使用println从脚本内部,所有输出最终都在 jenkins 日志中,因为它是在作业控制台日志初始化之前进行评估的。

该脚本由作业调度程序连续调用,每次都使用新的资源名称。该脚本的任务是评估资源名称,并返回true or false。如果满足所有其他预运行条件,则 true 将导致作业执行。

要测试特定资源,请选择 Printer1 或 Printer2:

if (resourceName.startsWith("Printer")) {
//   println "Gotit"
   return true
}
return false

要测试传递给作业的字符串参数,只需指定字符串参数名称:

if (resourceName.equals(SELECTED_PRINTER)) {
   return true
}
return false
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Google App Engine 电子邮件进入垃圾邮件文件夹

    当我使用邮件的 send mail 函数通过谷歌应用程序引擎发送电子邮件时 它们通常会被放置在收件人的 SPAM 文件夹中 虽然 GMail 帐户不会出现此问题 但 Yahoo Mail 帐户 可能还有其他几个帐户 会出现此问题 有没有办法
  • 将 JavaScript 中的大字符串与哈希进行比较

    我有一个带有文本区域的表单 其中可以包含使用多个第三方富文本编辑器之一编辑的大量内容 例如博客文章 我正在尝试实现类似自动保存功能的功能 如果内容发生更改 它应该通过ajax 提交内容 然而 我必须解决这样一个事实 我作为选项的一些编辑器不
  • IIS7 和 HTTP 状态代码处理

    我因试图对 IIS7 集成模式 中的错误呈现进行完整的编程控制而感到非常头疼 我想要做的是给出一个错误 找不到页面 内部服务器错误 未经过身份验证等 将整个请求传输到自定义 ASPX 或 HTML 我更喜欢后者 并使用正确的 HTTP 状态
  • 通过json在textview中显示数据

    我想通过php显示mysql数据库中的用户详细信息并将其显示在android textview中 场景是这样的 当用户登录到他的帐户时 他将被重定向到包含 4 个按钮的仪表板 即 新闻源 个人资料 日历和关于 当用户单击个人资料按钮时 用户
  • Angular 9 ngtypecheck

    更新到 Angular 9 后 我收到警告 src main ngtypecheck ts is part of the TypeScript compilation but it s unused Add only entry point
  • 如何在 Swift 中处理 NSUserDefaults 中的非可选值

    从中获取值NSUserDefaults我会做这样的事情 let userDefaults NSUserDefaults standardUserDefaults if let value userDefaults objectForKey
  • 如何将值从对象转换为 Nullable<> [重复]

    这个问题在这里已经有答案了 我有一些带有一些属性的类 我想将值从字符串转换为该属性的类型 我在转换为可为空类型时遇到问题 这是我的转换方法 public static object ChangeType object value Type
  • 绑定到 AvalonDock 2 中的 LayoutAnchorableItem 可见性

    我正在尝试绑定Visibility of LayoutAnchorableItem到 ViewModel 中的布尔值 以便我可以以编程方式显示和隐藏可锚定
  • .rmd 文件的访问名称并在 R 中使用

    我正在编织一个名为MyFile rmd 我如何访问该字符串MyFile在编织过程中并将其用于 在 YAML 标头的标题部分中使用 在后续的 R 块中使用 title r rmarkdown metadata title author My
  • 如何在maven antrun插件中执行输入任务

    我创建了一个 Maven 项目 我正在尝试运行外部脚本 在此外部脚本中 我使用 read 命令来提出问题并获得答案 如果我做一个 它会起作用sudo mvn 包 with 执行 maven 插件 http www mojohaus org
  • Android 位图图像缓存

    嗨 我正在 Android 中实现图像缓存 经历过这个 http developer android com training displaying bitmaps cache bitmap html http developer andr
  • 如何在滑块上方添加刻度和标签?

    我尝试使用 Slider 划分看起来不错 值 gt 50 10 20 但是 如何在滑块上方添加刻度和标签 Expect 勾选将根据滑块位置改变颜色 Actual Slider min 0 max 100 value value onChan
  • UITableView的separatorEffect属性有什么用?

    iOS 8 中的新功能是separatorEffect属性 您可以为其分配 UIVisualEffect 有谁知道这是做什么用的吗 我试过了 但我不认为它有任何 呃 视觉效果 我想知道完全相同的事情 所以我放了一个Github https
  • random.seed():它有什么作用?

    我有点困惑什么random seed 在 Python 中是这样的 例如 为什么下面的试验会 一致地 做他们所做的事情 gt gt gt import random gt gt gt random seed 9001 gt gt gt ra
  • wxPython:在现有 wx.Panel 上覆盖 wx.Panel 的好方法

    我有一个 wx Frame 其中有一个主 wx Panel 其中有几个小部件 我想要其中的一个按钮来启动 帮助面板 这个帮助面板可能是一个wx Panel 我希望它覆盖整个主wx Panel 不包括wx Frame的菜单栏 帮助按钮上应该有
  • 如何在 HTML 文件中包含 python 脚本?

    我该如何放置这个Python脚本 a f d s a x 1 scope vars for i in a scope x 1 print a x html 文件里面 像这样 如果你想创建一个html 不一定显示它 html file ope
  • pygame中盒子的连续移动

    我编写了以下代码来创建一个简单的游戏 当您单击键盘上的箭头时 一个框会在游戏中移动一个单位 我试图做到这一点 以便如果我按下任何箭头按钮 盒子将继续朝该方向移动 直到按下另一个箭头 因此 如果我按一次向右箭头而不是快速移动 50 像素 它将
  • 如何使用 ES6 样式导入添加外部 javascript 库?

    我无法准确理解如何在新的 ES6 项目中使用旧的 javascript 库 我正在查看一个使用 webpack 编译 使用 ES6 编写并使用 Babel 转译的 React 项目 每个组件都遵循import from 符号 我想在项目中使
  • 类继承命名

    我想继承 DevExpress ComboBoxEdit 控件 并且想知道将我的类命名为与 DevExpress 类相同的名称是否是不好的做法 这是派生类声明 using System using System Collections Ge
  • 如何在 Jenkins Freestyle 项目中使用可锁定资源插件中的 Groovy 表达式

    这个问题是针对旧版本提出的可锁定资源插件 https wiki jenkins ci org display JENKINS Lockable Resources Plugin 旧版本中的错误自2 1版本以来已得到修复 然而 没有描述如何在