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
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.
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.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With