Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Triggering Branch Indexing on Multibranch Pipelines (Jenkins/Git)

I'm trying to automatically trigger 'Branch Indexing' on a Multibranch Pipelines job in Jenkins.

At the moment, only one method seems to actually work, which is polling, but I am unable to do that and polling is a bad solution anyway.

The plug-in doesn't support 'Trigger builds remotely (e.g., from scripts)' (options are not saved), so I cannot trigger it via a web hook on push etc.

I tried creating a 'trigger' freestyle build on the repo but the 'Post-build Actions - Build other projects' claims the Multibranch Pipeline project is not a buildable project.

If polling is the only way I can do this, then I need to disable automatic SCM triggering (otherwise we get duplicate builds when we re-index) because I'll need to enable web hook triggering on the branch projects.

But that doesn't work, because I'm setting up the web hook via a pipeline script in the branch project, and you need to have built it at least once to have that property registered.

I've been going around in circles for a while, so hopefully I've just missed something obvious, but any help would be appreciated.

I imagined being able to do one of the following

  • Somehow trigger the multi-branch project as a downstream project

  • Poll the multibranch project, and only build branch projects which have not been built before

Cheers

like image 260
Lee Winder Avatar asked Jan 10 '17 22:01

Lee Winder


People also ask

What is Jenkins branch indexing?

Branch indexing discovers new or deleted branches. In the job configuration (Branch Sources > Property strategy), you can activate Suppress automatic SCM triggering, which will not automatically build new branches.

How do I add a branch to Multibranch pipeline?

Head over to your Jenkins instance and create a new item. Enter a name for the job, and select the “Multibranch Pipeline” option at the end of the screen. Then, click on the OK button. In the next screen, go to the “Branch sources” tab, click on the “Add source” button, and choose “Git” from the dropdown menu.


2 Answers

The method ComputedFolder.scheduleBuild() can be invoked from a groovy script.

I have just triggered branch indexing in one multibranch pipeline project from the groovy code in a different multibranch pipeline project, which is then triggering a downstream build in that project.

The code is something like:

@NonCPS
void scanRepo(String downStreamProjectName) {
    Jenkins.instance.getItemByFullName(downStreamProjectName).scheduleBuild()
}
...
String downStreamProject = 'my-folder/my-multibranch-project'
String downStreamJob = "${downStreamProject}/${env.BRANCH_NAME}"
if (Jenkins.instance.getItemByFullName(downStreamJob) == null) {
    scanRepo(downStreamProject)
    while (Jenkins.instance.getItemByFullName(downStreamJob) == null) {
        sleep(1)
    }
}
build([job: downStreamJob, wait: false, quietPeriod: 0])

Notice that Jenkins.instance.getItemByFullName(downStreamProjectName) is the WorkflowMultiBranchProject which is not Serializable, so some care needs to be taken.

like image 111
jjc Avatar answered Sep 28 '22 09:09

jjc


Based on @jjc's answer, I've created a version using the build step also for triggering the scan:

String downStreamProject = 'my-folder/my-multibranch-project'
String downStreamJob = "${downStreamProject}/${env.BRANCH_NAME}"
if (Jenkins.instance.getItemByFullName(downStreamJob) == null) {
    // we would need "wait: true", which is not possible as of now
    // https://github.com/jenkinsci/pipeline-build-step-plugin/blob/3ff14391fe27c8ee9ccea9ba1977131fe3b26dbe/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStepExecution.java#L66
    build job: downStreamProject, wait: false
    // continue only once the expected job appears
    while (Jenkins.instance.getItemByFullName(downStreamJob) == null) {
        sleep(1)
    }
}
build downStreamJob

This requires the following signatures to be approved:

  • method jenkins.model.Jenkins getItemByFullName java.lang.String
  • staticMethod jenkins.model.Jenkins getInstance
like image 20
StephenKing Avatar answered Sep 28 '22 08:09

StephenKing