Jenkins可锁定资源-锁定而不解锁



我正在使用"可定位资源插件"和Jenkins多流水线功能:

lock('my-resource-name') {
}

我遇到的情况是,我需要将资源锁定在一个管道中,然后在另一个管道中将其解锁。我有变通办法,但如果可能的话,我更喜欢使用锁插件。

我想象一下类似的东西

lock("my-resource-name")
..... 
unlock("my-resource-name)

为什么

我正在实现canary版本,我的管道有三条不同的路径(我考虑了其他解决方案,比如用输入插件暂停管道——为我提供更多内容超出了这个问题的范围(。我想在评估金丝雀时锁定/停止管道,然后在升级或回滚完成后再次解锁它。省略lock语句的正文只会给我java.lang.IllegalStateException: There is no body to invoke

一种方法是:

curl -XGET https://your-jenkins/lockable-resources/reserve?resource=myresource
curl -XGET https://your-jenkins/lockable-resources/unreserve?resource=myresource

GET不是一个错误,它确实是GET。

等待锁定

lock("my-resource-name") {}

我也知道Jenkins支持一种叫做"里程碑"的东西,显然是用来在构建之间进行通信的东西。但我不知道它是否能以任何有意义的方式解决这个问题。

可以通过这种方式锁定

import org.jenkins.plugins.lockableresources.LockableResource
import org.jenkins.plugins.lockableresources.LockableResourcesManager
...
LockableResourcesManager lockableResourcesManager = LockableResourcesManager.get()
LockableResource lockableResource = lockableResourcesManager.fromName(resourceName)
// if the resource doesn't exists, create it
if (lockableResource == null) {
lockableResourcesManager.createResource(resourceName)
lockableResource = lockableResourcesManager.fromName(resourceName)
}
// wait until lock is successful
waitUntil { lockableResourcesManager.lock([lockableResource].toSet(), currentBuild.rawBuild, null) }

解锁要简单得多,因为你知道资源存在(如果不存在,就没有理由尝试解锁(

LockableResourcesManager lockableResourcesManager = LockableResourcesManager.get()
LockableResource lockableResource = lockableResourcesManager.fromName(resourceName)
// do not pass currentBuild.rawBuild as in your case is not the build that locked this resource
// so I am passing null instead
lockableResourcesManager.unlock([lockableResource], null)

请注意,我曾经测试过这个org.6wind.jenkins:lockable-resources:2.7,实现细节可能会因使用的版本而异。

<dependency>
<groupId>org.6wind.jenkins</groupId>
<artifactId>lockable-resources</artifactId>
<version>2.7</version>
<scope>provided</scope>
</dependency>

从LockableResourcesManager获取每个锁,然后foreach lock如果lock.getName匹配则执行lock.reset((以释放锁定

例如,一些groovy可以找到任何构建都不拥有的锁定锁并清理它们:

print "STARTn"
def all_lockable_resources = org.jenkins.plugins.lockableresources.LockableResourcesManager.get().resources
all_lockable_resources.each { r->
if (r.isLocked() || r.isReserved()) { 
println "Lock " + r + " is locked or reserved by " + r.getBuild() + " B CARSE " + r.getLockCause()
b = r.getBuild()
if (b) {
if (b.isBuilding()) { println "build:" + b + " is building" } 
if (b.getResult().equals(null)) { println "build:" + b + " result is not in yet" }
if ( ! b.isBuilding() && ! b.getResult().equals(null)) { 
println "build:" + b + " is not building and result is " + b.getResult() + " yet the lock " + r + " is locked."
println "ACTION RELEASE LOCK " + r
println "getLockCause:" + r.getLockCause() 
println "getDescription:" + r.getDescription() 
println "getReservedBy:" + r.getReservedBy() 
println "isReserved:" + r.isReserved() 
println "isLocked:" + r.isLocked() 
println "isQueued:" + r.isQueued() 
//release the lock
r.reset() 
println "getLockCause:" + r.getLockCause() 
println "getDescription:" + r.getDescription() 
println "getReservedBy:" + r.getReservedBy() 
println "isReserved:" + r.isReserved() 
println "isLocked:" + r.isLocked() 
println "isQueued:" + r.isQueued() 
}
}
}
}

API:http://javadoc.jenkins.io/plugin/lockable-resources/org/jenkins/plugins/lockableresources/LockableResource.html

或导航到https://jenkins-host/lockable-resources/页在这里我们可以找到所有可锁定资源的列表。我们可以手动锁定或保留这些。

最新更新