yes I think so
2014/1/10 silver <[email protected]> > 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 <[email protected]> > 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 <[email protected]> > >> 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 <[email protected]> >> 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 <[email protected]> >> >>> 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 <[email protected]> >>> 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 <[email protected]> >>> >>>> >>>> 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 <[email protected]> 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 <[email protected]> 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 [email protected]. >>>> 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 [email protected]. >>> 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 [email protected]. >> 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 [email protected]. > 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 [email protected]. For more options, visit https://groups.google.com/groups/opt_out.
