Maven release plugin cheat sheet
This page assumes that project poms are properly configured for performing a release and that the deployer's settings.xml file is also properly configured.
General rules
- Release from *.x branch.
Prerequisites
Maven 2.0.10 minimum, Maven 2.2.* recommended.
Review merges/commits
Confirm that all merges scheduled for release have been merged and committed to the target *.x branch.
Check out project
Recommendation: check out a fresh copy of the project before performing a release. This ensures that no modified but uncommitted files are in your working copy. The release plugin will fail whenever it detects uncommitted files. Also avoid opening your fresh check out in Eclipse before performing a release; you will pollute the project with Eclipse uncommitted metadata files.
sakaiger$ svn co https://source.sakaiproject.org/svn/kernel/branches/kernel-1.1.x/ kernel-1.1.x
Verify build
Recommendation: before performing release delete your local .m2/respository/org/sakaiproject/ProjectToRelease folder. Then install the project with the offline switch -o
activated. If dependencies are missing from your local repo, the install will fail. Rerun the install without the -o
switch to populate your repo. Then reinstall the project in offline mode again.
sakaiger$ rm -rf ~/.m2/repository/org/sakaiproject/kernel sakaiger$ cd kernel-1.1.x sakaiger$ mvn -o clean install
Perform release dry run
During the dry run and again during the release proper you will be prompted for version information. The release plugin will attempt to guess the release, tag and snapshot versions. You can accept the values as is or supply your own.
[INFO] Checking dependencies and plugins for snapshots ... What is the release version for "BasicLTI base pom (basiclti)"? (org.sakaiproject.basiclti:basiclti) 1.1.0-b02: : What is SCM release tag or label for "BasicLTI base pom (basiclti)"? (org.sakaiproject.basiclti:basiclti) basiclti-1.1.0-b02: : What is the new development version for "BasicLTI base pom (basiclti)"? (org.sakaiproject.basiclti:basiclti) 1.1.0-b03-SNAPSHOT: :
sakaiger$ cd kernel-1.1.x sakaiger$ mvn release:prepare -DdryRun=true
Perform release
After a successful dry run, perform the release.
sakaiger$ mvn release:clean release:prepare release:perform
Signing artifacts with GPG
sakaiger$ mvn -Pgpg release:clean release:prepare release:perform
OAE 3akai-ux release
sakaiger$ mvn -Psakai-release,gpg release:clean release:prepare release:perform
release:prepare
goal actions:
- Prompt user for release version info (name, number, next x-SNAPSHOT)
- Check that there are no uncommitted changes in the source
- Check that there are no SNAPSHOT dependencies
- Change the version in the POMs from x-SNAPSHOT to a new version
- Transform the SCM information in the POM to include the final destination of the tag
- Run the project tests against the modified POMs to confirm everything is in working order
- Commit the modified POMs
- Tag the code in the SCM with a version name
- Bump the version in the POMs to a new value y-SNAPSHOT
- Commit the modified POMs
release:perform
goal actions:
- Checks out release tag based on <scm> URL
- Builds release tag
- Deploys release binaries to remote repository (e.g. runs pre-defined Maven release goals:
deploy
andsite-deploy
)
release:clean
goal actions:
- Removes
release.properties
and other release-related files from checkout.
Perform release without generating a site
If a <site> is defined in <DistributionManagement> you can prevent site generation by adding the optional goals parameter -Dgoals=deploy
.
Using the goals parameter you can specify a list of goals to execute on deployment. Default value is either deploy
or deploy site-deploy
if a <site> is defined.
sakaiger$ mvn release:clean release:prepare release:perform -Dgoals=deploy
Using Profiles
You can activate profiles when running the release plugin. Test & Quizzes (Samigo) requires a signed audio jar. This is accomplished by adding a profile in one's local settings.xml
file that provides the Keystore location, password and alias.
Profile activation
sakaiger$ mvn -Pjarsign release:clean release:prepare release:perform
Sitestats Impl includes performance tests. If the profile is not activated the following build error will be generated:
[INFO] Surefire report directory: /home/arwhyte/svn/sitestats/branches/sitestats-2.1.x/sitestats-impl/target/surefire-reports [INFO] ------------------------------------------------------------------------ [ERROR] FATAL ERROR [INFO] ------------------------------------------------------------------------ [INFO] includes1 has null value [INFO] ------------------------------------------------------------------------ [INFO] Trace java.lang.NullPointerException: includes1 has null value at org.apache.maven.surefire.booter.PropertiesWrapper.addList(PropertiesWrapper.java:282 . . . .
Profile activation
sakaiger$ mvn -Pperftests release:clean release:prepare release:perform
settings.xml
<profiles> <profile> <id>jarsign</id> <activation> <activeByDefault>false</activeByDefault> </activation> <properties> <keystore.location>KEYSTORE-LOCATION</keystore.location> <keystore.alias>ALIAS</keystore.alias> <keystore.password>PASSWORD</keystore.password> </properties> </profile> </profiles> . . . <activeProfiles> <activeProfile>jarsign</activeProfile> </activeProfiles>
Release Gotchas
Repo permission issues
If you encounter a "Permission denied" error when executing the relase:perform
goal, you do NOT need to rollback the release. Instead, address the permission issue and then check out your newly minted tag and perform the release using the tag itself.
[INFO] [INFO] ------------------------------------------------------------------------ [INFO] [ERROR] BUILD ERROR [INFO] [INFO] ------------------------------------------------------------------------ [INFO] [INFO] Error deploying artifact: Exit code: 1 - mkdir: cannot create directory `/var/www/html/maven2/org/sakaiproject/scheduler/scheduler/2.7.0-rc06': Permission denied
Note: If you get this error about permission denied
- Check your ~/.m2/settings.xml and verify that you have a server block which matches up the appropriate distributionManagement blocks. Otherwise it will attempt to login with the wrong user (the user you're logged in as. You may also need to specify a <privateKey> </privateKey> location, if it's not your default private key. See this for more info: http://maven.apache.org/plugins/maven-deploy-plugin/examples/deploy-ssh-external.html
<server> <id>sakai-maven2-scp</id> <username>shared_release</username> </server>
sakaiger$ svn co https://source.sakaiproject.org/svn/jobscheduler/tags/scheduler-2.7.0-rc06 sakaiger$ cd scheduler-2.7.0-rc06 sakaiger$ mvn release:perform -DconnectionUrl=scm:svn:https://source.sakaiproject.org/svn/jobscheduler/tags/scheduler-2.7.0-rc06
Release rollback
If the release should fail you can rollback the release as follows:
mvn release:rollback
Rolling back a release
release rollback
goal actions:
- All project POMs are reverted back to their pre-release state locally, and also in the SCM if the previous release command was able to successfully make changes in the SCM to the POMs. This is done by using the backup files created during release:prepare.
If a tag was generated successfully before a plugin failure it will have to be removed manually.
Release rollbacks will fail ifmvn release:clean
is executed prior to the rollback attempt.
Should the build fail rerun the following mvn goals to restart the build:
sakaiger$ mvn clean install sakaiger$ mvn release:prepare
Release from a tag
If a release fails after a tag has been generated and the branch pom versions have been incremented there should be no need to perform a mvn release:rollback
. Instead check out the tag and perform the release using it.
mvn -Pjarsign release:perform -DconnectionUrl=scm:svn:https://source.sakaiproject.org/svn/sam/tags/samigo-2.7.1
Spurious snapshot resolution issues
Code that you plan to release should never include dependencies on unstable snapshot code. Obligingly, the release plugin will warn you if it encounters snapshot dependencies during the release:prepare
phase. Occasionally, however, the plugin will mishandle version ranges specified in a dependency (e.g., common [1.0.0,1.1.0)) and will issue spurious warnings that snapshots require resolving. This occurs whenever the plugin finds snapshot versions of project dependencies resident in your local .m2
repo. The workaround is to delete the .m2
project artifacts folder (e.g., .m2/repository/org/sakaiproject/common) and then issue a mvn clean install
to install the required dependency. Note, that you may have to delete more than one folder from your .m2
repo in order to eliminate the plugin's dependency resolution challenges.
------------------------------------------------------------------------ [INFO] Building Profile2 [INFO] task-segment: [release:prepare] (aggregator-style) [INFO] ------------------------------------------------------------------------ [INFO] [release:prepare {execution: default-cli}] [INFO] Resuming release from phase 'check-dependency-snapshots' [INFO] Checking dependencies and plugins for snapshots ... There are still some remaining snapshot dependencies.: Do you want to resolve them now? (yes/no) no: : yes Dependency type to resolve,: specify the selection number ( 0:All 1:Project Dependencies 2:Plugins 3:Reports 4:Extensions ): (0/1/2/3) 1: : 0 Resolve All Snapshots.: 'org.sakaiproject.common:sakai-common-edu-person-api' set to release? (yes/no) yes: : yes [INFO] ------------------------------------------------------------------------ [ERROR] FATAL ERROR [INFO] ------------------------------------------------------------------------ [INFO] null [INFO] ------------------------------------------------------------------------ [INFO] Trace java.lang.NullPointerException . . . .
Spurious svn commit error ("File . . . already exists")
Encountered the following build failure during release:prepare
when releasing remotely from UCT's arabica.cet.uct.ac.za.
[ERROR] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Unable to tag SCM Provider message: The svn tag command failed. Command output: svn: Commit failed (details follow): svn: File '/svn/pure-poms/tags/purepoms-2.7.2/sakai-basic-tool/pom.xml' already exists
A quick check of the svn repo confirmed that no purepoms-2.7.2 tag existed. Even an svn delete confirmed that the tag was a phantom.
sakaiger$ svn del https://source.sakaiproject.org/svn/pure-poms/tags/purepoms-2.7.2 -m "NOJIRA delete phantom tag" svn: URL 'purepoms-2.7.2' does not exist
The issue can be resolved by issuing an svn update
immediately after encountering the release plugin build failure followed by release:prepare
(repeat) and then release:perform
.
[ERROR] BUILD FAILURE . . . sakaiger$ svn update sakaiger$ mvn release:prepare release:perform
For more info see: MRELEASE-409.
No SNAPSHOT project in the reactor projects list
Encountered the following build failure during release:prepare
when releasing SiteStats 2.1.1.
[INFO] ------------------------------------------------------------------------ [ERROR] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] You don't have a SNAPSHOT project in the reactor projects list. [INFO] ------------------------------------------------------------------------ [INFO] For more information, run Maven with the -e switch [INFO] ------------------------------------------------------------------------ [INFO] Total time: 17 seconds [INFO] Finished at: Mon Feb 25 16:55:05 CET 2008 [INFO] Final Memory: 5M/11M [INFO] ------------------------------------------------------------------------
This issue is caused when the version on the tool pom.xml (and all tool modules pom.xml files) does not end with the '-SNAPSHOT' suffix. In this specific case, tool version was '2.1.1-b01' instead of '2.1.1-b01-SNAPSHOT'.
To fix this, just need to add the suffix '-SNAPSHOT' to the version tag of tool pom.xml and tool modules pom.xml files, commit the changes, and try again.
maven-javadoc-plugin JVM settings truncated or not all included on a single line.
If you accidently format the pom XML in such a way that the JVM settings for the maven-javadoc-plugin are divided across two lines you will encounter the following error:
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <reportSets> <reportSet> . . . <additionalJOption> -J-Xms168m -J-Xmx512m -J-XX:PermSize=128m -J-XX:NewSize=64m </additionalJOption>
[INFO] [ERROR] BUILD ERROR [INFO] [INFO] ------------------------------------------------------------------------ [INFO] [INFO] Error during page generation [INFO] [INFO] Embedded error: Error rendering Maven report: [INFO] Exit code: 127 - javadoc: error - No packages or classes specified. [INFO] /bin/sh: line 1: -J-XX:PermSize=128m: command not found [INFO] [INFO] Command line was: /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/bin/javadoc -J-Xmx512m "-J-Xms168m -J-Xmx512m [INFO] -J-XX:PermSize=128m -J-XX:NewSize=64m" @options @packages [INFO] [INFO] Refer to the generated Javadoc files in '/Users/arwhyte/Development/svn/polls/branches/sakai_2-6-x/target/checkout/target/site/apidocs' dir. [INFO] [INFO] [INFO] ------------------------------------------------------------------------ [INFO] [INFO] For more information, run Maven with the -e switch [INFO] [INFO] ------------------------------------------------------------------------ [INFO] [INFO] Total time: 28 seconds [INFO] [INFO] Finished at: Tue Aug 24 14:08:06 EDT 2010 [INFO] [INFO] Final Memory: 81M/528M [INFO] [INFO] ------------------------------------------------------------------------ [INFO] ------------------------------------------------------------------------ [ERROR] BUILD ERROR [INFO] ------------------------------------------------------------------------ [INFO] Maven execution failed, exit code: '1'
Release plugin fails during site generation. This issue is related to https://jira.codehaus.org/browse/SUREFIRE-714.
maven-surefire-plugin and maven-surefire-report-plugin 2.7.1+ requires maven-site-plugin 2.1+.
[INFO] [FATAL ERROR] Container realm = plexus.core [INFO] urls[0] = file:/usr/local/apache-maven-2.2.1/lib/maven-2.2.1-uber.jar [INFO] [INFO] ------------------------------------------------------------------------ [INFO] [ERROR] FATAL ERROR [INFO] [INFO] ------------------------------------------------------------------------ [INFO] [INFO] org.apache.maven.doxia.siterenderer.sink.SiteRendererSink.unknown(Ljava/lang/String;[Ljava/lang/Object;Lorg/apache/maven/doxia/sink/SinkEventAttributes;)V [INFO] [INFO] ------------------------------------------------------------------------ [INFO] [INFO] Trace [INFO] java.lang.AbstractMethodError: org.apache.maven.doxia.siterenderer.sink.SiteRendererSink.unknown(Ljava/lang/String;[Ljava/lang/Object;Lorg/apache/maven/doxia/sink/SinkEventAttributes;)V
Release fails when attempting to generate Javadocs due to packages having commented out/missing source files
See https://jira.sakaiproject.org/browse/SAK-20961
In this instance the release plugin failed on common when generating Javadocs due to the presence of two commented out test classes.
[INFO] Loading source files for package org.sakaiproject.api.common.type... [INFO] Loading source files for package org.sakaiproject.api.common.edu.person... [INFO] Constructing Javadoc information... [INFO] 1 error [INFO] 2 warnings [INFO] [INFO] ------------------------------------------------------------------------ [INFO] [ERROR] BUILD ERROR [INFO] [INFO] ------------------------------------------------------------------------ [INFO] [INFO] Error during page generation [INFO] [INFO] Embedded error: Error rendering Maven report: [INFO] Exit code: 1 - javadoc: warning - No source files for package org.sakaiproject.api.common.type [INFO] javadoc: warning - No source files for package org.sakaiproject.api.common.edu.person [INFO] javadoc: error - No public or protected classes found to document. [INFO] [INFO] Command line was: /usr/lib/jvm/java-6-sun-1.6.0.24/jre/../bin/javadoc -J-Xmx1024m -J-Xms168m "-J-Xms168m -J-Xmx1024m -J-XX:PermSize=128m -J-XX:NewSize=64m" @options @packages [INFO] [INFO] Refer to the generated Javadoc files in '/home/arwhyte/svn/common/branches/common-1.0.x/target/checkout/target/site/testapidocs' dir.
The issue was fixed by defining an <excludePackageNames> setting to the Javadoc plugin <configuration>:
<!-- SAK-20961 exclude commented out test classes --> <excludePackageNames>org.sakaiproject.api.common.edu.person:org.sakaiproject.api.common.type</excludePackageNames>
</plugin>
SNAPSHOT deployments
If you need to deploy or refresh a set of snapshot binaries in our maven2 snapshot repo issue the following command:
sakaiger$ cd msgcntr-trunk sakaiger$ mvn clean install javadoc:jar source:jar deploy
Profile activation
sakaiger$ cd samigo-trunk sakaiger$ mvn -Pjarsign clean install javadoc:jar source:jar deploy
References
Maven Release Plugin
Maven mini-guide
J. Ferguson, "Using the Maven Release Plugin"