A pretty pickle you've gotten yourself into.
These are the options that come to mind (in no particular order):
a) Instead of having the 3 jobs with git branch as parameter, make several sets
of 3 jobs. Each set has a fixed branch they build from. If creating the jobs is
too much manual work, you can automate the creation of the jobs, either with a
script or with a Jenkins job.
b) Try to use Parameterized Trigger plugin to trigger downstream builds. Pass a
"predefined parameter" in the form of BRANCH_TO_BUILD=$GIT_BRANCH. Apparently
the git plugin sets GIT_BRANCH, I just do not know if that is available in the
Parameterized Trigger, but I'm fairly sure it should be.
c) Make a new plugin that supports picking up the git branch and passing it on.
d) Install Groovy post build plugin and use a groovy script to dig up the
branch and pass it on.
-- Sami
Thomas Ferris Nicolaisen kirjoitti 6.7.2012 kello 11.30:
> Hi,
>
> We have a product which is split into a number of different Git repositories.
> They are built and released separately, but have dependencies on each other
> that we track by using the same branch-names and tags in each repository.
>
> To illustrate, here are three repositories with three branches in each:
>
> * repo "foo-library"
> master
> 2.17.x
> 2.16.x
>
> * repo "foo-framework" (depends on foo-library)
> master
> 2.17.x
> 2.16.x
>
> * repo "foo-application" (depends on foo-framework)
> master
> 2.17.x
> 2.16.x
>
>
> Each of these repositories have one job in Jenkins to build and deploy them
> into our Maven repository. The jobs trigger each other respectively.
>
> This works really well, as long as we stick to using one branch (master). But
> once we start doing work in the other branches we are running into trouble:
>
> When "foo-library" builds the 2.16.x branch, it should trigger builds
> downstream and also order them to build the 2.16.x branches in
> "foo-framework" and "foo-application".
>
> However, normal behavior is to build the branch with the latest changes
> (which may, or may not be 2.16.x).
>
>
> *** Our attempts at a solution ***
>
> We've tried parameterizing the downstream jobs with a ${GIT_BRANCH}, which is
> passed properly from the upstream job, and using it as branch-specifier in
> the downstream jobs: origin/${GIT_BRANCH}
>
> However, when a downstream job like foo-application is triggered from an SCM
> change, the GIT_BRANCH parameter is empty, and the build fails with no branch
> found.
>
> The knee-jerk reaction to that is to provide a default GIT_BRANCH value in
> case none is provided, like "origin/master". This limits the SCM-polling to
> only detect and run builds in the master branch. If we try specifying a
> default like "origin/*", the wildcard is not evaluated by the Jenkins Git
> plugin (Could not checkout origin/**).
>
> If we keep the default GIT_BRANCH as "origin/master", and add more branch
> specifiers (so we have one "origin/${GIT_BRANCH}" and one "origin/*", we come
> back to the problem that the latest changed branch is built, also when
> triggered from upstream.
>
> *** The sub-optimal solutions ***
>
> 1) Create SCM-trigger-sister jobs, whose only purpose is to scan for changes
> in SCM, and notify the real jobs with proper GIT_BRANCH parameters.
> 2) Stick to default GIT_BRANCH=origin/master, and teach our developers to
> manually trigger jobs in other branches when needed (having them punching in
> GIT_BRANCH=2.17.x when they want to run that branch).
>
> Problem with the first one is that we actually have around 40 jobs that do
> various things with our repositories, and about 30 of these would need new
> trigger-sister jobs. That's a lot of new Jenkins jobs to maintain, for
> something which sounds easy in principle..
>
> Problem with the second one is as with all manual work, it will be forgotten,
> old build artifacts will be assumed to be freshly built, confusion ensues,
> etc.
>
> I've scanned through the Jenkins plugins looking for something like a
> "conditional branch selector", but haven't found anything.
>
> If we express some logic in the Git branch specifier that says "if GIT_BRANCH
> parameter is null, just use the ** specifier", we'd be fine.
>
> Anyone have any ideas how we can pull this off?