Jenkins: Trigger Multi-branch pipeline on upstream change

Nitram picture Nitram · Apr 24, 2016 · Viewed 22k times · Source

I am currently testing the pipeline approach of Jenkins 2.0 to see if it works for the build environment I am using.

First about the environment itself. It currently consists of multiple SCM repositories. Each repository contains multiple branches, for the different stages of the development and each branch is build with multiple configurations. Not all configurations apply to every repository.

Currently every repository/branch is setup as a Matrix Project for the different configurations. Each project exposes it's building results as a artifact and these artifacts are used in the downstream projects.

The different repositories depend on each other, so a successful build on a upstream job triggers some specific down stream jobs. Currently all that works, but the amount of work required to setup a new branch or to tweak the building process is a lot, since many different projects need to be altered by hand.

Now I wanted to give the new pipelines a try. My idea was to create multi-branch pipeline projects and place a Jenkinsfile inside the repository containing the instructions for the build.

The main problem is getting the builds to trigger each other, because basically a build in a specific upstream branch, needs to trigger a downstream branch. How ever the information what downstream branches need to be triggered is not known to the upstream project. Each downstream project fetches the artifacts from some upstream branches and the ideal solution would be if the downstream build would be triggered in case the upstream build that is the source for the artifact finishes it's build.

The problem is only the downstream projects really know what artifacts they require. The branch names are unlikely to match in most cases and that makes triggering the builds from the upstream project very difficult.

Currently this is solved using the ReverseBuildTrigger. But this thing stops working as soon as it gets anywhere close to a pipeline.

I am really at a loss how to get this working. Is there any way to get something like the ReverseBuildTrigger working inside pipeline scripts?

Also triggering the entire downstream build for all branches in case a single branch upstream is changed is not a option. This would create far too many equal builds.

Answer

Japster24 picture Japster24 · May 9, 2017

If you're using a declarative multi-branch pipeline, you can use:

triggers {
  upstream(upstreamProjects: "some_project/some_branch", threshold: hudson.model.Result.SUCCESS)
}

If you wish for branch matching to occur across dependencies you can use:

triggers {
  upstream(upstreamProjects: "some_project/" + env.BRANCH_NAME.replaceAll("/", "%2F"), threshold: hudson.model.Result.SUCCESS)
}