This short guide is for volunteers that intend to cover the role of Release Manager. It also contains a sections for voters with recommended steps before casting a vote.
svn commit -m "updating files for release"
mvn clean deploy
mvn release:branch -DbranchName=1.0.x
svn checkout https://svn.apache.org/repos/asf/onami/branches/${module}-${version}mvn release:prepare -DdryRun=true
If you cancel a release:prepare before it updates the pom.xml versions, then use the release:clean goal to just remove the extra files that were created.
svn commit -m "fixing formatting for release"
for file in `find . -type f -iname '*.asc'`
do
  gpg --verify ${file}
donegpg: Good signature from ... gpg: Signature made ...
mvn release:rollback
mvn release:prepare
mvn release:perform [-Duser.name=<your_apache_uid>]
If your local OS userid doesn't match your Apache userid, then you'll have to also override the value provided by the OS to Maven for the site-deploy step to work. This is known to work for Linux, but not for Mac and unknown for Windows.
To: "Apache Onami Developers List" <dev@onami.apache.org> Subject: [VOTE] Release Apache Onami XXXX major.minor.patch Hi, We solved N issues: http://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12311100&styleName=Html&version=X.Y There are still a couple of issues left in JIRA: http://issues.apache.org/jira/secure/IssueNavigator.jspa?reset=true&pid=12311100&status=1 SVN source tag https://svn.apache.org/repos/asf/onami/tags/org.apache.onami.xxxx-major.minor.patch/ Staging repo: https://repository.apache.org/content/repositories/orgapacheonami-[YOUR REPOSITORY ID]/ Release artifact: https://repository.apache.org/content/repositories/orgapacheonami-[YOUR REPOSITORY ID]/org/apache/onami/org.apache.onami.xxxx/major.minor.patch/org.apache.onami.xxx-major.minor.patch-source-release.zip PGP release keys (signed using ABCDEFG): http://www.apache.org/dist/onami/KEYS Vote will be open for 72 hours. [ ] +1, let's get it ruuuumbleeeeee!!! [ ] +/-0, fine, but consider to fix few issues before... [ ] -1, nope, because... (and please explain why)
To: "Apache Onami Developers List" <dev@onami.apache.org>
Subject: [DISCUSS] Apache Onami XXXX major.minor.patch
Discussion thread for vote on <version> release candidate, with SVN source tag.
For more information on the release process, check out http://www.apache.org/dev/release.html
Some of the things to check before voting are:
 - does "mvn rat:check" pass on the source
 - can you build the contents of source-release.zip and svn tag
 - do all of the staged jars/zips contain the required LICENSE and NOTICE files
 - are all of the staged jars signed and the signature verifiable
 - is the signing key in the project's KEYS file and on a public server (i.e. http://www.apache.org/dist/onami/)
            To: "Apache Onami Developers List" <dev@onami.apache.org>
Subject: [RESULT] [VOTE] Release Onami XXXX major.minor.patch
Hi,
The vote has passed with the following result :
+1 (binding):
    Christian Grobmeier
    Mohammad Nour El-Din
    Olivier Lamy
    Jordi Gerona
    Marco Speranza
    Simone Tripodi
+1 (non binding):
    Mario Rossi
    John Doe
I will promote the artifacts to the central repo.svn co https://dist.apache.org/repos/dist/release/onami onami-dist cd onami-dist # if the component dir doesn't exist svn mkdir org.apache.onami.xxxx cd org.apache.onami.xxxx wget -e robots=off -nH --cut-dirs=7 -np --no-check-certificate -m -A *.zip* -R .asc.sha1,.asc.md5 \ https://repository.apache.org/content/repositories/orgapacheonami-[YOUR REPOSITORY ID]/org/apache/onami/org.apache.onami.xxxx/major.minor.patch/ svn add major.minor.patch svn commit -m "Promoting the voted release artifacts" major.minor.patch
Make an announcement about the release on the user@, dev@, and announce@ lists as per the Apache Announcement Mailing Lists page
From: YOUR_APACHE_USERNAME@apache.org To: "ASF Announcements" <announce@apache.org>, "Apache Onami Users List" <user@onami.apache.org> CC: "Apache Onami Developers List" <dev@onami.apache.org>, "Google Guice Users List" <google-guice@googlegroups.com> Subject: [ANNOUNCE] Apache Onami XXXX major.minor.patch The Apache Onami Team is pleased to announce the release of Apache Onami XXXX major.minor.patch. (put XXXX extension description here) Release Notes: (put JIRA release notes here) Have Fun, (committer name), on behalf of the Apache Onami PMC
mvn release:rollback
svn rm https://svn.apache.org/repos/asf/onami/tags/org.apache.onami.xxxx-major.minor.patch -m "deleting tag from rolled back release"
Making releases is a serious job at the ASF. And a time-eater.
The following gives you some ideas to check a release and cast your vote (as written by Christian Grobmeier on the Onami dev mailing list).
[1] https://gist.github.com/3504123 from our mate Ivan (over from logging land)
from os.path import join, splitext, basename
import os
import sys
import hashlib
def file_get_contents(path):
    with open(path, 'rb') as file:
        return file.read()
for root, dirs, files in os.walk('.'):
    for file in files:
        file = join(root, file)
        name, ext = splitext(file)
        
        if ext == '.md5':
            file_contents = file_get_contents(name)
            md5_given = file_get_contents(file)
            md5_actual = hashlib.md5(file_contents).hexdigest()
            
            if (md5_given == md5_actual):
                print "%s md5 OK" % basename(name)
            else:
                print "\nERROR: md5 mismatch\nfile      : %s\ncalculated: %s\ngiven     : %s\n" % (name, md5_actual, md5_given)
        if ext == '.sha1':
            file_contents = file_get_contents(name)
            sha1_given = file_get_contents(file)
            sha1_actual = hashlib.sha1(file_contents).hexdigest()
            
            if (sha1_given == sha1_actual):
                print "%s sha1 OK" % basename(name)
            else:
                print "\nERROR: sha1 mismatch\nfile      : %s\ncalculated: %s\ngiven     : %s\n" % (name, sha1_actual, sha1_given)[2] http://www.grobmeier.de/checking-md5-and-signatures-with-a-shell-script-29062011.html
#!/bin/bash
 
file1=`md5 -q $1`
file2=`cut -d* -f1 $1.md5`
 
echo "Checking file: $1"
echo "Using MD5 file: $1.md5"
echo $file1
echo $file2
 
if [ $file1 != $file2 ]
then
    echo "md5 sums mismatch"
else
    echo "checksums OK"
fi
 
echo "GPG verification output"
gpg --verify $1.asc $1