I have a Git repository with code I'd like to build but I'm not "allowed" to add a Jenkinsfile
in its root (it is a Debian package so I can't add files to upstream source). Is there a way to store the Jenkinsfile
in one repository and have it build code from another repository? Since my code repository has several branches to build (one for each Debian release) this should be a multibranch pipeline. Commits in either the code or Jenkinsfile
repositories should trigger a build.
Bonus complexity: I have several code/packaging repositories like this and I'd like to reuse the same Jenkinsfile
for all of them. Thus it should somehow dynamically fetch the right Git URL to use. The branches to build have the same names across all repositories.
Jenkins Pipeline Vs. Multibranch Pipeline. A multibranch pipeline is meant for building multiple branches from a repository and deploy to multiple environments if required. A pipeline job supports both pipeline steps to be added in Jenkins configuration and form SCM.
A multi-branch pipeline project always includes a Jenkinsfile in its repository root. Jenkins automatically creates a sub-project for each branch that it finds in a repository with a Jenkinsfile . Multi-branch pipelines use the same version control as the rest of your software development process.
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.
Short answer is : you cannot do that with a multibranch pipeline
. Multibranch pipelines are only designed (at least for now) to execute a specific pipeline in Pipeline script from SCM
style, with a fixed Jenkinsfile
at the root of the project.
You can however use the Multi-Branch Project plugin made for multibranch freestyle projects. First, you need to define your multibranch freestyle configuration
just like you would with a multibranch pipeline configuration
. Select this new item like shown below :
This type of configuration will behave exactly same as the multibranch pipeline
type, i.e. it will create you a folder with the name of your configuration and a sub-project for each branch it automatically detected.
The implementation should then be a piece of cake :
SCM
repository in the multibranch configurationbuild-job
) and give it your repository information, i.e. Git URL and current branch (you can use the pre-defined variables $GIT_URL
and $GIT_BRANCH
for this purpose)build-job
, just define either an inline pipeline or a pipeline script checked out from SCM, and inside this script do a SCM checkout and go on with the steps you need to build. Example of build-job
pipeline content :.
node() { stage 'Checkout' checkout scm: [$class: 'GitSCM', branches: [[name: '*/${GIT_BRANCH}']], userRemoteConfigs: [[url: '${GIT_URL}']]] stage 'Build' // Build steps... }
Of course if your different multibranches projects need to be treated a bit differently, you could also use intermediate projects (let's say build-project-A
, build-project-B
, ...) that would in turn call the generic build-job
pipeline)
The one, major drawback of this solution is that you will only have one job responsible for all of your builds, making it harder to debug. You would still have your multibranch projects going blue/red in case of success/error but you will have to go back to called build-job
to find the real problem of your build.
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