Releasing Apache OpenJPA
=========================

Licensed under Apache License 2.0 - http://www.apache.org/licenses/LICENSE-2.0


== Summary

These instructions describe how perform an official release of the Apache OpenJPA project.


== Prerequisits


* You need a valid Apache account and 
* Maven installed on your box
* Java 6 or 7
* Do NOT Release with Java 8 yet!
* TODO probably we require a ~/.m2/toolchains.xml set up correctly in the future 



== Manual Release Preparation Steps

* Make sure you have the latest version checked out and no local modifications
 $> svn up
 $> svn st
 This should not show any dirty files

* Run a full build
 $> mvn clean install

== Update the Release Notes
Edit openjpa-project/RELEASE-NOTES.html and add a new section for the new release.
Just remove all the bug content from the previous release.

Make sure all the ticets for the upcoming release are set to resolved
You can grab the content for the new release at
https://issues.apache.org/jira/browse/OPENJPA/?selectedTab=com.atlassian.jira.jira-projects-plugin:versions-panel
Just copy over the html content for the generated ReleaseNotes.

At last add a link to the RELEASE-NOTES.html of the previous release to the table on the bottom of the page.


== Performing the Release

We use maven to roll the release. Please make sure you understand how 
the Apache Maven maven-release-plugin works:
http://maven.apache.org/maven-release/maven-release-plugin/


=== Running the release prepare steps

$> mvn release:prepare 

Depending on your location you probably get an error for the first time.
This happens if you hit a svn mirror which is not updated quickly enough.
Simply rerun this step after a few seconds. No worries, maven will continue
exactly where it left off.

=== Validating the tag

You should now get a fresh tag in https://svn.apache.org/repos/asf/openjpa/tags/
Please verify that the tag looks good and that all pom.xml files really got updated. 


=== Running the release perform steps

$> mvn release:perform

This will finally do a clean checkout from the freshly generated tag and



== Verifying the Maven Staging Repository

Login in to https://repository.apache.org/
Navigate to 'Staging Repositories' and verify the content of your release.
Then 'close' the staging and copy the URL of the staging repository



== Call a VOTE

Send the usual VOTE mail to the mailing List


== After the VOTE succeeded

Tally the VOTEs and send the result to the mailing list.
Propagate the staging repository and wait until the results appear on maven.central


== Upload the distribution binaries

Checkout the distribution area from SVN
https://dist.apache.org/repos/dist/release/openjpa

Add a new directory for the new version and upload the binaries.
You might use the following getrelease.sh script for it:

-----
#!/bin/sh
mkdir $1
cd $1

curl -O https://repository.apache.org/content/groups/public/org/apache/openjpa/apache-openjpa/${1}/apache-openjpa-${1}-binary.zip
curl -O https://repository.apache.org/content/groups/public/org/apache/openjpa/apache-openjpa/${1}/apache-openjpa-${1}-binary.zip.asc
curl -O https://repository.apache.org/content/groups/public/org/apache/openjpa/apache-openjpa/${1}/apache-openjpa-${1}-binary.zip.md5
curl -O https://repository.apache.org/content/groups/public/org/apache/openjpa/apache-openjpa/${1}/apache-openjpa-${1}-binary.zip.sha1

curl -O https://repository.apache.org/content/groups/public/org/apache/openjpa/openjpa-parent/${1}/openjpa-parent-${1}-source-release.zip
curl -O https://repository.apache.org/content/groups/public/org/apache/openjpa/openjpa-parent/${1}/openjpa-parent-${1}-source-release.zip.asc
curl -O https://repository.apache.org/content/groups/public/org/apache/openjpa/openjpa-parent/${1}/openjpa-parent-${1}-source-release.zip.md5
curl -O https://repository.apache.org/content/groups/public/org/apache/openjpa/openjpa-parent/${1}/openjpa-parent-${1}-source-release.zip.sha1

cd ..
-----

You also need to remove any now obsolete previous version.
E.g. when releasing our release 2.4.2 we should remove 2.4.1.
Older still maintained versions remain on the dist area as long as the branch is still actively maintained.


== Upload the site for the new version


The site for OpenJPA is maintained with the [Apache CMS](http://www.apache.org/dev/cmsref.html).
The sources of the site are hosted in Subversion

-----
svn co https://svn.apache.org/repos/asf/openjpa/site/trunk openjpa-site
-----


===  Update the download page

Edit content/downloads.mdtext and add the new release.
Or for a simple maintenance release just replace the previous version with the new information.
The information on this side should match the content available in the dist area.

Please also add proper changes to content/downloads-nightly.mdtext!


=== Upload JavaDoc of the new version

Edit content/documentation.mdtext