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