Would “Throttle Concurrent Builds" plugin do the same? The Locks and Latches plugin displays this message when I visit the page: This plugin is on the Proposed Plugin Deprecation list. Take a look at the Throttle Concurrent Builds Plugin.
On Jan 10, 2014, at 8:59 AM, nicolas de loof <nicolas.del...@gmail.com> wrote: > ok, then the issue isn't an orchestration but resource one - this applies to > all jobs on your instance, not just the ones from a specific flow - and you > should use > https://wiki.jenkins-ci.org/display/JENKINS/Locks+and+Latches+plugin to > ensure your selenium jobs don't run concurrently > > > 2014/1/10 silver <pja...@gmail.com> > I can’t run the jobs in parallel because I’m resource limited on my Selenium > hub. > > They do *not* depend on each other sequentially. > > The use case is that I need a group of jobs to run through to completion in > succession, not parallel, but at the end, if at any point a job had failed, > to fail the build…not ignore failures. There is a guard/rescue for > try/finally. Why not have a try/catch equivalent? That’s basically what I > need, I think. > > On Jan 10, 2014, at 8:32 AM, nicolas de loof <nicolas.del...@gmail.com> wrote: > >> This isn't supported at this time - I don't really get your use-case >> why can't you run those jobs in parallel ? If they actually depend on each >> other sequentially, why not stop the flow when first one fails ? >> >> >> 2014/1/10 silver <pja...@gmail.com> >> Nicolas, >> >> Do you have a recommendation on how I can accomplish the goal at hand? >> Otherwise, I see no other option but to try Marc's groovy script. >> >> Thanks. >> >> On Jan 10, 2014, at 2:51 AM, nicolas de loof <nicolas.del...@gmail.com> >> wrote: >> >>> I don't recommend such a fully programmatic approach, build-flow is >>> designed as a DSL, admittedly not constrained to just supported keywords >>> (because I didn't know how to do this when I started this plugin) but >>> clearly not supposed to be used to create such a groovy script. >>> >>> >>> 2014/1/10 Marc MacIntyre <marc...@purestorage.com> >>> >>> You are overthinking it :) The trick is to grab the return value from the >>> build() call and check the result of that, then explicitly set the failure >>> state of the buildflow. >>> >>> This is what I'm doing; it's more solution than you need, but it solves >>> your problem. >>> >>> This buildflow takes a map of jobs and the pass criteria, and fires >>> everything off in parallel. If you want to retry on failures, that's >>> supported, and/or you can start several in parallel and pass if some >>> portion of them pass. We use job names as the map key, so if you want to >>> start multiple runs of a particular job with different params, you'll need >>> to modify the script somewhat. >>> >>> def createBuildClosure(String jn, Map args, int retryCount = 0) { >>> // This indirection is needed to force a clone of args, so it's out of >>> scope and gets >>> // re-bound to the closure each time - otherwise jenkins will >>> deduplicate our builds. >>> def ags = args.clone() >>> ags.put("_dedup", java.lang.System.nanoTime()) >>> if (retryCount) { >>> return { retry(retryCount) {build(ags, jn)} } >>> } else { >>> return {build(ags, jn)} >>> } >>> } >>> >>> def startParallelRuns(Map buildsToRun) { >>> def m = [:] >>> buildsToRun.each { >>> jobName, params -> >>> def maxFailures = params.get("maxFailures", 0) >>> def retryCount = params.get("retryCount", 0) >>> println "Running "+jobName+" "+params.count+" times (max >>> failures "+maxFailures+")" >>> for (int idx = 0; idx < params.count; idx++) { >>> m.put(jobName+"_"+idx, createBuildClosure(jobName, >>> params.args, retryCount)) >>> } >>> } >>> >>> ignore(FAILURE) { >>> join = parallel(m) >>> } >>> >>> results = [:] >>> // process the results by job name >>> buildsToRun.each { >>> jobName, params -> >>> def passcount = 0 >>> def maxFailures = params.get("maxFailures", 0) >>> for (int idx = 0; idx < params.count; idx++) { >>> run = join[jobName+"_"+idx] >>> if (run.result == SUCCESS) { passcount += 1} >>> } >>> result = (params.count - passcount) > maxFailures ? FAILURE : >>> SUCCESS >>> println ""+result+": "+jobName+": >>> "+passcount+"/"+params.count+" passed (Max failures: "+maxFailures+")" >>> results[jobName] = result >>> } >>> return results >>> } >>> >>> build_params = params.clone() >>> >>> // Modify your build params here >>> build_params.put('UPSTREAM_JOB', build.project.name) >>> >>> buildsToRun = [ >>> job1: [count: 1, maxFailures: 0, args: build_params, retryCount: 2], >>> job2: [count: 1, maxFailures: 0, args: build_params], >>> job3: [count: 1, maxFailures: 0, args: build_params], >>> jobX: [count: 2, maxFailures: 0, args: build_params], >>> jobY: [count: 1, maxFailures: 0, args: build_params], >>> ] >>> >>> >>> results = startParallelRuns(buildsToRun) >>> build.state.result = results.any { job, result -> result == FAILURE} ? >>> FAILURE : SUCCESS >>> >>> >>> >>> On Thu, Jan 9, 2014 at 8:22 PM, silver <pja...@gmail.com> wrote: >>> Sorry for any confusion. The line: ”println(“There were >>> “+FailuresPresent+" test(s) that failed”);" is outside of the if statement >>> resulting in the example output at the end of this message. >>> >>> On Jan 9, 2014, at 9:55 PM, silver <pja...@gmail.com> wrote: >>> >>> > When I run jobs in parallel, the Build Flow fails or passes as I’d >>> > expect. Example: >>> > >>> > parallel ( >>> > { build(job1) }, >>> > { build(job2) }, >>> > { build(job3) }, >>> > ) >>> > >>> > All of the jobs are started and if they all pass, the Build Flow passes. >>> > If one fails, the Build Flow fails. >>> > >>> > What I’d like to do is to run jobs sequentially, ignoring a failure *for >>> > that moment* but at the end, fail or pass the Build Flow as a whole. >>> > Using “ignore(FAILURE)" doesn’t give me what I want because it will >>> > ignore a failure and pass the Build Flow regardless: >>> > >>> > ignore(FAILURE) {build(job1)} >>> > ignore(FAILURE) {build(job2)} >>> > ignore(FAILURE) {build(job3)} >>> > >>> > If they all fail, the Build Flow still passes because failures are >>> > ignored. But I really need ALL of the jobs to run no matter the outcome >>> > of the other jobs, and the Build Flow to pass/fail, depending on each >>> > outcome. >>> > >>> > Therefore, I have tried something like this (which I thought I got to >>> > actually work at one point but I can’t get it to work again!?! The >>> > closest I can get is explained further down.): >>> > >>> > FailuresPresent = 0; >>> > try { >>> > build(job1) >>> > }catch(e) { >>> > FailuresPresent = FailuresPresent++; >>> > } >>> > try { >>> > build(job2) >>> > }catch(e) { >>> > FailuresPresent = FailuresPresent++; >>> > } >>> > try { >>> > build(job3) >>> > }catch(e) { >>> > FailuresPresent = FailuresPresent++; >>> > } >>> > if ( FailuresPresent>0) { >>> > println(“There were “+FailuresPresent+" test(s) that failed”); >>> > throw new Exception("FAILED!”); >>> > }else { >>> > println "Tests PASSED!"; >>> > } >>> > >>> > But the Build Flow will still stop immediately after a failed job (I >>> > don’t see my println at the end). If I use an ignore(FAILURE) wrapper, >>> > then the “catch” is ignored and the Build Flow passes. >>> > >>> > I am not using guard/rescue because I don’t need the FailuresPresent to >>> > increment every time, only when there is a failure (or do I? >>> > Guard/Rescue is like try/finally, not a try/catch.) >>> > >>> > None of my jobs are dependent on another, I just want them all grouped >>> > together and to run sequentially in a single Build Flow if possible. >>> > Running them in parallel maxes out my resources (not Jenkins but my >>> > Selenium hub). >>> > >>> > If I wrap the above jobs in a parallel statement, it seems to gives the >>> > appearance of it finishing to completion (my print statement at the end >>> > is seen) but the Build Flow doesn’t run the other jobs. >>> > >>> > This is the output with the entire try/catch/builds wrapped in a parallel >>> > statement (notice job2 and job3 aren’t run but my println at the end is >>> > seen: >>> > >>> > parallel { >>> > Schedule job job1 >>> > Build job1 #34 started >>> > job1 #34 completed : UNSTABLE >>> > } >>> > There were 0 test(s) that failed >>> > Tests PASSED! >>> > >>> > Suggestions? I hope I’m over-thinking this. >>> > >>> > Thanks. >>> >>> >>> >>> >>> -- >>> Marc MacIntyre >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "Jenkins Users" group. >>> To unsubscribe from this group and stop receiving emails from it, send an >>> email to jenkinsci-users+unsubscr...@googlegroups.com. >>> For more options, visit https://groups.google.com/groups/opt_out. >>> >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "Jenkins Users" group. >>> To unsubscribe from this group and stop receiving emails from it, send an >>> email to jenkinsci-users+unsubscr...@googlegroups.com. >>> For more options, visit https://groups.google.com/groups/opt_out. >> >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Jenkins Users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to jenkinsci-users+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/groups/opt_out. > > > > -- > You received this message because you are subscribed to the Google Groups > "Jenkins Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to jenkinsci-users+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/groups/opt_out.
smime.p7s
Description: S/MIME cryptographic signature