Запираемый ресурс Jenkins - блокировка без разблокировки
Я использую "Плагин локализуемых ресурсов" вместе с функциональностью Дженкинса:
lock('my-resource-name') {
}
У меня есть ситуация, когда мне нужно заблокировать ресурс в одном конвейере и разблокировать его в другом. У меня есть обходные пути, но я бы предпочел использовать плагин блокировки, если это возможно.
Я воображаю что-то вроде этого
lock("my-resource-name")
.....
unlock("my-resource-name)
Почему это
Я реализую канареечные выпуски, и в моем конвейере есть три разных пути (я рассматривал другие решения, такие как приостановка конвейера с помощью входного плагина - предоставление мне большего объема выходит за рамки этого вопроса). Я хотел бы заблокировать / остановить конвейер, пока оценивается канарейка, а затем, когда продвижение или откат завершен, снова разблокировать его. Опуская тело для lock
заявление только дает мне java.lang.IllegalStateException: There is no body to invoke
4 ответа
Один из способов сделать это заключается в следующем:
curl -XGET https://your-jenkins/lockable-resources/reserve?resource=myresource
curl -XGET https://your-jenkins/lockable-resources/unreserve?resource=myresource
ПОЛУЧИТЬ не ошибка, это действительно ПОЛУЧИТЬ.
Ждать блокировки
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 получить каждую блокировку, затем каждую блокировку сделать, если 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()
}
}
}
}
или перейдите на страницу https://jenkins-host/lockable-resources/. здесь мы можем найти список всех запираемых ресурсов. мы можем вручную заблокировать или зарезервировать их.