web-dev-qa-db-ja.com

Jenkinsのロック可能なリソース-ロックを解除せずにロックする

「LocableResourcesPlugin」をJenkinsマルチパイプライン機能と一緒に使用しています。

lock('my-resource-name') {

}

あるパイプラインでリソースをロックし、別のパイプラインでロックを解除する必要がある状況があります。回避策はありますが、可能であればロックプラグインを使用したいと思います。

私はこのようなものを想像します

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

その理由

私はカナリアリリースを実装しており、パイプラインには3つの異なるパスがあります(入力プラグインでパイプラインを一時停止するなど、他のソリューションを検討しました-より多くのものを提供することは、この質問の範囲外です)。カナリアの評価中にパイプラインをロック/停止し、昇格またはロールバックが完了したら、再度ロックを解除したいと思います。 lockステートメントの本文を省略すると、Java.lang.IllegalStateException: There is no body to invoke

6
Markus T

それを行う1つの方法はこれです:

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が「マイルストーン」と呼ばれるものをサポートしていることも知っています。これは明らかにビルド間の通信に使用されるものです。しかし、それがこの問題を意味のある方法で解決するために使用できるかどうかはわかりません。

5
Markus T

lockableResourcesManagerから各ロックを取得し、次にforeachロックを実行します。lock.getNameが一致する場合は、lock.reset()を実行してロックを解放します。

例えばどのビルドも所有していないロックされたロックを見つけてクリーンアップするためのいくつかのグルーヴィー:

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

1
gaoithe