Maven Release Gitflow
Published on Jul 23, 2012 by Vincent Demeester.
Introduction
I like a lot the gitflow way of managing project. When working on maven project, there is few great plugins that helps to get the work done. One of them is maven-release-plugin.
Inspired on this gist, I’ve come with a cool way of doing things (let say we want to release a 0.1 version of an artifact) :
Prepare the pom.xml.
It needs <scm>
entries, <distributionManagement>
entries (to know
where to deploy the release artifact) and few options for the
maven-release-plugin :
{{< highlight xml >}}
<project> <!-- […] --> <build> <plugins> <!-- […] --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>2.3.2</version> <configuration> <tagNameFormat>v@{project.version}</tagNameFormat> <pushChanges>false</pushChanges> <localCheckout>true</localCheckout> </configuration> </plugin> <!-- […] --> </plugins> </build> <!-- […] --> </project>
Few explanation here :
tagNameFormat
is here to change the default tag name (which is${project.artifactId}-${project.version}
) to a better one.pushChanges
set tofalse
tells maven-release-plugin not to push changes (this will become useful)localCheckout
set totrue
tells maven-release-plugin to clone from local repository (not distant). This is especially useful here because we didn’t push anything (so not setting this option would result in a failure).
The real stuff
First create a release branch from develop.
$ git checkout -b release/v0.1 develop
Then run the maven release stuff.
$ mvn release:prepare # change the pom, commit and tag version, and # re-change pom (by incrementing SNAPSHOT version) $ mvn release:perform # get the tagged version, compile and deploy
And the real fun begins.
$ git checkout develop # get back to the develop branch $ git merge --no-ff release/v0.1 # merge the version back into develop $ git checkout master # go to the master branch $ git merge --no-ff release/v0.1~1 # merge the version back into master but # the tagged version instead of the release/v0.1 HEAD $ git branch -D release/v0.1 # Removing the release branch $ git push --all && git push --tags # Finally push everything
The real magic here is the git merge --no-ff release/v0.1~1
which will
merge into master the commit before the HEAD of the branch
release/v0.1
.
The next step would be to create a helper script that automates this and
verify that the pom.xml
has the right configuration options.
Edit 17:58 : You can take a look here