Jenkins的Lockable Resource插件允许在Jenkins作业中进行资源锁定和同步。在本文中,我们将重点介绍如何在Freestyle Job中根据参数动态绑定资源。
实际问题
测试团队尚未转移到Jenkins的Pipeline技术栈,Freestyle的Jenkins Job还会长期存在。我们的测试覆盖全平台,因此我们创建了多个Lockable Resource来对应各种操作系统的测试设备:ANDROID
、IOS
、MAC
、WIN
。另有4台各平台的测试设备连接了专用的混音设备,用于测试音乐相关的功能,它们对应的Lockable Resource为:ANDROID_MIXING
、IOS_MIXING
、MAC_MIXING
、WIN_MIXING
。
以前在Jenkins上共创建了8个Freestyle的Jenkins Job对应各个测试设备,每个Job启动时锁定了相应的Lockable Resource,而这8个Job运行的测试代码都是相同的。每个程序员都是处女座,而一个奈斯的程序员是尊重用户的处女座。我依然会沿用Freestyle的Job类型,创建一个参数化的Job,根据参数动态锁定对应的Lockable Resource。这在Pipeline中实现起来是很容易的,但是在Freestyle Job中就需要一些技巧。
解决方案
Lockable Resource支持3种锁定资源的方法:
- 指定资源的名称:构建时尝试锁定指定的资源。如果某些(或全部)资源已被其他构建锁定,则该构建将排队等待它们被释放。
- 指定资源的标签(Label):具有相同标签的资源可以被视为一个资源池。通过指定标签和数量(默认为全部),可以锁定指定数量的相关资源。
- 通过Groovy表达式指定资源:使用一个Groovy表达式判定资源是否适用于构建。该表达式应返回一个布尔值。除了访问Job的参数外,还可以使用以下变量:
- resourceName:根据资源配置的资源名称
- resourceDescription:根据资源配置的资源描述
- resourceLabels:根据资源配置的标签
显然,通过Groovy表达式指定资源是最为灵活的方式
操作步骤
- 创建Choice Parameter:
OS_NAME
,取值范围:ANDROID
、IOS
、MAC
、WIN
- 创建Boolean Parameter:
MIXING
- 通过Groovy表达式指定Lockable Resource:
resourceName==(MIXING ? OS_NAME + "_MIXING" : OS_NAME).toUpperCase()
运行效果
测试1: ANDROID
+ MIXING
→ LOCK(ANDROID_MIXING
)
在运行的console里面可以看到:ANDROID_MIXING
被锁定
Running as SYSTEM
[lockable-resources] acquired lock on [ANDROID_MIXING]
测试2: MACOS
- MIXING → LOCK(MACOS
)
在运行的console里面可以看到:MAC
被锁定
Running as SYSTEM
[lockable-resources] acquired lock on [MAC]
👉 这里的TIMESTAMP参数,请参考Jenkins的Lockable Resource插件 - 2:解决最多只能创建一个等待任务的问题