Git – Duplicate builds triggered on Jenkins multibranch pipeline

bitbucketbitbucket-servergitJenkinsjenkins-pipeline

We are seeing duplicate builds triggered on Jenkins multibranch pipeline projects. Builds are normally triggered using push notifications from Bitbucket using this plugin: https://marketplace.atlassian.com/plugins/com.nerdwin15.stash-stash-webhook-jenkins/server/overview

However, we are now seeing 'double' builds for some reason. If you look at the 2 builds that are triggered, one is triggered by a 'commit notification', and the other is triggered by 'Branch Indexing'.

What is causing the branch indexing, and why is it triggering a build? We are not adding or deleting branches, it's just a normal commit/push.

To make it more complicated, it's not happening all the time. At one point I thought it was only happening after merges, but that's not the case. Also, one way to stop it seems to be by deleting the build history for a job (which obviously isn't ideal).

We are setting properties on the job from the pipeline script, but only to discard old builds:

properties([buildDiscarder(logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '', numToKeepStr: '20'))])

Another source of confusion seems to be if one should have polling enabled (with no interval) in order for push notifications to work for the Git plugin. The documentation for the Git plugin indicates this is required, and indeed seems to be for 'normal' pipeline builds, but doesn't seem to be required for multibranch pipeline builds. Is this correct? From the Jenkins Git Plugin wiki:

This will scan all the jobs that:

Have Build Triggers > Poll SCM enabled. No polling Schedule is
required. Are configured to build the repository at the specified URL
Are configured to build the optionally specified branches or commit ID
For jobs that meet these conditions, polling will be immediately
triggered. If polling finds a change worthy of a build, a build will
in turn be triggered.

We are using Bitbucket 4.8.4 and Jenkins 2.30 (and all the latest pipeline plugins).

Best Answer

As the other answer already suggested the "Do not allow concurrent builds" option is what you want. And you can get that via the Jenkinsfile:

 properties ([
      buildDiscarder(logRotator(artifactNumToKeepStr: '5', daysToKeepStr: '15')),
      disableConcurrentBuilds()
    ])

EDIT:

This is not the solution for the actual problem here. but it still seems helpful to some people, so I'll leave it as long as we don't have a better answer.