patterngitMinor
Is there a way to use a Jenkinsfile from a git-submodule in a multibranch pipeline?
Viewed 0 times
pipelinemultibranchwayjenkinsfilegitsubmodulefromthereuse
Problem
Background:
The nature of our project's source involves multiple long-living branches, each one has its own Jenkins job (manually created).
Multibranch limitation:
Unfortunately we do not use a Multibranch Pipeline to organize the project, because when (for example) a change is needed in the Pipeline, it would need to be added (manually) to each of the long-living branches' Jenkinsfiles.
Current implementation:
We store the Jenkinsfile in a separate repository (let's call it ci-repo), which is added as a submodule to the project's repository (let's call that dev-repo).
What still hurts:
We need to manually monitor branches of the dev-repo and manage job creation.
Multibranch pipelines support submodule checkout for source files, but branch discovery requires presence of a Jenkinsfile under the parent repository (in our case dev-repo).
The question:
Jenkinsfile from git-submodule of Multibranch Pipeline - Is there a way to do this?
Perhaps using an initial/mock Jenkinsfile in the dev-repo, with one stage in which is calls the Jenkinsfile from the submodule?
Can a Jenkinsfile be over-written or replaced somehow during runtime?
The nature of our project's source involves multiple long-living branches, each one has its own Jenkins job (manually created).
Multibranch limitation:
Unfortunately we do not use a Multibranch Pipeline to organize the project, because when (for example) a change is needed in the Pipeline, it would need to be added (manually) to each of the long-living branches' Jenkinsfiles.
Current implementation:
We store the Jenkinsfile in a separate repository (let's call it ci-repo), which is added as a submodule to the project's repository (let's call that dev-repo).
What still hurts:
We need to manually monitor branches of the dev-repo and manage job creation.
Multibranch pipelines support submodule checkout for source files, but branch discovery requires presence of a Jenkinsfile under the parent repository (in our case dev-repo).
The question:
Jenkinsfile from git-submodule of Multibranch Pipeline - Is there a way to do this?
Perhaps using an initial/mock Jenkinsfile in the dev-repo, with one stage in which is calls the Jenkinsfile from the submodule?
Can a Jenkinsfile be over-written or replaced somehow during runtime?
Solution
I agree with Omri that you are heading the wrong way. I would recommend using a shared library which implements the pipeline. You would then have a simple Jenkins file which looks all the same. See https://jenkins.io/blog/2017/10/02/pipeline-templates-with-shared-libraries/
Let's say you have a shared library which contains a
Then you can have a
Let's say you have a shared library which contains a
vars/commonpipeline.groovy which contains something like this:def call(body) {
// evaluate the body block, and collect configuration into the object
pipelineParams= [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = pipelineParams
body()
pipeline {
agent {
label pipelineParams.nodes
}
options {
buildDiscarder(logRotator(artifactNumToKeepStr: '1', numToKeepStr: '10'))
disableConcurrentBuilds()
timestamps()
timeout(time: pipelineParams.timeout, unit: 'MINUTES')
}
stages {
stage('Build') {
steps {
//TO SOMETHING
}
}
}
}
}Then you can have a
Jenkinsfile in your dev project which loads the library and uses the common pipeline like this:import org.apache.commons.io.FileUtils
library identifier: 'shared-pipeline-library@master', retriever: modernSCM(
[$class: 'GitSCMSource',
remote: 'https://bitbucket/jenkins/hared-pipeline-library.git',
credentialsId: 'bitbucket.service.user'
])
commonpipeline {
nodes = 'BUILD' /* label of jenkins nodes*/
timeout = '60'
}Code Snippets
def call(body) {
// evaluate the body block, and collect configuration into the object
pipelineParams= [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = pipelineParams
body()
pipeline {
agent {
label pipelineParams.nodes
}
options {
buildDiscarder(logRotator(artifactNumToKeepStr: '1', numToKeepStr: '10'))
disableConcurrentBuilds()
timestamps()
timeout(time: pipelineParams.timeout, unit: 'MINUTES')
}
stages {
stage('Build') {
steps {
//TO SOMETHING
}
}
}
}
}import org.apache.commons.io.FileUtils
library identifier: 'shared-pipeline-library@master', retriever: modernSCM(
[$class: 'GitSCMSource',
remote: 'https://bitbucket/jenkins/hared-pipeline-library.git',
credentialsId: 'bitbucket.service.user'
])
commonpipeline {
nodes = 'BUILD' /* label of jenkins nodes*/
timeout = '60'
}Context
StackExchange DevOps Q#9243, answer score: 3
Revisions (0)
No revisions yet.