Saturday, June 29, 2013

ActiveMQ as a Windows Service using YAJSW


Objective:

This blog is to demonstrate how to run ActiveMQ JMS Broker as a Windows Service using YAJSW.

Introduction:

ActiveMQ JMS Broker(s) is a vital part of messaging infrastructure in an enterprise. In order to ensure that the ActiveMQ process stays up and running, it is best to run it as a service using a service wrapper such as Tanuki or YAJSW. Running ActiveMQ as a service helps in automatically restarting ActiveMQ process when the host machine restarts (planned or unplanned).
Service Wrapper ensures that the ActiveMQ process remains healthy. It can be configured to restart ActiveMQ process if it was to determine that the process is hung or not responding to ping. However, I must say that this is not a substitute for fixing issue(s) which actually cause ActiveMQ to hang or shut down. Service Wrapper may cure the symptom with a restart but it will not fix the root cause. It is best to troubleshoot to determine what is troubling the ActiveMQ process in order to prevent production nightmares :) Some of the common issues that I have seen relate to memory & connection leaks and inadequate capacity configuration.

Tanuki Wrapper is one the most popular open source Service Wrappers but it does not offer community edition for 64bit Windows OS as of this writing :)

Please read the Tanuki Service Wrapper release notes here:
http://wrapper.tanukisoftware.com/doc/english/download.jsp

There is a viable open source alternative in YAJSW. If you are interested in running ActiveMQ as a Windows Service on a 64bit Windows OS, you may want to consider YAJSW. There may be other alternatives but I have found YAJSW sufficient. 

Overview:

In this article, I will show how to use YAJSW to run ActiveMQ as a Windows Service. We will use ActiveMQ version 5.7.0, YAJSW version 11.03 on 64bit Windows 7 OS. Usually when you register a process to run as a service, there are additional parameters to think about such as security - which user or user groups can administer this service,  determine which interested parties receive process health status notifications, etc. In this example, we will consider a plain vanilla use case with out-of-the-box settings of ActiveMQ and YAJSW.

The actual process can be summarized in 3 easy steps. 
  1. Run YAJSW "getConfig.bat" script against a live ActiveMQ process to generate YAJSW configuration file
  2. Edit the configuration file to change a few settings
  3. Run YAJSW "installService.bat" script to register ActiveMQ process to run as a Windows Service. 
Prerequisites:
  1. Install ActiveMQ 5.7.0
  2. Install YAJSW 11.03
  3. Windows 7
  4. JDK 1.6+
Deep Dive:

Launch ActiveMQ using the default activemq.bat script


Find the process ID using jps -v


The ActiveMQ process ID is 3024

Let's generate YAJSW configuration now. We will use genConfig.bat script and pass the ActiveMQ process ID as an argument.


The generated configuration is a good start but is not good enough. We still need to edit wrapper.conf file in c:\yajsw-stable-11.03\conf directory and provide the settings listed below:

wrapper.working.dir=C:\\apache-activemq-5.7.0\\bin\\

ActiveMQ uses a runnable jar "run.jar" so we need to specify that accordingly

# Java Application main class
#wrapper.java.app.mainclass=

# or jar file
wrapper.java.app.jar=C:\\apache-activemq-5.7.0\\bin\\run.jar

# Name of the service
wrapper.ntservice.name=ActiveMQ

# Display name of the service
wrapper.ntservice.displayname=ActiveMQ-Service
# Description of the service
wrapper.ntservice.description=ActiveMQ Broker Service

# Log file to use for wrapper output logging.
wrapper.logfile=C:\\yajsw-stable-11.03\\log\\wrapper.log

Now let's install ActiveMQ as a Windows Service


Let's confirm if service got registered correctly

start -> run -> services.msc



Details:

In order to uninstall, run the uninstallService.bat


Conclusion:

We have just seen how to install ActiveMQ as a Windows Service using YAJSW on 64bit Windows. 

Sunday, June 16, 2013

Maven Release Plugin with Git, GitHub and CloudBees

Objective:

This blog is to demonstrate the use of maven release plugin using Git, GitHub and CloudBees repository. 

Introduction:

Typical software release process entails many repetitive and mundane tasks which can be automated. These tasks include building, tagging, running automated tests, generating documentation, re-versioning, deploying generated artifact(s), rollback etc. 

Maven is an opinionated software project management tool. It has a plugin architecture which facilitates automating software project lifecycle management. It provides a release-plugin which automates the software release in two steps: "prepare" and "perform" (more on this later) 

However, in most companies, software release process varies depending on technology, product and process maturity. The software release process doesn't usually lend itself to be a "one-size-fits-all" process.  That is why there is a huge debate in the community on merits and demerits of this plugin. There is a very good article by Lieven Doclo:  Why I never use the Maven release plugin. I highly suggest to read that blog & relevant comments. 

Overview:

In this article I will be sharing how to use Maven release plugin "only" for small shared components or projects where out of the box maven release plugin is sufficient. 

I will be using GitHub as SCM and CloudBees as artifact repository where release artifacts will be deployed. Both GitHub and CloudBees offer free usage tier which is just awesome! 

Here is the outline of the topics we will cover in this blog:
  1. Understand what happens in "prepare" goal
    • Release tagging
    • POM Re-versioning
    • Meta data to assist with "perform" or "rollback" goal
  2. Limitation of "rollback" goal
  3. Understand what happens in "perform" goal
  4. Browse CloudBees artifact repository to find deployed release artifact
Prerequisites:

You may find familiarity with the following useful as you read this article :)
  1. Maven
  2. Git
  3. GitHub
  4. CloudBees
  5. WebDAV (not essential but recommended)
  6. Configure SSH keys so local machine can access GitHub repository over ssh
Deep Dive:

Creating a project repository: "mrp-git-cb-demo"



Clone the remote repo from GitHub.

Ashwinis-MacBook-Pro:GIT akuntamukkala$ git clone git@github.com:akuntamukkala/mrp-git-cb-demo.git Cloning into 'mrp-git-cb-demo'...
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.

Add .gitignore file with file types which needed not be checked in and commit the changes to local and push to remote repository

Creating a sample maven project, say "Utility"using maven quickstart archetype



Ashwinis-MacBook-Pro:mrp-git-cb-demo akuntamukkala$ mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.1
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] Archetype repository missing. Using the one from [org.apache.maven.archetypes:maven-archetype-quickstart:1.1] found in catalog remote
Define value for property 'groupId': : com.app
Define value for property 'artifactId': : utility
Define value for property 'version': 1.0-SNAPSHOT: :
Define value for property 'package': com.app: :
Confirm properties configuration:
groupId: com.app
artifactId: utility
version: 1.0-SNAPSHOT
package: com.app
Y: : Y

[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: com.app
[INFO] Parameter: packageName, Value: com.app
[INFO] Parameter: package, Value: com.app
[INFO] Parameter: artifactId, Value: utility
[INFO] Parameter: basedir, Value: /Users/akuntamukkala/GIT/mrp-git-cb-demo
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 26.656s
[INFO] Finished at: Sun Jun 16 14:55:37 GMT+05:30 2013
[INFO] Final Memory: 9M/81M
[INFO] ------------------------------------------------------------------------

Commit the "Utility" project to GitHub

Ashwinis-MacBook-Pro:mrp-git-cb-demo akuntamukkala$ git status 
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
# .gitignore
# utility/
nothing added to commit but untracked files present (use "git add" to track)

Ashwinis-MacBook-Pro:mrp-git-cb-demo akuntamukkala$ git add .

Ashwinis-MacBook-Pro:mrp-git-cb-demo akuntamukkala$ git commit -m "first commit"
[master 8a70309] first commit
 4 files changed, 92 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 utility/pom.xml
 create mode 100644 utility/src/main/java/com/app/App.java
 create mode 100644 utility/src/test/java/com/app/AppTest.java

Ashwinis-MacBook-Pro:mrp-git-cb-demo akuntamukkala$ git push
Counting objects: 17, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (16/16), 1.63 KiB, done.
Total 16 (delta 0), reused 0 (delta 0)
To git@github.com:akuntamukkala/mrp-git-cb-demo.git
   421475b..8a70309  master -> master

The last commit is now visible in master branch at mrp-git-cb-demo repo at GitHub as shown in the following screenshot.  


Next we will make the following changes:
  1. Edit Maven's settings.xml so that Maven is aware of CloudBees release and snapshot repository credentials. 
  2. Edit Utility project's maven pom.xml to add the following:
    1. GitHub SCM configuration
    2. Distribution Management of generated artifacts
    3. Maven Release Plugin (GAV and any additional parameters)
CloudBees online Artifact Repository for release and snapshots:

When you create an account at CloudBees, you get 4 free online instances JFrog Artifact Repositories (backup, private, release, snapshot).

Please note URL of following artifact repositories:

Release:   https://repository-akuntamukkala.forge.cloudbees.com/release/
Snapshot: https://repository-akuntamukkala.forge.cloudbees.com/snapshot/

The repository access is restricted by your CloudBees account user name and password. 

In my case it is "akuntamukkala" and "canyouguess?!" respectively.

The following is a screen shot of CloudBees account showing release repository details. Please note that this repository is accessible using WebDAV. 


We need to now configure Maven installation to be aware of the CloudBees release and snapshot repository access credentials. 
Locate the settings.xml in Maven in MVN_HOME/conf directory and add the following XML snippet in the "servers" node.

    <server>
      <id>akuntamukkala-release</id>
      <username>akuntamukkala</username>
      <password>canyouguess?!</password>
    </server>
    <server>
      <id>akuntamukkala-snapshot</id>
      <username>akuntamukkala</username>
      <password>canyouguess?!</password>
    </server>


Edit Utility project's maven pom.xml to add the following XML snippet:


<!-- SCM configuration to GitHub Repo -->
<scm>
   <connection>scm:git:git@github.com:akuntamukkala/mrp-git-cb-demo.git</connection>  
   <url>scm:git:git@github.com:akuntamukkala/mrp-git-cb-demo.git</url>
   <developerConnection>scm:git:git@github.com:akuntamukkala/mrp-git-cb-demo.git</developerConnection>
   <tag>HEAD</tag>
</scm>

<!-- CloudBees Artifact Repository for release and snapshot builds -->
<!-- The repositories are accessible using WebDAV -->
<distributionManagement>
    <repository>
        <id>akuntamukkala-release</id>
        <name>Internal Release Repository</name>
        <url>dav:https://repository-akuntamukkala.forge.cloudbees.com/release</url>
    </repository>
    <snapshotRepository>
        <id>akuntamukkala-snapshot</id>
        <name>Internal Snapshot Repository</name>
        <url>dav:https://repository-akuntamukkala.forge.cloudbees.com/snapshot</url>
    </snapshotRepository>
</distributionManagement>

<!-- The maven release plugin configuration along with WebDAV extension to
help deploy the build artifacts into remote artifact repository -->

<build>
    <extensions>
         <!-- Extension required to deploy a snapshot or a release to the CloudBees
              remote maven repository using Webdav -->
         <extension>
              <groupId>org.apache.maven.wagon</groupId>
              <artifactId>wagon-webdav</artifactId>
              <version>1.0-beta-2</version>
         </extension>
    </extensions>
    <plugins>
         <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-release-plugin</artifactId>
              <version>2.4.1</version>
         </plugin>
    </plugins>
</build>

Now let's attempt to run maven release plugin's prepare goal. The prepare goal performs the following tasks:
  1. Increments project's pom.xml version
  2. Makes a release tag with pom.xml containing release version
  3. Creates meta data files such as release.properties and pom.xml.releaseBackup (useful if we need to rollback)
  4. Propagate these changes to SCM 
Let's see this in action by running the maven release plugin prepare goal.


Ashwinis-MacBook-Pro:utility akuntamukkala$ pwd

/Users/akuntamukkala/GIT/mrp-git-cb-demo/utility

Ashwinis-MacBook-Pro:utility akuntamukkala$ mvn release:prepare -DdryRun=true

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.4.1:prepare (default-cli) on project utility: Cannot prepare the release because you have local modifications :
[ERROR] [pom.xml:modified]

Oops! As you just noticed, an error occurred. This is due to the fact that there are uncommitted changes to pom.xml file. We need to ensure that there are no pending changes and all changes are pushed to GitHub repository before running maven release plugin's prepare goal . 

So let's commit all changes to the local git cloned repo and push to GitHub 

Ashwinis-MacBook-Pro:utility akuntamukkala$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: pom.xml
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# release.properties
no changes added to commit (use "git add" and/or "git commit -a")

Hmm..there is release.properties file generated by the previous execution of maven release plugin's prepare goal. We need to clean up to go back to a state prior to running prepare goal. Here is where maven release plugin's "clean" goal comes into play. 

Ashwinis-MacBook-Pro:utility akuntamukkala$ mvn release:clean
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building utility 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-release-plugin:2.4.1:clean (default-cli) @ utility ---
[INFO] Cleaning up after release...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.233s
[INFO] Finished at: Sun Jun 16 15:38:39 GMT+05:30 2013
[INFO] Final Memory: 5M/81M
[INFO] ------------------------------------------------------------------------

Now you can see that only uncommitted change is our changes to pom.xml where we added SCM, distribution management and release plugin's GAV 

Ashwinis-MacBook-Pro:utility akuntamukkala$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: pom.xml
#
no changes added to commit (use "git add" and/or "git commit -a")


Ashwinis-MacBook-Pro:utility akuntamukkala$ git add .

Ashwinis-MacBook-Pro:utility akuntamukkala$ git commit -m "scm, distribution management, release plugin config"

[master e8422bb] scm, distribution management, release plugin config

 1 file changed, 67 insertions(+), 25 deletions(-)
rewrite utility/pom.xml (83%)

Push the change to GitHub


Ashwinis-MacBook-Pro:utility akuntamukkala$ git push

Counting objects: 7, done.

Delta compression using up to 8 threads.

Compressing objects: 100% (4/4), done.

Writing objects: 100% (4/4), 1.17 KiB, done.

Total 4 (delta 1), reused 0 (delta 0)

To git@github.com:akuntamukkala/mrp-git-cb-demo.git

   8a70309..e8422bb  master -> master

Now that we have ensured that there are no more pending commits and both local and GitHub repo are in sync, let's run maven release:prepare command


Ashwinis-MacBook-Pro:utility akuntamukkala$ mvn release:prepare

[INFO] Scanning for projects...

[INFO]                                                                         

[INFO] ------------------------------------------------------------------------

[INFO] Building utility 1.0-SNAPSHOT

[INFO] ------------------------------------------------------------------------

[INFO] 

[INFO] --- maven-release-plugin:2.4.1:prepare (default-cli) @ utility ---

[INFO] Verifying that there are no local modifications...

[INFO]   ignoring changes on: **/pom.xml.backup, **/release.properties, **/pom.xml.branch, **/pom.xml.next, **/pom.xml.releaseBackup, **/pom.xml.tag

[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git status

[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility

[INFO] Checking dependencies and plugins for snapshots ...

What is the release version for "utility"? (com.app:utility) 1.0: : 

What is SCM release tag or label for "utility"? (com.app:utility) utility-1.0: : 
What is the new development version for "utility"? (com.app:utility) 1.1-SNAPSHOT: : 
[INFO] Transforming 'utility'...
[INFO] Not generating release POMs
[INFO] Executing goals 'clean verify'...
[WARNING] Maven will be executed in interactive mode, but no input stream has been configured for this MavenInvoker instance.
[INFO] [INFO] Scanning for projects...
[INFO] [INFO]                                                                         
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] Building utility 1.0
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] 
[INFO] [INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ utility ---
[INFO] [INFO] Deleting /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target
[INFO] [INFO] 
[INFO] [INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ utility ---
[INFO] [debug] execute contextualize
[INFO] [INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] [INFO] skip non existing resourceDirectory /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/src/main/resources
[INFO] [INFO] 
[INFO] [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ utility ---
[INFO] [INFO] Compiling 1 source file to /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/classes
[INFO] [INFO] 
[INFO] [INFO] --- maven-resources-plugin:2.5:testResources (default-testResources) @ utility ---
[INFO] [debug] execute contextualize
[INFO] [INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] [INFO] skip non existing resourceDirectory /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/src/test/resources
[INFO] [INFO] 
[INFO] [INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ utility ---
[INFO] [INFO] Compiling 1 source file to /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/test-classes
[INFO] [INFO] 
[INFO] [INFO] --- maven-surefire-plugin:2.10:test (default-test) @ utility ---
[INFO] [INFO] Surefire report directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/surefire-reports
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.app.AppTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.012 sec
[INFO] 
[INFO] Results :
[INFO] 
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] [INFO] 
[INFO] [INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ utility ---
[INFO] [INFO] Building jar: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/utility-1.0.jar
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] BUILD SUCCESS
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] Total time: 1.755s
[INFO] [INFO] Finished at: Sun Jun 16 16:16:57 GMT+05:30 2013
[INFO] [INFO] Final Memory: 9M/81M
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] Checking in modified POMs...
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git add -- pom.xml
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git status
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git commit --verbose -F /var/folders/zs/9w9zbpnx4db89z8yrll8301r0000gn/T/maven-scm-1228315049.commit pom.xml
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git symbolic-ref HEAD
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git push git@github.com:akuntamukkala/mrp-git-cb-demo.git master:master
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Tagging release with the label utility-1.0...
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git tag -F /var/folders/zs/9w9zbpnx4db89z8yrll8301r0000gn/T/maven-scm-1142006148.commit utility-1.0
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git push git@github.com:akuntamukkala/mrp-git-cb-demo.git utility-1.0
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git ls-files
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Transforming 'utility'...
[INFO] Not removing release POMs
[INFO] Checking in modified POMs...
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git add -- pom.xml
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git status
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git commit --verbose -F /var/folders/zs/9w9zbpnx4db89z8yrll8301r0000gn/T/maven-scm-1383546415.commit pom.xml
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git symbolic-ref HEAD
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git push git@github.com:akuntamukkala/mrp-git-cb-demo.git master:master
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Release preparation complete.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 30.308s
[INFO] Finished at: Sun Jun 16 16:17:20 GMT+05:30 2013
[INFO] Final Memory: 5M/81M
[INFO] ------------------------------------------------------------------------

What just happened?

Looking at the above logs from release:prepare execution, we can see that project version has been updated to 1.1-SNAPSHOT and release pom with version 1.0 has been tagged "utility-1.0". All of these changes have been made on local repo and pushed to GitHub.

The following GitHub screenshot shows tag "utility-1.0"


Let's see pom.xml in master branch in the following screenshot. Please observe that version has been changed to 1.1-SNAPSHOT


Let's see the pom.xml in the utility-1.0 tag in the following screenshot. Please observe that release version is 1.0. This is going to be used when maven release plugin's "perform" goal is executed. More on this later.




Ashwinis-MacBook-Pro:utility akuntamukkala$ git status

# On branch master

# Your branch is ahead of 'origin/master' by 2 commits.

#

# Untracked files:

#   (use "git add <file>..." to include in what will be committed)

#

# pom.xml.releaseBackup

# release.properties

nothing added to commit but untracked files present (use "git add" to track)



Ashwinis-MacBook-Pro:utility akuntamukkala$ git pull

From github.com:akuntamukkala/mrp-git-cb-demo

   e8422bb..fda4cdd  master     -> origin/master
Already up-to-date.
Ashwinis-MacBook-Pro:utility akuntamukkala$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
# pom.xml.releaseBackup
# release.properties

Rollback after release prepare:

What if we need to rollback the changes made during "prepare" goal execution?

This could happen because of many reasons: there is always that one more bug that needs to go in this release, release gets pushed by business folks or QA reveals a critical bug etc. 

I mean we have all seen these situations at some point. So we decide to rollback using maven release plugin's rollback goal. 

This works fine...except for the fact that it does not delete the "utility-1.0" tag in the repo at least as of this writing. 

Let's see this in action...


Ashwinis-MacBook-Pro:utility akuntamukkala$ mvn release:rollback

[INFO] Scanning for projects...

[INFO]                                                                         

[INFO] ------------------------------------------------------------------------

[INFO] Building utility 1.1-SNAPSHOT

[INFO] ------------------------------------------------------------------------

[INFO] 

[INFO] --- maven-release-plugin:2.4.1:rollback (default-cli) @ utility ---

[INFO] Checking in modified POMs...

[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git add -- pom.xml

[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility

[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git status
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git commit --verbose -F /var/folders/zs/9w9zbpnx4db89z8yrll8301r0000gn/T/maven-scm-1207924889.commit pom.xml
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git symbolic-ref HEAD
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git push git@github.com:akuntamukkala/mrp-git-cb-demo.git master:master
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Cleaning up after release...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.952s
[INFO] Finished at: Sun Jun 16 16:42:04 GMT+05:30 2013
[INFO] Final Memory: 5M/81M
[INFO] ------------------------------------------------------------------------

Rollback reverted the changes so master branch's pom.xml contains version 1.0-SNAPSHOT. For the rollback to have executed, it is vital to have release.properties file. If that was missing, then this operation would have failed. 

Let's inspect the changes committed by rollback operation


Ashwinis-MacBook-Pro:utility akuntamukkala$ git status

# On branch master

# Your branch is ahead of 'origin/master' by 1 commit.

#

nothing to commit (working directory clean)

pom.xml in master branch reveals that version is reset to 1.0-SNAPSHOT as shown in the screenshot below. 



Here you may notice that the "utility-1.0" tag still remains in GitHub repo. 
This feature of rollback where the release tag needs to be deleted has not been implemented as of this writing. 




Let's go ahead and delete this manually for now


Ashwinis-MacBook-Pro:utility akuntamukkala$ git pull

From github.com:akuntamukkala/mrp-git-cb-demo

   fda4cdd..d280671  master     -> origin/master

Already up-to-date.

Ashwinis-MacBook-Pro:utility akuntamukkala$ git tag -n

utility-1.0     [maven-release-plugin]  copy for tag utility-1.0

Ashwinis-MacBook-Pro:utility akuntamukkala$ git tag -d utility-1.0

Deleted tag 'utility-1.0' (was d5f3fc4)
Ashwinis-MacBook-Pro:utility akuntamukkala$ git push origin :refs/tags/utility-1.0
To git@github.com:akuntamukkala/mrp-git-cb-demo.git
 - [deleted]         utility-1.0

Let's resume the release process again by first executing the prepare goal again.


Ashwinis-MacBook-Pro:utility akuntamukkala$ mvn release:prepare
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building utility 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-release-plugin:2.4.1:prepare (default-cli) @ utility ---
[INFO] Verifying that there are no local modifications...
[INFO]   ignoring changes on: **/pom.xml.backup, **/release.properties, **/pom.xml.branch, **/pom.xml.next, **/pom.xml.releaseBackup, **/pom.xml.tag
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git status
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Checking dependencies and plugins for snapshots ...
What is the release version for "utility"? (com.app:utility) 1.0: : 
What is SCM release tag or label for "utility"? (com.app:utility) utility-1.0: : 
What is the new development version for "utility"? (com.app:utility) 1.1-SNAPSHOT: : 
[INFO] Transforming 'utility'...
[INFO] Not generating release POMs
[INFO] Executing goals 'clean verify'...
[WARNING] Maven will be executed in interactive mode, but no input stream has been configured for this MavenInvoker instance.
[INFO] [INFO] Scanning for projects...
[INFO] [INFO]                                                                         
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] Building utility 1.0
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] 
[INFO] [INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ utility ---
[INFO] [INFO] Deleting /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target
[INFO] [INFO] 
[INFO] [INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ utility ---
[INFO] [debug] execute contextualize
[INFO] [INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] [INFO] skip non existing resourceDirectory /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/src/main/resources
[INFO] [INFO] 
[INFO] [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ utility ---
[INFO] [INFO] Compiling 1 source file to /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/classes
[INFO] [INFO] 
[INFO] [INFO] --- maven-resources-plugin:2.5:testResources (default-testResources) @ utility ---
[INFO] [debug] execute contextualize
[INFO] [INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] [INFO] skip non existing resourceDirectory /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/src/test/resources
[INFO] [INFO] 
[INFO] [INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ utility ---
[INFO] [INFO] Compiling 1 source file to /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/test-classes
[INFO] [INFO] 
[INFO] [INFO] --- maven-surefire-plugin:2.10:test (default-test) @ utility ---
[INFO] [INFO] Surefire report directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/surefire-reports
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.app.AppTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.011 sec
[INFO] 
[INFO] Results :
[INFO] 
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] [INFO] 
[INFO] [INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ utility ---
[INFO] [INFO] Building jar: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/utility-1.0.jar
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] BUILD SUCCESS
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] Total time: 1.813s
[INFO] [INFO] Finished at: Sun Jun 16 17:40:01 GMT+05:30 2013
[INFO] [INFO] Final Memory: 9M/81M
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] Checking in modified POMs...
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git add -- pom.xml
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git status
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git commit --verbose -F /var/folders/zs/9w9zbpnx4db89z8yrll8301r0000gn/T/maven-scm-1892728079.commit pom.xml
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git symbolic-ref HEAD
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git push git@github.com:akuntamukkala/mrp-git-cb-demo.git master:master
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Tagging release with the label utility-1.0...
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git tag -F /var/folders/zs/9w9zbpnx4db89z8yrll8301r0000gn/T/maven-scm-1866393319.commit utility-1.0
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git push git@github.com:akuntamukkala/mrp-git-cb-demo.git utility-1.0
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git ls-files
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Transforming 'utility'...
[INFO] Not removing release POMs
[INFO] Checking in modified POMs...
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git add -- pom.xml
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git status
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git commit --verbose -F /var/folders/zs/9w9zbpnx4db89z8yrll8301r0000gn/T/maven-scm-347133367.commit pom.xml
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git symbolic-ref HEAD
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility && git push git@github.com:akuntamukkala/mrp-git-cb-demo.git master:master
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility
[INFO] Release preparation complete.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:19.582s
[INFO] Finished at: Sun Jun 16 17:40:22 GMT+05:30 2013
[INFO] Final Memory: 5M/81M
[INFO] ------------------------------------------------------------------------

Now let's execute the perform goal of release plugin to see the following tasks being performed.
  1. Clone the utility-1.0 tag 
  2. Execute maven build cycle to build release artifact
  3. Upload the release artifact into CloudBees release artifact repository using WebDAV
Let's see this in action


Ashwinis-MacBook-Pro:utility akuntamukkala$ mvn release:perform

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building utility 1.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-release-plugin:2.4.1:perform (default-cli) @ utility ---
[INFO] Checking out the project to perform the release ...
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target && git clone --branch utility-1.0 git@github.com:akuntamukkala/mrp-git-cb-demo.git /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target
[INFO] Executing: /bin/sh -c cd /var/folders/zs/9w9zbpnx4db89z8yrll8301r0000gn/T/ && git ls-remote git@github.com:akuntamukkala/mrp-git-cb-demo.git
[INFO] Working directory: /var/folders/zs/9w9zbpnx4db89z8yrll8301r0000gn/T
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout && git fetch git@github.com:akuntamukkala/mrp-git-cb-demo.git
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout && git checkout utility-1.0
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout
[INFO] Executing: /bin/sh -c cd /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout && git ls-files
[INFO] Working directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout
[INFO] Invoking perform goals in directory /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility
[INFO] Executing goals 'deploy'...
[WARNING] Maven will be executed in interactive mode, but no input stream has been configured for this MavenInvoker instance.
[INFO] [INFO] Scanning for projects...
[INFO] [WARNING] 
[INFO] [WARNING] Some problems were encountered while building the effective model for com.app:utility:jar:1.0
[INFO] [WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-javadoc-plugin is missing.
[INFO] [WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-deploy-plugin is missing.
[INFO] [WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-source-plugin is missing.
[INFO] [WARNING] 
[INFO] [WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[INFO] [WARNING] 
[INFO] [WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[INFO] [WARNING] 
[INFO] [INFO]                                                                         
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] Building utility 1.0
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] 
[INFO] [INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ utility ---
[INFO] [debug] execute contextualize
[INFO] [INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] [INFO] skip non existing resourceDirectory /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/src/main/resources
[INFO] [INFO] 
[INFO] [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ utility ---
[INFO] [INFO] Compiling 1 source file to /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/classes
[INFO] [INFO] 
[INFO] [INFO] --- maven-resources-plugin:2.5:testResources (default-testResources) @ utility ---
[INFO] [debug] execute contextualize
[INFO] [INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] [INFO] skip non existing resourceDirectory /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/src/test/resources
[INFO] [INFO] 
[INFO] [INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ utility ---
[INFO] [INFO] Compiling 1 source file to /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/test-classes
[INFO] [INFO] 
[INFO] [INFO] --- maven-surefire-plugin:2.10:test (default-test) @ utility ---
[INFO] [INFO] Surefire report directory: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/surefire-reports
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.app.AppTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.012 sec
[INFO] 
[INFO] Results :
[INFO] 
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] [INFO] 
[INFO] [INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ utility ---
[INFO] [INFO] Building jar: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/utility-1.0.jar
[INFO] [INFO] 
[INFO] [INFO] >>> maven-source-plugin:2.2.1:jar (attach-sources) @ utility >>>
[INFO] [INFO] 
[INFO] [INFO] <<< maven-source-plugin:2.2.1:jar (attach-sources) @ utility <<<
[INFO] [INFO] 
[INFO] [INFO] --- maven-source-plugin:2.2.1:jar (attach-sources) @ utility ---
[INFO] [INFO] Building jar: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/utility-1.0-sources.jar
[INFO] [INFO] 
[INFO] [INFO] --- maven-javadoc-plugin:2.9:jar (attach-javadocs) @ utility ---
[INFO] [INFO] 
[INFO] Loading source files for package com.app...
[INFO] Constructing Javadoc information...
[INFO] Standard Doclet version 1.6.0_45
[INFO] Building tree for all the packages and classes...
[INFO] Generating /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/apidocs/com/app//App.html...
[INFO] Generating /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/apidocs/com/app//package-frame.html...
[INFO] Generating /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/apidocs/com/app//package-summary.html...
[INFO] Generating /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/apidocs/com/app//package-tree.html...
[INFO] Generating /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/apidocs/constant-values.html...
[INFO] Generating /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/apidocs/com/app//class-use/App.html...
[INFO] Generating /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/apidocs/com/app//package-use.html...
[INFO] Building index for all the packages and classes...
[INFO] Generating /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/apidocs/overview-tree.html...
[INFO] Generating /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/apidocs/index-all.html...
[INFO] Generating /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/apidocs/deprecated-list.html...
[INFO] Building index for all classes...
[INFO] Generating /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/apidocs/allclasses-frame.html...
[INFO] Generating /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/apidocs/allclasses-noframe.html...
[INFO] Generating /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/apidocs/index.html...
[INFO] Generating /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/apidocs/help-doc.html...
[INFO] Generating /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/apidocs/stylesheet.css...
[INFO] [INFO] Building jar: /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/utility-1.0-javadoc.jar
[INFO] [INFO] 
[INFO] [INFO] --- maven-install-plugin:2.3.1:install (default-install) @ utility ---
[INFO] [INFO] Installing /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/utility-1.0.jar to /Users/akuntamukkala/.m2/repository/com/app/utility/1.0/utility-1.0.jar
[INFO] [INFO] Installing /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/pom.xml to /Users/akuntamukkala/.m2/repository/com/app/utility/1.0/utility-1.0.pom
[INFO] [INFO] Installing /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/utility-1.0-sources.jar to /Users/akuntamukkala/.m2/repository/com/app/utility/1.0/utility-1.0-sources.jar
[INFO] [INFO] Installing /Users/akuntamukkala/GIT/mrp-git-cb-demo/utility/target/checkout/utility/target/utility-1.0-javadoc.jar to /Users/akuntamukkala/.m2/repository/com/app/utility/1.0/utility-1.0-javadoc.jar
[INFO] [INFO] 
[INFO] [INFO] --- maven-deploy-plugin:2.7:deploy (default-deploy) @ utility ---
[INFO] WAGON_VERSION: 1.0-beta-2
[INFO] Uploading: dav:https://repository-akuntamukkala.forge.cloudbees.com/release/com/app/utility/1.0/utility-1.0.jar
[INFO] 3 KB   
[INFO]        
[INFO] Uploaded: dav:https://repository-akuntamukkala.forge.cloudbees.com/release/com/app/utility/1.0/utility-1.0.jar (3 KB at 0.2 KB/sec)
[INFO] Uploading: https://repository-akuntamukkala.forge.cloudbees.com/release/com/app/utility/1.0/utility-1.0.pom
[INFO] 3 KB   
[INFO]        
[INFO] Uploaded: https://repository-akuntamukkala.forge.cloudbees.com/release/com/app/utility/1.0/utility-1.0.pom (3 KB at 0.3 KB/sec)
[INFO] Downloading: https://repository-akuntamukkala.forge.cloudbees.com/release/com/app/utility/maven-metadata.xml
[INFO]        
[INFO] Uploading: https://repository-akuntamukkala.forge.cloudbees.com/release/com/app/utility/maven-metadata.xml
[INFO] 290 B   
[INFO]         
[INFO] Uploaded: https://repository-akuntamukkala.forge.cloudbees.com/release/com/app/utility/maven-metadata.xml (290 B at 0.1 KB/sec)
[INFO] Uploading: dav:https://repository-akuntamukkala.forge.cloudbees.com/release/com/app/utility/1.0/utility-1.0-sources.jar
[INFO] 761 B   
[INFO]         
[INFO] Uploaded: dav:https://repository-akuntamukkala.forge.cloudbees.com/release/com/app/utility/1.0/utility-1.0-sources.jar (761 B at 0.1 KB/sec)
[INFO] Uploading: dav:https://repository-akuntamukkala.forge.cloudbees.com/release/com/app/utility/1.0/utility-1.0-javadoc.jar
[INFO] 4 KB    
[INFO] 8 KB   
[INFO] 12 KB   
[INFO] 16 KB   
[INFO] 20 KB   
[INFO] 21 KB   
[INFO]         
[INFO] Uploaded: dav:https://repository-akuntamukkala.forge.cloudbees.com/release/com/app/utility/1.0/utility-1.0-javadoc.jar (21 KB at 2.5 KB/sec)
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] BUILD SUCCESS
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] Total time: 42.872s
[INFO] [INFO] Finished at: Sun Jun 16 17:58:53 GMT+05:30 2013
[INFO] [INFO] Final Memory: 16M/81M
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] Cleaning up after release...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:03.465s
[INFO] Finished at: Sun Jun 16 17:58:53 GMT+05:30 2013
[INFO] Final Memory: 5M/81M
[INFO] ------------------------------------------------------------------------

Viewing the remote repository using a WebDAV client:

Download and configure CyberDuck WebDAV Client to browse the CloudBees release artifact repository. Use the same credentials which we used in settings.xml



The following screenshot shows the contents on release artifact repository. 


Conclusion:

We have seen how to use maven release plugin's prepare and perform goals in a project using Git, GitHub and CloudBees JFrog Artifact Repository. 

Maven release plugin is feature rich and there are so many options that I haven't discovered . For most part we have seen the plain vanilla use case here. 

I'd love to hear about your use cases where you found maven release plugin useful and where you did not. 

As always, any comments, suggestions to improve content are most welcome. 

Thanks again for your interest! Long live open source!

Useful References:
  1. http://maven.apache.org/maven-release/maven-release-plugin/index.html
  2. http://www.insaneprogramming.be/?p=362
  3. https://github.com/arey/maven-config-github-cloudbees/blob/master/pom.xml