9

是否可以指定,如果作业 (A) 被多次触发,则从队列中删除先前的作业,并且如果有足够的空闲槽,则仅将最新的作业留在队列中或启动?

提前致谢!

4

3 回答 3

5

使用execute system groovy script步骤:

import hudson.model.Result
import jenkins.model.CauseOfInterruption

//iterate through current project runs
build.getProject()._getRuns().each{id,run->
  def exec = run.getExecutor()
  //if the run is not a current build and it has executor (running) then stop it
  if( run!=build && exec!=null ){
    //prepare the cause of interruption
    def cause = new CauseOfInterruption(){ 
      public String getShortDescription(){
        return "interrupted by build #${build.getId()}"
      }
    }
    exec.interrupt(Result.ABORTED, cause)
  }
}

//just for test do something long...
Thread.sleep(10000)

在中断的工作中会有一个日志:

Build was aborted
interrupted by build #12
Finished: ABORTED 
于 2017-06-02T10:03:07.333 回答
3

您可以使用通过Groovy Script Plugin运行的系统 Groovy Script 来完成。这样的脚本可以通过其编程 API直接访问 Jenkins 。我没有看到任何其他方式。

于 2012-04-23T13:40:18.010 回答
1

我认为仅在构建之前添加一个 groovy 脚本就无法完美解决这个问题。如果新工作在旧工作已经在构建时进入(它无法检查队列,因为它的预构建部分已经过去),新工作仍然需要等待。

如我所见,要实现 jenkins 的抢占式工作,我们需要创建另一个监督工作。此作业应定期检查队列中是否有新构建,并在必要时终止旧构建。

但是创建一个监督工作似乎很复杂。我也期待一个完美的解决方案。

于 2014-08-11T09:16:53.533 回答