This page describes the steps that a release manager needs to take to perform a release of Apache CloudStack.

(Thanks to the couchdb project for a great template to use for this procedural document!)


  1. Ensure that you are working on the correct branch.  The CloudStack community has adopted a branch-before-release strategy for release branches.
  2. Confirm that the information in is current
  3. Confirm that the information in is current
  4. Update the CHANGES file with the critical changes introduced in the release (Be sure to highlight any changes the break backward compatibility)
  5. Remove "version has not been released" warnings from the CHANGES file
  6. Ensure that the CHANGES file in your release branch is synced with the version in the master branch (which may have a future release already in it)
  7. Confirm that there is a jenkins build process for the release branch, and that all associated jobs are succeeding.
  8. You'll need your GPG public key to be added to the CloudStack KEYS file (see Appendix A at the end of the article on how to do that).

Getting Community Concensus

Prior to an official vote, start a thread on the cloudstack-dev mailing list, specifically asking for comments on the project's readiness to cut a release.

Once it appears that any outstanding blockers have been addressed, you can proceed to the next step.

Preparing a Release

Update your local git repo from the ASF repository:

git fetch origin

Check out the release branch:

git checkout X.Y

( or if you haven't already checked it out locally with remote tracking enabled: git checkout -b X.Y origin/X.Y )

Make sure your local copy exactly matches the remote repo:

git reset --hard HEAD
git clean -qfxd
git rebase origin/X.Y

Then run the source build script (Replacing the parameters: X.Y.Z.0=your official version number for the release; X.Y=the branch (can be master) that the release is coming from; CCCC=the GPG Key to sign both the artifacts and the git tag with):

tools/build/ -v X.Y.Z.0 -b X.Y -t -u CCCC -s /path/to/the/source/dir -c

( optionally specifying your local directory layout - see -h for details )

This will automatically commit (the -c) to the cloudstack dist dev folder (on SVN). This is the staging area for Apache CloudStack distributions.

Get the commit-sh to vote against for your VOTE email. This comes from the output of the command above. Example:

 completed.  use commit-sh of b25d27d80b62de3408041821aa99e68712ae2728 when starting the VOTE thread

A RC branch will have been created. When a vote is done you can either delete it or merge it back depending on the outcome.

Test the Build

Follow the instructions documented in your release branch's test procedures wiki page.

If your personal tests pass, you are ready to propose the release to the community.

Managing the Vote(s) VOTE

Email the mailing list, using the following template:

SUBJECT: [VOTE] Apache Cloudstack X.Y.Z


Hi All,

I've created a X.Y.Z.0 release, with the following artifacts up for a vote:

Git Branch and Commit SH:;a=shortlog;h=refs/heads/X.Y

Source release (checksums and signatures are available at the same

PGP release keys (signed using XXXXXXXX):

Vote will be open for 72 hours.

For sanity in tallying the vote, can PMC members please be sure to indicate "(binding)" with their vote?

[ ] +1  approve
[ ] +0  no opinion
[ ] -1  disapprove (and reason why) Voting Results

After 72 hours, the vote can be closed.  

If (after tallying the vote) the binding +1 votes are not in the majority, the issues noted need to be addressed and process starts again. You need to send out a results email (or a less formal abort email) for the VOTE thread.

If the vote passes, then send a [RESULTS] vote to the dev list.  Template below:

SUBJECT: [RESULT][VOTE] Apache CloudStack X.Y.Z


Hi all,

After 72 hours, the vote for CloudStack X.Y.Z.0 [1] *passes* with
Z PMC + Z non-PMC votes.

+1 (PMC / binding)
* person

+1 (non binding)
* person



Thanks to everyone participating.

I will now prepare the release announcement to go out after 24 hours to give the mirrors time to catch up.

Publish the Release

Merge back the RC branch

merge and push the release candidate branch into the release branch. Parts of this procedure is explained further on in more generic terms.

$ git checkout X.Y-RC20141121T0341
$ git tag X.Y.Z.0
$ git push origin X.Y.Z.0
$ git checkout X.Y
$ git merge X.Y-RC20141121T0341
$ git branch -m X.Y-RC20141121T0341 GA-X.Y.Z.0 # renames the old release candidate to something that makes sense
$ git push origin X.Y
$ git push origin :X.Y-RC20141121T0341 # deletes the old branch

Keeping the branch around as GA-X.Y.Z is not strictly necessary. Neither is tagging the release as the commit-id is really the part that is voted on.

Set the HEAD version numbers to the next release number

Run the version reset script setting the latest pom version numbers to be equal to the next bug-fix release for the branch (including SNAPSHOT).  Example:

$ tools/build/ -b [branch] -v X.Y.A.0-SNAPSHOT -s ~/cloudstack-release
$ git push origin [branch]

Push the release tag

The release should have already been tagged in your local repo when you used the script (the -t option).  However, you need to push that tag once the VOTE passes:

$ git push origin X.Y.Z.0

Close the release in JIRA

find a JIRA administrator/PMC member to go to and enter the release date for the version

Move the release from "dev" to "release"

Move the release artifacts into place (replace X.Y.Z.0 with the release number, and replace Y.Y.Y with the previous release number):

# svn mv -m "Publishing X.Y.Z.0 release"

Wait 24 hours for the mirrors to catch up.

Update to point to the new release, and add the older release to the archive list.

Remove the prior release from the release dist area (it's still archived):

# cd /tmp/cs-release/releases
# svn rm Y.Y.Y
# svn commit -m "Removing Y.Y.Y release"

Contact Security Team

For some releases, the CloudStack security team may be waiting for release announcement so they can simultaneously announce any security advisories related to the release.

Release Notes

The release notes at Read The Docs must be updated to include the changes in the release and also the upgrade procedure to the new release. At a minimum, fixed_issues and about need updating in cloudstack-docs-rn


The current version of CloudStack is referenced in a few places in the installation documentation. 

Community Binaries

The community 'hosters' at and should be notified and requested to create and upload the convenience binaries to their sites.

Announcing the Release

After waiting 24 hours for the ASF mirrors to catch up, the release is ready to be announced. Send separate announcement emails to,,, and  This is best done using your address, so that the announcement gets moderated through to the lists.

The contents of the message should have been discussed on first.

Link to boilerplate maintenance release announcement

Update Downloads Page

The downloads page at must be updated - this involves updating the /data/cloudstack.yaml in and then building the website (

Add CloudStack announcement at Apache Blogs Page

Add a post at 

You need author permissions on Apache Roller, which need to be given by an Admin of the Apache CloudStack project blog.

Appendix A: Adding your GPG key to CloudStack KEYS

Install subversion on your release environment (preferably Linux or OSX based).

cd /tmp
svn co --depth empty
cd cloudstack
svn up KEYS # this will get the latest KEYS file
# append your GPG key to the KEYS file, see the KEYS file for instructions as well.
# gpg --list-sigs <key ID> >> KEYS
# gpg --armor --export <key ID> >> KEYS
svn diff
svn add KEYS
svn commit KEYS -m "KEYS: add key of apache_id FirstName LastName to CloudStack KEYS"