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
Based on @jjc's answer, I've created a version using the
build
step also for triggering the scan:This requires the following signatures to be approved:
method jenkins.model.Jenkins getItemByFullName java.lang.String
staticMethod jenkins.model.Jenkins getInstance
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:
Notice that
Jenkins.instance.getItemByFullName(downStreamProjectName)
is theWorkflowMultiBranchProject
which is notSerializable
, so some care needs to be taken.The easiest option by far (that I'm aware of) is to remotely tell the Jenkins Git plugin that there's a new commit for a defined repository. However, this will not trigger Jenkins to start a job immediately. What happens is that the Git plugin starts (re-)indexing the specific repository. The Jenkins job is then started if changes are detected.
From your repository (GitHub, GitLab, etc.) you should trigger the following URL:
http://my-jenkins-host/git/notifyCommit?url=git@gitlab.example.com:group/repository.git&delay=0sec
The value for
url
must match the SCM URL you configured in the Jenkins job (Git plugin)!Gotcha: it may be that your Jenkins is not deployed under the root context (
/
) in which case the URL would behttp://my-jenkins-host/context-path/git/...