Jenkins可锁定资源 - 无需解锁即可锁定

10

我正在使用“Locable Resources Plugin”与Jenkins多管道功能一起:

lock('my-resource-name') {

}

我有一个情况,需要在一个管道中锁定资源,并在另一个管道中解锁它。我有一些解决方法,但如果可能的话,我更愿意使用锁插件。

我想象中的解决方案是这样的

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

缘由

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


你找到任何解决方案了吗?我也在寻找同样的东西。 - YogevAbr
4个回答

11

有一种方式可以这样做:

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支持一种叫做“里程碑”的东西,显然是用来在构建之间进行通信的。但我不知道它是否可以以有意义的方式解决这个问题。


4

可以通过这种方式进行锁定

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>

2

从LockableResourcesManager获取每个锁,然后对于每个锁,如果锁的名称匹配,则执行lock.reset()以释放锁。

例如,以下Groovy代码用于查找未被任何构建拥有的已锁定锁并清理它们:

print "START\n"
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

这是一个API链接,它与Jenkins插件Lockable Resources相关。该链接提供了有关锁定资源的更多信息,以及如何在Jenkins中使用它们。

0

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


1
手动锁定和解锁是自动化的反模式。 - mb-texas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接