Отменить строчные сборки и прервать выполнение строчек с помощью Groovy для Дженкинса
Для Дженкинса, использующего Groovy System Script, есть ли способ легко найти очередь сборки и список исполняемых сборников по некоторым критериям (в частности, параметр, соответствующий некоторому условию), а затем убить/отменить их?
Я не могу найти способ сделать это, но кажется, что это должно быть возможно.
Ответы
Ответ 1
Я не проверял это сам, но, глядя на API, это можно сделать следующим образом:
import hudson.model.*
import jenkins.model.Jenkins
def q = Jenkins.instance.queue
q.items.findAll { it.task.name.startsWith('my') }.each { q.cancel(it.task) }
Соответствующие ссылки API:
Ответ 2
Я знаю, это старый вопрос, но Google указывает мне на этот вопрос. Сценарии, показанные здесь, только удаляют задания из очереди и не прекращают запуск сборок. Следующий скрипт просто удаляет все из очереди и убивает все запущенные сборки:
import java.util.ArrayList
import hudson.model.*;
import jenkins.model.Jenkins
// Remove everything which is currently queued
def q = Jenkins.instance.queue
for (queued in Jenkins.instance.queue.items) {
q.cancel(queued.task)
}
// stop all the currently running jobs
for (job in Jenkins.instance.items) {
stopJobs(job)
}
def stopJobs(job) {
if (job in com.cloudbees.hudson.plugins.folder.Folder) {
for (child in job.items) {
stopJobs(child)
}
} else if (job in org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject) {
for (child in job.items) {
stopJobs(child)
}
} else if (job in org.jenkinsci.plugins.workflow.job.WorkflowJob) {
if (job.isBuilding()) {
for (build in job.builds) {
build.doKill()
}
}
}
}
Ответ 3
не мог добавить комментарий, но на сегодняшний день с последними дженкинсами Андрей script (nice) требует другого импорта для работы. Выполнение в виде системы Groovy script.
Ошибки Дженкинса и упоминания недостающего класса. Я включил URL-адрес, в котором упоминалась проблема:
//import hudson.model.*
// per http://stackoverflow.com/questions/17429050/running-groovy-command-from-jenkins-using-groovy-script-plugin
// requires this now
import jenkins.model.Jenkins
def q = Jenkins.instance.queue
q.items.findAll { it.task.name.startsWith('my') }.each { q.cancel(it.task) }
Ответ 4
Вот мое решение, если вы хотите запустить только новое задание того же проекта из очереди сборки и отменить другое:
def q = Jenkins.instance.queue
//Find items in queue that match <project name>
def queue = q.items.findAll { it.task.name.startsWith('sample_project') }
//get all jobs id to list
def queue_list = []
queue.each { queue_list.add(it.getId()) }
//sort id's, remove last one - in order to keep the newest job, cancel the rest
queue_list.sort().take(queue_list.size() - 1).each { q.doCancelItem(it) }
Ответ 5
Используйте плагин jenkins groovy postbuild:
Я думаю, что это будет groovy script:
import hudson.model.*
def q = jenkins.model.Jenkins.getInstance().getQueue()
def items = q.getItems()
for (i=0;i<items.length;i++){
if(items[i].task.getName() == "job_name"){
items[i].doCancelQueue()
}
}
Ответ 6
Ссылка: https://xanderx.com/post/cancel-all-queued-jenkins-jobs/
Запустите это в консоли управления сценариями:
Jenkins.instance.queue.clear()
Ответ 7
Чтобы управлять очередью построения задания, вы также можете использовать этот плагин:
https://wiki.jenkins-ci.org/display/JENKINS/Block+queued+job+plugin
- Чтобы заблокировать работу, когда последняя сборка определенного целевого проекта находится в здании
статус
- Чтобы заблокировать работу, когда результат последней сборки определенного целевого проекта имеет результат
Ответ 8
Я расширил фрагмент Igor Zilberman, чтобы он также прекратил выполнение заданий, когда есть задание в очереди по той же причине (что вы видите когда вы наводите курсор на задание в очереди сборки, смотря только на первую строку). Im работает это как задание с шагом сборки "Выполнить систему Groovy Script".
import hudson.model.Result
import jenkins.model.CauseOfInterruption
import jenkins.model.*;
[ // setup job names here
'my-jobname-here'
].each {jobName ->
def queue = Jenkins.instance.queue
def q = queue.items.findAll { it.task.name.equals(jobName) }
def r = [:]
def projs = jenkins.model.Jenkins.instance.items.findAll { it.name.equals(jobName) }
projs.each{p ->
x = p._getRuns()
x.each{id, y ->
r.put(id, y)
}
}
TreeMap queuedMap = [:]
TreeMap executingMap = [:]
q.each{i->
queuedMap.put(i.getId(), i.getCauses()[0].getShortDescription()) //first line
}
r.each{id, run->
def exec = run.getExecutor()
if(exec != null){
executingMap.put(id, run.getCauses()[0].getShortDescription()) //first line
}
}
println("Queued:")
queuedMap.each{ k, v -> println "${k}:${v}" }
println("Executing:")
executingMap.each{ k, v -> println "${k}:${v}" }
// First, if there is more than one queued entry, cancel all but the highest one.
// Afterwards, if there is a queued entry, cancel the running ones
def queuedNames = queuedMap.values();
queuedNames.each{n ->
def idsForName = []
queuedMap.each{ id, name ->
if(name.equals(n)){
idsForName.add(id)
}
}
if (idsForName.size() > 1){
println("Cancelling queued job: "+n)
}
// remove all but the latest from queue
idsForName.sort().take(idsForName.size() - 1).each { queue.doCancelItem(it) }
}
executingMap.each{ id, name ->
if(queuedMap.values().contains(name)){
r.each{rid, run->
if (id == rid){
def exec = run.getExecutor()
if(exec != null){
println("Aborting running job: "+id+": "+name)
exec.interrupt(Result.ABORTED)
}
}
}
}
}
}
return "Done"
Ответ 9
После некоторого расследования я придумал этот код, который прекрасно работает для меня. Он очищает очередь, а также отменяет все выполняемые в данный момент задания.
Предварительные условия:
- Представление "Все" содержит все вакансии
- Используйте Систему Groovy
import jenkins.model.Jenkins
import hudson.*
import hudson.model.*
import jenkins.*
//Remove everything which is currently queued
Jenkins.instance.queue.clear()
def buildingJobs = Jenkins.instance.getAllItems(Job.class).findAll
{
it.isBuilding()
}
buildingJobs.each{
def jobName = it.toString()
def val = jobName.split("\\[|\\]")
//'Abort jobs' is the name of the job I have created, and I do not want it to abort itself.
if((val[1].trim())!='Abort jobs'){
def job = Jenkins.instance.getItemByFullName(val[1].trim())
for (build in job.builds) {
if (build.isBuilding()){
println(build)
build.doStop();
}
}
}
}