X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=dsl%2Fkernel-lttng-modules.seed.groovy;h=da17bf1f079e600a239bc9188d6b01a2829968fc;hb=HEAD;hp=76f1af60a651d565a812031a2bc941554ed420c9;hpb=badc51eb5bbd0dbbd75aa6ac07e1553049d66609;p=lttng-ci.git diff --git a/dsl/kernel-lttng-modules.seed.groovy b/dsl/kernel-lttng-modules.seed.groovy index 76f1af6..da17bf1 100644 --- a/dsl/kernel-lttng-modules.seed.groovy +++ b/dsl/kernel-lttng-modules.seed.groovy @@ -87,12 +87,13 @@ class BasicVersion implements Comparable { } } -def kernelTagCutOff = new BasicVersion("3.0", "") -def modulesBranches = ["master","stable-2.5.0","stable-2.6.0", "stable-2.4.0"] +def kernelTagCutOff = new BasicVersion("2.6.36", "") +def modulesBranches = ["master", "stable-2.5", "stable-2.6"] +//def modulesBranches = ["master","stable-2.5","stable-2.6", "stable-2.4"] def linuxURL = "git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git" -def modulesURL = "git://git.lttng.org/lttng-modules.git" +def modulesURL = "https://github.com/lttng/lttng-modules.git" // Linux specific variable String linuxCheckoutTo = "linux-source" @@ -141,6 +142,10 @@ if ( result.exitValue() == 0 ) { // Find the version cutoff def cutoffPos = versions.findIndexOf{(it.major >= kernelTagCutOff.major) && (it.minor >= kernelTagCutOff.minor) && (it.revision >= kernelTagCutOff.revision) && (it.build >= kernelTagCutOff.build) && (it.rc >= kernelTagCutOff.rc)} + // If error set cutoff on last so no job are created + if (cutoffPos == -1) { + cutoffPos = versions.size() + } // Get last version and include only last rc def last def lastNoRcPos @@ -158,6 +163,12 @@ if ( result.exitValue() == 0 ) { String modulesPrefix = "lttng-modules" String kernelPrefix = "dsl-kernel" String separator = "-" + + + println("CutOff index") + println(cutoffPos) + + // Actual job creation for (int i = cutoffPos; i < versions.size() ; i++) { @@ -223,7 +234,7 @@ if ( result.exitValue() == 0 ) { } } steps { - copyArtifacts("${jobName}/arch=\$arch", "linux-artifact/**", '', false, false) { + copyArtifacts("${jobName}/arch=\$arch,label=kernel", "linux-artifact/**", '', false, false) { latestSuccessful(true) // Latest successful build } shell(readFileFromWorkspace('lttng-modules/lttng-modules-dsl-master.sh')) @@ -236,44 +247,80 @@ if ( result.exitValue() == 0 ) { // Trigger generations def dslTriggerKernel = """\ - import hudson.model.* +import jenkins.model.* import hudson.AbortException import hudson.console.HyperlinkNote import java.util.concurrent.CancellationException +import java.util.Random +Random random = new Random() def jobs = hudson.model.Hudson.instance.items def fail = false -def jobStartWith = "${kernelPrefix}" +def jobStartWithKernel = "KERNELPREFIX" +def jobStartWithModule = "MODULEPREFIX" +def toBuild = [] +def counter = 0 +def limitQueue = 4 def anotherBuild jobs.each { job -> def jobName = job.getName() - if (jobName.startsWith(jobStartWith)) { + if (jobName.startsWith(jobStartWithKernel)) { + counter = counter + 1 def lastBuild = job.getLastBuild() - if (lastBuild == null) { - try { - def future = job.scheduleBuild2(0, new Cause.UpstreamCause(build)) - println "\\tWaiting for the completion of " + HyperlinkNote.encodeTo('/' + job.url, job.fullDisplayName) - anotherBuild = future.get() - } catch (CancellationException x) { - throw new AbortException("\${job.fullDisplayName} aborted.") - } - println HyperlinkNote.encodeTo('/' + anotherBuild.url, anotherBuild.fullDisplayName) + " completed. Result was " + anotherBuild.result - - build.result = anotherBuild.result - if (anotherBuild.result != Result.SUCCESS && anotherBuild.result != Result.UNSTABLE) { - // We abort this build right here and now. - fail = true - println("Build Failed") - } + if (lastBuild == null || lastBuild.result != Result.SUCCESS) { + toBuild.push(job) } else { - println("\\tAlready built") + println("\tAlready built") } } } +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() } + } +} + if (fail){ throw new AbortException("Some job failed") } @@ -283,54 +330,106 @@ import hudson.model.* import hudson.AbortException import hudson.console.HyperlinkNote import java.util.concurrent.CancellationException +import java.util.Random +Random random = new Random() def jobs = hudson.model.Hudson.instance.items def fail = false -def jobStartWith = "JOBPREFIX" +def modulePrefix = "MODULEPREFIX" +def branchName = "BRANCHNAME" +def kernelPrefix = "KERNELPREFIX" +def nodeLabels=["kernel"] +def validNodeDivider = 2 + +def fullModulePrefix = modulesPrefix + branchName + +def toBuild = [] +def counter = 0 +def limitQueue = 4 -def anotherBuild jobs.each { job -> - def jobName = job.getName() - if (jobName.startsWith(jobStartWith)) { - def lastBuild = job.getLastBuild() - if (lastBuild == null) { - try { - def future = job.scheduleBuild2(0, new Cause.UpstreamCause(build)) - println "\\tWaiting for the completion of " + HyperlinkNote.encodeTo('/' + job.url, job.fullDisplayName) - anotherBuild = future.get() - } catch (CancellationException x) { - throw new AbortException("\${job.fullDisplayName} aborted.") - } - println HyperlinkNote.encodeTo('/' + anotherBuild.url, anotherBuild.fullDisplayName) + " completed. Result was " + anotherBuild.result - - build.result = anotherBuild.result - if (anotherBuild.result != Result.SUCCESS && anotherBuild.result != Result.UNSTABLE) { - // We abort this build right here and now. - fail = true - println("Build Failed") - } - } else { - println("\\tAlready built") - } - } + def jobName = job.getName() + if (jobName.startsWith(fullModulePrefix)) { + counter = counter + 1 + toBuild.push(job) + } +} + +// Get valid labeled node node +def validNodeCount = 0 +hudson.model.Hudson.instance.nodes.each { node -> + def valid = true + nodeLabels.each { label -> + if (!node.getLabelString().contains(nodeLabel)){ + valid = false + break; + } + } + if (valid){ + validNodeCount++ + } } +// Divide the valid node by validNodeDivider based on user defined label slave descriminant ex arck type +def finalValidNodeCount = validNodeCount.intdiv(validNodeDivider + +// Scheduling + +def ongoingBuild = [] +def q = jenkins.model.Jenkins.getInstance().getQueue() +def queuedTaskKernel = 0 +def queuedTaskModule = 0 +def sleep = 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().getDisplayName().startsWith(jobStartWithKernel)}.size() + queuedTaskModule = q.getItems().findAll {it.task.getParent().getDisplayName().startsWith(jobStartWithModule)}.size() + if ((ongoingBuild.size() <= finalValidNodeCount) && (queuedTaskKernel + queuedTaskModule < limitQueue)) { + def job = toBuild.pop() + ongoingBuild.push(job.scheduleBuild2(0)) + println "\t trigering " + HyperlinkNote.encodeTo('/' + job.url, job.fullDisplayName) + } else { + println "Holding trigger" + println "Currently " + ongoingBuild.size() + " build ongoing. Max = " + validNodeCount + println "Currently " + queuedTaskKernel + " Kernel build ongoing." + println "Currently " + queuedTaskModule + " LTTng-modules build ongoing." + println "Limit for combination of both:" + limitQueue + + sleep = random.nextInt(60000) + println "Sleeping for " + sleep.intdiv(1000) + " seconds" + Thread.sleep(sleep) + ongoingBuild.removeAll{ it.isCancelled() || it.isDone() } + } +} if (fail){ - throw new AbortException("Some job failed") + throw new AbortException("Some job failed") } """ + + dslTriggerKernel = dslTriggerKernel.replaceAll("KERNELPREFIX", kernelPrefix) + dslTriggerKernel = dslTriggerKernel.replaceAll("MODULEPREFIX", modulesPrefix) if (isJenkinsInstance) { freeStyleJob("dsl-trigger-kernel") { steps { systemGroovyCommand(dslTriggerKernel) } + triggers { + cron("H 0 * * *") + } } modulesBranches.each { branch -> + dslTriggerModule = dslTriggerModule.replaceAll("MODULEPREFIX",modulesPrefix + separator + branch + separator) + dslTriggerModule = dslTriggerModule.replaceAll("BRANCHNAME",separator + branch + separator) freeStyleJob("dsl-trigger-module-${branch}") { steps { - systemGroovyCommand(dslTriggerModule.replaceAll("JOBPREFIX",modulesPrefix + separator + branch + separator)) + systemGroovyCommand(dslTriggerModule) + } + triggers { + scm('@daily') } } }