Maven Release Plugin use in Jenkins Pipeline Maven Release Plugin use in Jenkins Pipeline git git

Maven Release Plugin use in Jenkins Pipeline


IMHO with the advent of git and pull requests, I don't think using maven-release-plugin or maven-version-plugin with a Jenkins pipeline is a good idea.

Using Multibranch Pipeline with the versioning technique mentioned here is more in line with continuous delivery:https://axelfontaine.com/blog/dead-burried.html

Using the versioning technique above, the pom.xml now looks like this:

<project>    ...    <version>${revision}</version>    <properties>        <!-- Sane default when no revision property is passed in from the commandline -->        <revision>0-SNAPSHOT</revision>    </properties>    <scm>        <connection>scm:git:your-git-repo-url</connection>    </scm>    <distributionManagement>        <repository>            <id>artifact-repository</id>            <url>your-artifact-repo-url</url>        </repository>    </distributionManagement>    <build>        <plugins>            <plugin>                <artifactId>maven-scm-plugin</artifactId>                <version>1.9.5</version>                <configuration>                   <tag>${project.artifactId}-${project.version}</tag>                </configuration>            </plugin>        </plugins>    </build>    ...</project>

You can now produce releases on your Jenkins server very easily by configuring a Multibranch Pipeline with a Jenkinsfile to build on all branches and deploy only from master branch:

pipeline {  agent any  environment {    REVISION = "0.0.${env.BUILD_ID}"  }  triggers {    pollSCM('')  }  options {    disableConcurrentBuilds()    buildDiscarder(logRotator(numToKeepStr: '30'))  }  tools {    maven '3.5.2'    jdk 'jdk8'  }  stages {    stage ('Initialize') {      steps {        sh '''          echo "PATH = ${PATH}"          echo "M2_HOME = ${M2_HOME}"        '''      }    }    stage ('Build') {      steps {        sh 'mvn clean package'      }    }    stage ('Deploy') {      when {        branch 'master'      }      steps {        script {          currentBuild.displayName = "${REVISION}"        }        sh 'mvn deploy scm:tag -Drevision=${REVISION}'      }    }  }} 

See https://jenkins.io/blog/2017/02/07/declarative-maven-project/#set-up on how to configure a Multibranch Pipeline.

With this technique you develop only on non-master branches. Then create a pull request to merge your changes back to master branch. This should then deploy your artifact automatically to your artifact repository.


Addendum

When publishing to a Maven repository using the above method, the pom.xml will not have the proper version. To get Maven to publish the proper version, use the flatten-maven-plugin: http://www.mojohaus.org/flatten-maven-plugin/usage.html.

Also, check out: https://maven.apache.org/maven-ci-friendly.html


Thanks to @Daniel Omoto comment, I found out that Jenkins provides option for GIT polling. One is exactly what I needed (and the provided example is for maven-release-plugin!):

GIT poll screenshot


In case somebody has the same problem with the loop or that subsequent builds get triggered BUT has a Trigger who starts the jenkins pipeline on every push to the repository (Instead of polling).

Here is who I did it: I checked if the last commit contains "[maven-release-plugin]" in the comment.

Code in jenkinsfile:

def lastCommit = sh returnStdout: true, script: 'git log -1 --pretty=%B'if (lastCommit.contains("[maven-release-plugin]")){            sh "echo  Maven release detected"  //dont trigger build        } else {            sh "echo Last commit is not from maven release plugin" //do build steps             <..build Job...>        }