+println "Kernel total "+ counter
+println "Kernel to build "+ toBuild.size()
+
+
+def kernelEnabledNode = 0
+hudson.model.Hudson.instance.nodes.each { node ->
+ if (node.getLabelString().contains("kernel")){
+ kernelEnabledNode++
+ }
+}
+println "Nb of live kernel enabled build node "+ kernelEnabledNode
+
+def ongoingBuild = []
+def q = jenkins.model.Jenkins.getInstance().getQueue()
+
+def queuedTaskKernel = 0
+def queuedTaskModule = 0
+
+while (toBuild.size() != 0) {
+ // Throttle the build with both the number of current parent task and queued
+ // task.Look for both kernel and downstream module from previous kernel.
+ queuedTaskKernel = q.getItems().findAll {
+ it.task.getParent().name.startsWith(jobStartWithKernel)
+ }.size()
+
+ queuedTaskModule = q.getItems().findAll {
+ it.task.getParent().name.startsWith(jobStartWithModule)
+ }.size()
+
+ it.task.getParent().name.startsWith(jobStartWithModule)
+ if ((ongoingBuild.size() <= kernelEnabledNode.intdiv(2)) && (queuedTaskKernel + queuedTaskModule < limitQueue)) {
+ def job = toBuild.pop()
+ ongoingBuild.push(job.scheduleBuild2(0))
+ println "\t trigering " + HyperlinkNote.encodeTo('/' + job.url, job.fullDisplayName)
+ } else {
+ println "Currently " + ongoingBuild.size() + " build currently on execution. Limit: " + kernelEnabledNode.intdiv(2)
+ println "Currently " + queuedTask.findAll{it.task.getParent().name.startsWith(jobStartWithModule)}.size() + " module jobs are queued. Limit: " + limitQueue
+ println "Currently " + queuedTask.findAll{it.task.getParent().name.startsWith(jobStartWithKernel)}.size() + " kernel jobs are queued. Limit: " + limitQueue
+ Thread.sleep(random.nextInt(60000))
+ ongoingBuild.removeAll{ it.isCancelled() || it.isDone() }
+ }
+}
+