是否可以指定,如果作业 (A) 被多次触发,则从队列中删除先前的作业,并且如果有足够的空闲槽,则仅将最新的作业留在队列中或启动?
提前致谢!
使用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
您可以使用通过Groovy Script Plugin运行的系统 Groovy Script 来完成。这样的脚本可以通过其编程 API直接访问 Jenkins 。我没有看到任何其他方式。
我认为仅在构建之前添加一个 groovy 脚本就无法完美解决这个问题。如果新工作在旧工作已经在构建时进入(它无法检查队列,因为它的预构建部分已经过去),新工作仍然需要等待。
如我所见,要实现 jenkins 的抢占式工作,我们需要创建另一个监督工作。此作业应定期检查队列中是否有新构建,并在必要时终止旧构建。
但是创建一个监督工作似乎很复杂。我也期待一个完美的解决方案。