I have a multi-branch pipeline job which does a build/test on a specific branch.
I would like to create a new Jenkins job, which 'loads' a new branch into the multi-branch pipeline, runs the pipeline 3 times with 3 different options then cleans up and removes the branch.
Here is my use case example:
Set up - add branch release-19.0.4 branch to multi-branch pipeline
Run multi-branch pipeline on branch release-19.0.4 with parameter support-version=19.0.3
Run multi-branch pipeline on branch release-19.0.4 with parameter support-version=19.0.0
Run multi-branch pipeline on branch release-19.0.4 with parameter support-version=18.0.0
Write report: support-version=19.0.3 - ok, support-version=19.0.0 - ok, support-version=18.0.0 - failed
Tear down - remove release-19.0.4 branch from mule-branch pipeline job.
I can use build pipeline task to build another job with different options and read the success or failure of that job in order to create my report. However I'm stuck on how to do steps 1) and 6) from within a Jenkinsfile.
I've tried to read through the Jenkins pipeline API's but nothing seems to fit. Any ideas how to do this via automation?
I have the following setup:
Pipeline A: starts at 10am
Pipeline B: starts at 12am
Now i want to add a dependency between those two pipelines. Pipeline B should only start if pipeline A ends with the status successfull. How can I achieve this?
There's two ways I know of:
You can add a stage to the end of pipeline A that executes pipeline B (see the build step). Use this method if you want to keep all of the build logic, including the inter-project dependencies, in the Jenkinsfile's.
Set build triggers inside of Jenkins in your pipeline project configuration. See the "Build after other projects are built" checkbox in the configuration for your pipeline project. Use this if you want to keep the dependency logic outside of your Jenkinsfile's.
I have a scenario where but I have 2 projects (A and B), both are configured in Jenkins with multibranch pipeline jobs, problem is that Project B depends on Project A.
So I find that some times when I check in code in Project A, I also need to build ProjectB once A was built. Now before I started investigating pipeline builds, I'd have a job per branch and then trigger in Jenkins the appropriate job for Project B for the appropriate branch.
What I'd like to set up in a Jenkinsfile so that when ProjectA/develop executes it then triggers the multibranch pipeline job for ProjectB and the same branch.
I have:
stage ('Trigger Tenant Builds') {
build job: "ProjectB/${branch}", wait: false
}
But my ProjectA pipeline fails with:
ERROR: No parameterized job named ProjectB/develop found
Any ideas?
I've resolved this now. What I am doing is defining an upstream trigger in project B's Jenkinsfile:
pipelineTriggers([
upstream(
threshold: hudson.model.Result.SUCCESS,
upstreamProjects: "/ProjectA/" + env.BRANCH_NAME.replaceAll("/", "%2F")
)
])
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.
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 :
Specify your SCM repository in the multibranch configuration
Call another build as part of your build/post-build as you would do in a standard freestyle project, except that you have to call a parameterized job (let's call it build-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)
In your 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.
The best way I have found is to use the Remote Jenkinsfile Provider plugin. https://plugins.jenkins.io/remote-file/
This will add an option "by Remote Jenkinsfile Provider plugin" under Build Configuration>Mode then you can point to another repo where the Jenkinsfile is. I find this to be a much better solution than the Pipeline Multibranch Defaults Plugin, which makes you store the Jenkins file in Jenkins itself, rather than in source control.
U can make use of this plugin
https://github.com/jenkinsci/pipeline-multibranch-defaults-plugin/blob/master/README.md
Where we need to configure the jenkinsfile on jenkins rather than having it on each branch of your repo
I have version 2.121 and you can do this two ways:
Way 1
In the multibranch pipeline configuration > Build Configuration > Mode > Select "Custom Script" and put in "Marker File" below the name of a file you will use to identify branches that you want to have builds for.
Then, below that in Pipeline > Definition select "Pipeline Script from SCM" and enter the "SCM" information for how to find the "Jenkinsfile" that holds the script you want to run. It can be in the same repo you are finding branches in to create the jobs (if you put in the same GitHub repo's info) but I can't find a way to indicate that you just use the same branch for the file.
Way 2
Same as above, in the multibranch pipeline configuration > Build Configuration > Mode > Select "Custom Script" and put in "Marker File" below the name of a file you will use to identify branches that you want to have builds for.
Then, below that in Pipeline > Definition select "Pipeline Script" and put a bit of Groovy in the text box to load whatever you want or to run some script that already got loaded into the workspace.
In my case, i have an escenario whith a gitlab project based on gradle who has dependencies on another gitlab preject based on gradle too (same dashboard, but differents commits, differents developers).
I have added the following lines into my Jenkinsfile (the one which depends)
stage('Build') {
steps {
git branch: 'dev', credentialsId: 'jenkins-generated-ssh-key', url: 'git#gitlab.project.com:root/coreProject.git'
sh './gradlew clean'
}
}
Note: Be awark on the order on the sentences.
If you have doubt on how to create jenkins-generated-ssh-key please ask me
Will the Build Pipeline plugin still show the sequence of jobs properly if the jobs are run using Build Flow (including a repeated job)?
Here is pseudocode for our build flow:
build("Package")
build("Deploy", destination: "http://test") // deploy to our test environment
build("IntegrationTests", target: "http://test") // run automated tests
build("Deploy", destination: "http://stage") // deploy to stage
Package will pull code from source control, compile it, and store it as an artifact
Deploy will copy artifacts from the upstream Package job then copy it to the URL provided in the destination parameter
IntegrationTests will run a suite of integration tests against the URL provided in the destination parameter.
Will the Build Pipeline plugin show this pipeline as 4 steps even though the Deploy job is repeated?
Package => Deploy (test) => IntegrationTests => Deploy (stage)
The new solution, which is being adopted with Jenkins 2.0, is the Pipeline plugin. Also, CloudBees open-sourced their Pipeline Stage View plugin which provides a visualization to the Pipeline plugin.