Подтвердить что ты не робот

Отменить строчные сборки и прервать выполнение строчек с помощью Groovy для Дженкинса

Для Дженкинса, использующего Groovy System Script, есть ли способ легко найти очередь сборки и список исполняемых сборников по некоторым критериям (в частности, параметр, соответствующий некоторому условию), а затем убить/отменить их?

Я не могу найти способ сделать это, но кажется, что это должно быть возможно.

4b9b3361

Ответ 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()  
}   
}  

Ответ 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

После некоторого расследования я придумал этот код, который прекрасно работает для меня. Он очищает очередь, а также отменяет все выполняемые в данный момент задания.

Предварительные условия:

  1. Представление "Все" содержит все вакансии
  2. Используйте Систему 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();

            }


        }

    }

}