How to let Jenkins pipeline build only for given branches - jenkins-pipeline

In the following pipeline, I am trying to check out only develop branch to build the given project. How do I make sure that the pipeline only run develop, master and release branches?
Should I add separate stages for master branch and another for release branch. Instead I am trying to let this pipeline build only when there are changes in develop or master or release branches and ignore building for any other branches.
In Jenkins > Freestyle project > Source code management > Git > User can enter specific branches in Branch specifier. How can I implement similar one using pipeline?
pipeline {
agent any
tools {
maven "${mvnHome}"
jdk 'jdk8'
}
stages {
stage('Checkout project') {
steps {
git branch: 'develop',
credentialsId: 'someid',
url: 'https://project.git'
}
}
stage('build') {
steps {
sh '''
mvn clean deploy
'''
}
}
}
}

You can use a Multibranch Pipeline project and add at its Branch Sources → Git → Behaviours:
Filter by name (with regular expression)
A Java regular expression to restrict the names. Names that do not match the supplied regular expression will be ignored.
NOTE: this filter will be applied to all branch like things, including change requests
Filter by name (with wildcards)
Include
Space-separated list of name patterns to consider. You may use * as a wildcard; for example: master release*
NOTE: this filter will be applied to all branch like things, including change requests
Exclude
Space-separated list of name patterns to ignore even if matched by the includes list. For example: release alpha-* beta-*
NOTE: this filter will be applied to all branch like things, including change requests

Well, you can write conditions in groovy to do this using when statement. Something like this
stage('build'){
when {
expression {
env.BRANCH_NAME == 'develop' || env.BRANCH_NAME == 'master'
}
}
steps{
script{
sh 'mvn clean deploy '
}
}
}

Related

Jenkins configuration for a project with local project dependencies

I have a automation project which makes use of .jar of a util project. I am very new to Jenkins so can somebody guide me as to how to create a jenkin job and handle local project jar dependencies aswell.
Since this is jenkins pipeline you need to do the following.
Create a repo with a jenkinsfile*
Create a multi branch pipeline job in jenkins and point to your repo.
When a build is started it will interpret your jenkinsfile and execute all the defined steps.
By making use of a .jar what do you mean? Is it an executable on the same machine? In that case add it to your path and use it when executing a shell or a bat script in the jenkinsfile.
More info here: https://www.jenkins.io/doc/book/pipeline/
*Example jenkinsfile:
pipeline {
agent any
options {
//Discard old builds, not necessary but nice to have
buildDiscarder(logRotator(numToKeepStr: '30', artifactNumToKeepStr: '20'))
}
environment {
// Example of how to retrieve credentials and set them as environment variables
EXAMPLE_CREDENTIAL= credentials('EXAMPLE_CREDENTIAL')
}
stages {
stage('A build step') {
steps {
// do your stuff here, this can also be divided into several stages like one for building the code and one for executing it
}
}
}
// Post build actions, e.g archiving, clean up etc
post {
always {
archiveArtifacts artifacts: '**/*.*', fingerprint: true
deleteDir()
}
}
}
I would not build in dependencies to local projects. If it's just an executable .jar file you can add it as a secret file the same way you add credentials and while executing the job copy it to your workspace like this:
environment {
FILE = credentials('my_file')
}
stages {
stage('Preperation'){
steps {
// Copy your fie to the workspace
sh "cp ${FILE} ${WORKSPACE}"
// Verify the file is copied.
sh "ls -la"
}
}
}
An alternative could be adding the file to your path and access the executable via the command line when executing the job.
If you want the whole project I would definitely check that out. I.e you need to add a a shell command for checking the project out.
Thanks Jan for your direction. I achieved output with the following code:
pipeline
agent any <br/>
stages {<br/>
stage('Building dependent project') { <br/>
steps {<br/>
echo "Building dependent project"<br/>
git (
url: 'https:**********.git',
credentialsId: '***********************',
branch: "master"
)
sh "mvn clean install -DskipTests"
}
}
stage('Building and testing main Project') {
steps {
git (
url: 'https://************.git',
credentialsId: '******************',
branch: "exp3"
)
sh "mvn clean install -Dapp=${App} -Denv=${Envir} -Dversion=${Version}"
}
}
}
}

Jenkins maven project violation report in pipeline project

I am trying to convert jenkins maven project to pipeline project, we have mvn clean install step and next violation plugin can someone help me How to include violation report in pipeline project (check style and findbugs)
In declarative style, using the new Warnings Next Generation plugin, you would do something like
pipeline {
agent any
stages {
... pre-conditions & other stuff previously handled by your jenkins maven job ...
stage('Build') {
steps {
withMaven {
sh 'mvn clean install'
}
}
}
... post-conditions previously handled your jenkins maven job ...
}
post {
always {
recordIssues(
enabledForFailure: true, aggregatingResults: true,
tools: [java(), checkStyle(pattern: 'checkstyle-result.xml', reportEncoding: 'UTF-8'), findBugs(pattern: 'findbugs.xml')]
)
}
}
}
See the pipeline documentation page for more details about syntax etc

Split Jenkins pipeline into environment part and stages part as a template

We use a Jenkins server to create multiple iOS/Android projects with Unity and Xcode. At the moment we have a single Jenkins file in each root directory of our project repositories with the entire configuration and build steps in one file:
pipeline {
agent any
environment {
REPOSITORY_URL = 'ssh://git#XYZ.git'
PROJECT_SUBDIR = ''
BUILD_FOR_ANDROID = 'true'
BUILD_FOR_IOS = 'true'
UNITY_VERSION = '2018.4.0f1'
}
// how to load this from a template file? -->
stages {
stage('Checkout') {
steps {
script {
if (env.PROJECT_SUBDIR) {
env.PROJECT_DIR = sh(
script: "echo ${env.WORKSPACE}/${env.PROJECT_SUBDIR}",
returnStdout: true
).trim()
} else {
env.PROJECT_DIR = sh(
script: "echo ${env.WORKSPACE}",
returnStdout: true
).trim()
}
}
// more stuff ...
}
}
}
// <--
}
Is it possible to load the part "stages" from another file (e.g. a template) during the build process? This would separate the project-dependent configuration part from the common "stages" part and I could update the build process for all project repositories in a single or versioned template file?
How would it work with the environment variables? Are they still in the same context or do I have to pass them?
That was a good advice.
I managed it by using the last approach mentioned on this page:
https://jenkins.io/doc/book/pipeline/shared-libraries/#defining-declarative-pipelines
So I copied my pipeline in my groovy file called
/vars/run_pipeline_template.groovy
in my new repository. Before that I called it pipeline.groovy which wasn't my best idea because that is a protected keyword. I left the definitions of my environment variables in the former Jenkinsfile. They can still be accessed by env.VAR_NAME without the need to forward them to the library script. The library is in its own Git repository and I added this library to the Jenkins configuration in section Global Pipeline Libraries. And this solves the version problem as well, because you can define which branch/tag/hash is used when importing the library template in the Jenkinsfile.
Thank you.

Sonar branch plugin does not show anything

I've installed the opensource branch plugin on sonarqube 7.0.0 (the 1.0.1 release): https://github.com/msanez/sonar-branch-community
I've configured a pipeline step in Jenkins for a multibranch pipeline:
stage('Sonar Analyse'){
tools {
jdk 'ORACLE-JDK8-x86_64'
}
steps {
withSonarQubeEnv('SonarQube Test') {
dir('path') {
sh 'mvn -B sonar:sonar -Dsonar.branch.name=my-multi-branch'
}
}
}
}
After a run I can see the new branch in sonarqube. I can switch between the master and my multi-branch. While the master contains info about vulnerabilities, coverage, tests, code smells etc I can't see anything for my new branch:
We couldn't find any results matching selected criteria. Try to change
filters to get some results.
This is showing up when I click on my-multi-branch while all filters are reset. Am I missing some configuration in sonarqube/jenkins/maven?
I've switched between short and long living branches but same issue.
Have you tried using the "when" condition?
For example:
stage ('sonar-branch'){
when {
not {
branch 'master'
}
}
steps {
sh 'mvn -B sonar:sonar -Dsonar.branch=${env.BRANCH_NAME}'
}
}
Take a look at this link.

Pass Artifact or String to upstream job in Jenkins Pipeline

Goal
I'm trying to orchestrate a dependency chain using the GitHub organization plugin along with the jenkins pipeline.
As the products I'm building have a number of shared dependencies, I'm using nuget packages to manage dependency versioning and updates.
However, I'm having trouble getting necessary artifacts/info to the projects doing the orchestration.
Strategy
On a SCM change any upstream shared libraries should build a nuget package and orchestrate any downstream builds that need new references:
I am hardcoding the downstream orchestration in each upstream project. So if A is built, B and C with dependencies on A will be built with the latest artifact from A. After that, D with dependencies on B and C, and E with dependencies on A and C will be built with the latest artifacts from A, B, C as needed. And so on. These will all be triggered from the Jenkinsfile of A in stages as dependencies are built using the "Build Job: Jobname" syntax. I couldn't find a solution by which I could just pass the orchestration downstream at each step as the dependencies diverge and converge downstream and I don't want to trigger multiple builds of the same downstream project with different references to upstream projects.
I can pass the artifact information for the parent project down to any downstream jobs, but the problem I'm facing is that, the parent project doesn't have any assembly versioning information for downstream artifacts (needed to orchestrate jobs further downstream). Stash/Unstash doesn't seem to have any cross-job functionality and archive/unarchive has been deprecated.
TLDR:
I need a method of either passing a string or text file upstream to a job mid-execution (from multiple downstream jobs) OR I need a method for multiple dowstream jobs with shared downstream dependencies to coordinate and jointly pass information to a downstream job (triggering it only once).
Thanks!
This article can be useful for you - https://www.cloudbees.com/blog/using-workflow-deliver-multi-componentapp-pipeline
sometimes Artifact way is needed.
upstream job:
void runStaging(String VERSION) {
stagingJob = build job: 'staging-start', parameters: [
string(name: 'VERSION', value: VERSION),
]
step ([$class: 'CopyArtifact',
projectName: 'staging-start',
filter: 'IP',
selector: [$class: 'SpecificBuildSelector',
buildNumber: stagingJob.id
]
]);
IP = sh(returnStdout: true, script: "cat IP").trim()
...
}
downstream job
sh 'echo 10.10.0.101 > IP'
archiveArtifacts 'IP'
I ended up using the built-in "archive" step (see syntax in pipeline syntax) in combination with copyArtifact plugin (must use Java style step with class name).
I would prefer to be able to merge the workflow rather than having to orchestrate the downstream builds in each build with anything to build downstream, but haven't been able to find any solutions to that end thus far.
You could use the buildVariables of the build result.
Main job - configuration: pipeline job
node {
x = build job: 'test1', quietPeriod: 2
echo "$x.buildVariables.value1fromx"
}
test1 - configuration: pipeline job
node {
env.value1fromx = "bull"
env.value2fromx = "bear"
}

Resources