Nick-

Not the best, but here's a thought.


1.        During your build, evaluate which post build action you would like, 
and echo some sort of semaphore based on that state

2.       Configure 2 post build-steps for your job, each with conditional text 
from the log file.  Conditional text to match is your semaphore that you echo.

3.       Because the parameterized build step won't allow conditionality, have 
your post build steps perform a wget or curl call to the URL of the downstream 
jobs to trigger depending on which you want to do.

4.       You will need to modify the downstream jobs to allow remote triggering.
-Aaron

From: [email protected] 
[mailto:[email protected]] On Behalf Of Nick Martin
Sent: Wednesday, October 31, 2012 2:55 PM
To: [email protected]
Subject: How to conditionally build down-stream projects?

I have a fairly complicated Jenkins job that builds, unit tests and packages a 
web application. Depending on the situation, I would like to do different 
things once this job completes. I have not found a re-usable/maintainable way 
to do this. Is that really the case or am I missing something?

The options I would like to have once my complicated job completes:

1. Do nothing

2. Start my low-risk-change build pipeline:
  - copies my WAR file to my artifact repository
  - deploys to production

3. Start my high-risk-change build pipeline:
  - copies my WAR file to my artifact repository
  - deploys to test environment
  - run acceptance tests
  - deploy to production

I have not found an easy way to do this. The simplest, but not very 
maintainable, approach would be to make three separate jobs, each of which 
kicks off a downstream build. This approach scares me for a few reasons 
including the fact that changes would have to be made in three places instead 
of one. In addition, many of the downstream jobs are also nearly identical. The 
only difference is which downstream jobs they call. The proliferation of jobs 
seems like it would lead to an un-maintainable mess.

I have looked at using several approaches to keep this as one job, but none 
have worked so far:

1. Make the job a multi-configuration project 
(https://wiki.jenkins-ci.org/display/JENKINS/Building+a+matrix+project). This 
provides a way to inject the job with a parameter. I have not found a way to 
make the "build other projects" step respond to a parameter.

2. Use the Parameterized-Trigger plugin 
(https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin). 
This plugin lets you trigger downstream-jobs based on certain triggers. The 
triggers appear to be too restrictive though. They're all based on the state of 
the build, not arbitrary variables. I don't see any option provided here that 
would work for my use case.

3. Use the Flexible Publish plugin 
(https://wiki.jenkins-ci.org/display/JENKINS/Flexible+Publish+Plugin). This 
plugin has the opposite problem as the parameterized-trigger plugin. It has 
many useful conditions it can check, but it doesn't look like it can start 
building another project. Its actions are limited to publishing type activities.

4. Use Flexible Publish + Any Build Step plugin 
(https://wiki.jenkins-ci.org/display/JENKINS/Any+Build+Step+Plugin). The Any 
Build Step plugin allows making any build action available to the Flexible 
Publish plugin. While more actions were made available once this plugin was 
activated, those actions didn't include "build other projects."

5. Use the Conditional Build Step plugin 
(https://wiki.jenkins-ci.org/display/JENKINS/Conditional+BuildStep+Plugin). 
This plugin looks like it only lets you create conditional build steps, not 
conditional *post*-build steps.

Is there really not an easy way to do this? I'm surprised that I haven't found 
it and even more surprised that I haven't really seen any one else trying to do 
this? Am I doing something unusual? Is there something obvious that I am 
missing?

PS I also posted on StackOverflow last week, but didn't get any good answers 
there. 
http://stackoverflow.com/questions/13091488/how-to-conditionally-build-other-projects

Reply via email to