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}"
}
}
}
}
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
I am interested in analysising my Jenkins builds via SonarQube. Initially, I have used the following code
stage('SonarCloud') {
steps {
withSonarQubeEnv('SonarQube') {
sh 'mvn clean package sonar:sonar '
}
}
}
However, I have asked here about how can I specify the quality gate that server uses for my analysis. From the answer provided, I have modified my code to look like this
stage('SonarCloud') {
steps {
withSonarQubeEnv('SonarQube') {
script{
def projectName = "Some-Exp"
// Creating a fresh project and placing it on the server - Works fine
sh "curl -u ${env.SONAR_AUTH_TOKEN} '${env.SONAR_HOST_URL}/api/projects/create' -d 'name=${projectName}&project=${projectName}&branch=${env.BRANCH_NAME}'"
// Specifying Quality Gate that to be used when performing our analysis - Does not quite work
sh "curl -u ${env.SONAR_AUTH_TOKEN} '${env.SONAR_HOST_URL}/api/qualitygates/select' -d 'gateId=2&projectKey=${projectName}'"
// Analysing our project - Creates the entirely new project, much like the initial code did
sh "mvn sonar:sonar -Dsonar.host.url=${env.SONAR_HOST_URL}"
}
}
}
}
The code creates and places a project on SonarQube server, but the said project still has a default quality gate, and it contains no analysis (in fact, current code creates an identical output to the one created by sh 'mvn clean package sonar:sonar ' line that I have used initially). There are no errors or anything. The problem is that the code does not do what I would like it to do.
This post mentioned that I need to add my project to profile group, before analysing it (which makes a lot sense). Tried to add sh "curl -u ${env.SONAR_AUTH_TOKEN} '${env.SONAR_HOST_URL}/api/qualityprofiles/add_project'" with some parameters but it didn't help that much.
I wonder what am I missing. I think the final line needs to be parametrised but I could not find anything that would make it work.
I have created a sample Maven project and run sonar analysis from Jenkins. Also, I have used the Web API to assign the QualityGate.
You can use the below Jenkinsfile as an example, to do sonar analysis.
Jenkinsfile
pipeline {
agent any
tools {
maven 'MAVEN_HOME1'
}
stages {
stage('Git') {
steps {
git credentialsId: 'gitlab-test', url: 'https://example.com/gitlab/repo1/simple-java-maven-app.git'
}
}
stage('Maven Install') {
steps {
sh "mvn install"
}
}
stage('Create Sonar Proejct') {
steps {
sh 'curl -X POST -u "admin:admin" "https://example.com/sonarqube/api/projects/create?name=stackoverflow&project=stackoverflow"'
}
}
stage('Set Quality Gate') {
steps {
sh 'curl -u "admin:admin" -X POST "https://example.com/sonarqube/api/qualitygates/select?projectKey=stackoverflow&gateId=10100"'
}
}
stage('Sonarqube Analysis') {
steps {
sh """mvn -U install sonar:sonar -Dsonar.host.url=https://example.com/sonarqube/ -Dsonar.login=7yha3f47967iuednd8cd -Dsonar.projectKey=stackoverflow -Dsonar.projectName=stackoverflow -Dsonar.sources=. -Dsonar.java.binaries=**/* -Dsonar.language=java -Dsonar.exclusions=src/test/java/com/mycompany/app/AppTest.java"""
}
}
}
}
Please find below the SonarQube Analysis Result and other screenshots, for your reference.
Screenshots:
Jenkins Console Output:
List of Available QualityGate:
Note: In the above image, "id":10040,"name":"SonarQube way" is the default QualityGate. I have used "id":10100,"name":"SASSonarQube way" for setting Quality Gate to analyze the project stackoverflow using Web API. All are marked in yellow
SonarQube Analysis
In above image, you can see the Quality Gate SASSonarQube way has been used to do sonar analysis. Marked in yellow
I'm testing a Job in Jenkins with Declarative Pipelines, the job is simple it does a maven test.
When I set maven and jdk in the tools in the declarative pipeline, and then I do mvn test, it works everything goes fine.
But when I use directely a shell command this does not work.
Everything goes fine when I do this:
pipeline{
agent {label "linux-slave-01"}
tools { maven : "Maven 3.2"
jdk : "oracle-jdk-1.8"
}
stages{
stage{
steps{
mvn test
}
}
}
}
But this does not work :
pipeline{
agent {label "linux-slave-01"}
stages{
stage{
steps{
sh ("JAVA_HOME = /xxx/xxx /xx/bin/mvn test")
}
}
}
}
I get this error :
Error: Could not find or load main class org.codehaus.plexus.classworlds.launcher.Launcher
I fixed this with adding the appropriate $M2_HOME to the PATH in jenkins configuration.
I am currently trying to implement pipeline in jenkins using jenkinsfile and i am executing a maven project on windows machine. I am creating a pipeline job in jenkins and i have checked in this file in my github repository and when i am running the job in jenkins , i am getting following error.
My jenkinsfile:
pipeline {
agent any
stages {
stage('Compile stage') {
steps {
maven(maven : 'Maven_3.5.2'){
bat "mvn clean compile"
}
}
}
stage('testing stage') {
steps {
maven(maven : 'Maven_3.5.2'){
bat "mvn test"
}
}
}
stage('deployment stage') {
steps {
maven(maven : 'Maven_3.5.2'){
bat "mvn deploy"
}
}
}
}
}
I am getting below error when i am running it through jenkins job-
Jenkins error:
java.lang.NoSuchMethodError: No such DSL method 'withMaven' found
among steps [archive, bat, build, catchError, checkout, deleteDir,
dir, dockerFingerprintFrom, dockerFingerprintRun, echo, emailext,
emailextrecipients, envVarsForTool, error, fileExists, getContext,
git, input, isUnix, library, libraryResource, load, mail, milestone,
node, parallel, powershell, properties, pwd, readFile, readTrusted,
resolveScm, retry, script, sh, sleep, stage, stash, step, svn,
timeout, timestamps, tm, tool, unarchive, unstash,
validateDeclarativePipeline, waitUntil, withContext, withCredentials,
withDockerContainer, withDockerRegistry, withDockerServer, withEnv,
wrap, writeFile, ws] or symbols [all, allOf, always, ant,
antFromApache, antOutcome, antTarget, any, anyOf, apiToken,
architecture, archiveArtifacts, artifactManager, authorizationMatrix,
batchFile, booleanParam, branch,
Any help?
This means you don't have withMaven as an available DSL method. Most of the time this means you don't have a plugin installed. In this case, the Pipeline Maven Integration plugin is required. https://plugins.jenkins.io/pipeline-maven/
Try this:
pipeline {
agent any
tools {
maven 'Maven_3.5.2'
}
stages {
stage('Compile stage') {
steps {
bat "mvn clean compile"
}
}
stage('testing stage') {
steps {
bat "mvn test"
}
}
stage('deployment stage') {
steps {
bat "mvn deploy"
}
}
}
}
Reference: https://jenkins.io/doc/book/pipeline/syntax/
On top of Rob Hales' answer, it is called "Pipeline Maven Integration Plugin" in Jenkins ver. 2.73.3 or later
You need to install all listed "pipeline" plugin and error no longer will be there.