使用Groovy for Jenkins取消排队的构建并中止执行构建

Les*_*ong 42 jenkins

对于Jenkins使用Groovy系统脚本,有没有办法轻松搜索构建队列和执行构建列表的某些条件(特别是匹配某些条件的参数),然后杀死/取消它们?

我似乎无法找到任何方法来做到这一点,但它似乎应该是可能的.

And*_*ich 66

我自己没有测试过,但是看看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) }
Run Code Online (Sandbox Code Playgroud)

相关API链接:

  • 这不会杀死正在执行的构建 (5认同)

小智 33

我知道这是一个古老的问题,但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()
        }
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)


小智 29

参考资料:https : //xanderx.com/post/cancel-all-queued-jenkins-jobs/

在 Manage Jenkins > Script Console 中运行:

Jenkins.instance.queue.clear()
Run Code Online (Sandbox Code Playgroud)

  • 这会破坏整个作业队列,并且不会回答有关“基于标准”停止的请求 (4认同)

小智 7

经过一番调查,我想出了这个对我来说绝对没问题的代码。它清除队列并中止当前正在执行的所有作业。

先决条件:

  1. “全部”视图包含所有作业
  2. 使用系统常规
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();
            }
        }
    }
}

Run Code Online (Sandbox Code Playgroud)


小智 6

不能添加为注释,但是直到今天,对于最新的詹金斯来说,安德烈的剧本(漂亮)需要再次导入才能起作用。作为系统Groovy脚本执行。

詹金斯(Jenkins)犯了错误,并提到了缺失的班级。我包括提到该问题的网址:

//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) }
Run Code Online (Sandbox Code Playgroud)