blob: 1e4c0cfa4be9696abb469d5e2081f2751a224ab7 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<meta name="description" content="Apache TomEE">
<meta name="author" content="Apache TomEE">
<meta name="google-translate-customization" content="f36a520c08f4c9-0a04e86a9c075ce9-g265f3196f697cf8f-10">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate, max-age=0">
<!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!-- Le styles -->
<link href="./../resources/css/bootstrap.css" rel="stylesheet">
<link href="./../resources/css/prettify.css" rel="stylesheet">
<!--link href="./../resources/css/bootstrap-mods.css" rel="stylesheet"-->
<link href="./../resources/css/main.css" rel="stylesheet">
<link href="./../resources/font-awesome-4.6.3/css/font-awesome.min.css" rel="stylesheet">
<script type="text/javascript">
var t = encodeURIComponent(document.title.replace(/^\s+|\s+$/g,""));
var u = encodeURIComponent(""+document.URL);
function fbshare () {
window.open(
"http://www.facebook.com/sharer/sharer.php?u="+u,
'Share on Facebook',
'width=640,height=426');
};
function gpshare () {
window.open(
"https://plus.google.com/share?url="+u,
'Share on Google+',
'width=584,height=385');
};
function twshare () {
window.open(
"https://twitter.com/intent/tweet?url="+u+"&text="+t,
'Share on Twitter',
'width=800,height=526');
};
function pinshare () {
window.open("//www.pinterest.com/pin/create/button/?url="+u+"&media=http%3A%2F%2Ftomee.apache.org%2Fresources%2Fimages%2Ffeather-logo.png&description="+t,
'Share on Pinterest',
'width=800,height=526');
};
</script>
<!-- Le fav and touch icons -->
<link rel="shortcut icon" href="./../favicon.ico">
<link rel="apple-touch-icon" href="./../resources/images/apple-touch-icon.png">
<link rel="apple-touch-icon" sizes="72x72" href="./../resources/images/apple-touch-icon-72x72.png">
<link rel="apple-touch-icon" sizes="114x114" href="./../resources/images/apple-touch-icon-114x114.png">
<script src="./../resources/js/prettify.js" type="text/javascript"></script>
<script src="./../resources/js/jquery-latest.js"></script>
<script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script>
<script src="./../resources/js/common.js"></script>
<script src="./../resources/js/prettyprint.js"></script>
<!--script src="//assets.pinterest.com/js/pinit.js" type="text/javascript" async></script//-->
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-2717626-1']);
_gaq.push(['_setDomainName', 'apache.org']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body>
<div class="topbar" data-dropdown="dropdown">
<div class="fill">
<div class="container">
<a class="brand" href="./../index.html">Apache TomEE</a>
<ul class="nav">
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
Apache
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<!-- <li><a href="./../misc/whoweare.html">Who we are?</a></li> -->
<!-- <li><a href="./../misc/heritage.html">Heritage</a></li> -->
<li><a href="http://www.apache.org">Apache Home</a></li>
<!-- <li><a href="./../misc/resources.html">Resources</a></li> -->
<li><a href="./../misc/contact.html">Contact</a></li>
<li><a href="./../misc/legal.html">Legal</a></li>
<li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
<li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
<li class="divider"/>
<li><a href="http://www.apache.org/security">Security</a></li>
</ul>
</li>
<li><a href="./../index.html">Home</a></li>
<li><a href="./../downloads.html">Downloads</a></li>
<li><a href="./../documentation.html">Documentation</a></li>
<li><a href="./../examples-trunk/index.html">Examples</a></li>
<li><a href="./../support.html">Support</a></li>
<li><a href="./../contribute.html">Contribute</a></li>
<li><a href="./../security/index.html">Security</a></li>
</ul>
<!-- Google CSE Search Box Begins -->
<FORM class="pull-right" id="searchbox_010475492895890475512:_t4iqjrgx90" action="http://www.google.com/cse">
<INPUT type="hidden" name="cx" value="010475492895890475512:_t4iqjrgx90">
<INPUT type="hidden" name="cof" value="FORID:0">
<INPUT size="18" width="130" style="width:130px" name="q" type="text" placeholder="Search">
</FORM>
<!--<SCRIPT type="text/javascript" src="http://www.google.com/coop/cse/brand?form=searchbox_010475492895890475512:_t4iqjrgx90"></SCRIPT>-->
<!-- Google CSE Search Box Ends -->
</div>
</div>
</div>
<div class="container">
<div class="page-header">
<small><a href="./../index.html">Home</a>&nbsp;&raquo&nbsp;<a href="./../dev/">Dev</a></small><br>
<h1>
<div style="float: right; position: relative; bottom: -10px; ">
<a onclick="javascript:gpshare()" class="gp-share sprite" title="Share on Google+">share [gp]</a>
<a onclick="javascript:fbshare()" class="fb-share sprite" title="Share on Facebook">share [fb]</a>
<a onclick="javascript:twshare()" class="tw-share sprite" title="Share on Twitter">share [tw]</a>
<a onclick="javascript:pinshare()" class="pin-share sprite" title="Share on Pinterest">share [pin]</a>
<a data-toggle="modal" href="#edit" class="edit-page" title="Contribute to this Page">contribute</a>
</div>
</h1>
</div>
<h1>Releasing TomEE</h1>
<pre><code>This document is aimed at guiding a release manager through the general release process. You will need either a Linux, Mac, or failing that a Linux Virtual (with at least a 50GB Drive) on Win.
</code></pre>
<h3>Preparation of The Branch</h3>
<p>Run <strong>ant -f rat.xml > report.txt</strong> on trunk to ensure all licences are in place.</p>
<ul>
<li>Review the report.txt and update/add missing headers until clean.</li>
<li><em>Tip</em>, search for <strong>Unapproved licenses:</strong> at the beginning of the report for a list.</li>
</ul>
<p>Branch the version to release and ensure it builds and passes all tests.</p>
<p>Add a buildbot CI setup for branch here:</p>
<p><a href="https://svn.apache.org/repos/infra/infrastructure/buildbot/aegis/buildmaster/master1/projects/tomee.conf">https://svn.apache.org/repos/infra/infrastructure/buildbot/aegis/buildmaster/master1/projects/tomee.conf</a></p>
<p>Basically search for the following line and it should be obvious how to add a new builder:</p>
<pre><code>c['builders'].append(tomee_hemera_builder("tomee-trunk-ubuntu", "tomee/tomee/trunk"))
</code></pre>
<p>An SVN trigger must be added afterwards. This can only be done by someone with admin permissions, such as any PMC chair or an Infra team member.
Just drop an email to <em>infrastructure@apache.org</em></p>
<h3>Create a TCK Branch</h3>
<p>Branch the TCK using the same version as the release branch from here:</p>
<p><a href="https://svn.apache.org/repos/tck/tomee-tck/trunk">https://svn.apache.org/repos/tck/tomee-tck/trunk</a></p>
<p>Update the TCK branch files to point to the version branch.</p>
<pre><code>\tckbranch\plus.properties
\tckbranch\pom.xml
\tckbranch\webprofile-plus.properties
\tckbranch\webprofile.properties
</code></pre>
<p>Run <strong>ant -f rat.xml > report.txt</strong> on the branch.</p>
<ul>
<li>Review the report.txt and update/add missing headers until clean.</li>
<li><em>Tip</em>, search for <strong>Unapproved licenses:</strong>.</li>
</ul>
<h3>Check SVN Authentication</h3>
<p>Pre-authenticate svn repositories to ensure your credentials are cached before using any tools.</p>
<pre><code>svn mkdir --username [apacheuser] --password [apachepw] -m "Create test dir" https://svn.apache.org/repos/asf/tomee/tomee/branches/testdir1
svn delete --username [apacheuser] --password [apachepw] -m "Delete test dir" https://svn.apache.org/repos/asf/tomee/tomee/branches/testdir1
svn mkdir --username [apacheuser] --password [apachepw] -m "Create test dir" https://repository.apache.org/content/repositories/testdir2
svn delete --username [apacheuser] --password [apachepw] -m "Delete test dir" https://repository.apache.org/content/repositories/testdir2
svn mkdir --username [apacheuser] --password [apachepw] -m "Create test dir" https://dist.apache.org/repos/dist/dev/tomee/testdir3
svn delete --username [apacheuser] --password [apachepw] -m "Delete test dir" https://dist.apache.org/repos/dist/dev/tomee/testdir3
</code></pre>
<h3>Prepare Maven Authentication</h3>
<p>Ensure your maven .m2/settings.xml correct, and be aware that the tools currently require a clear text password:</p>
<pre><code>&lt;server&gt;
&lt;id&gt;apache.snapshots.https&lt;/id&gt;
&lt;username&gt;un&lt;/username&gt;
&lt;password&gt;pw.in.clear&lt;/password&gt;
&lt;/server&gt;
&lt;server&gt;
&lt;id&gt;apache.releases.https&lt;/id&gt;
&lt;username&gt;un&lt;/username&gt;
&lt;password&gt;pw.in.clear&lt;/password&gt;
&lt;/server&gt;
&lt;server&gt;
&lt;id&gt;apache.dist.https&lt;/id&gt;
&lt;username&gt;un&lt;/username&gt;
&lt;password&gt;pw.in.clear&lt;/password&gt;
&lt;/server&gt;
&lt;profiles&gt;
&lt;profile&gt;
...
&lt;repositories&gt;
&lt;repository&gt;
&lt;id&gt;apache.dist.https&lt;/id&gt;
&lt;url&gt;https://dist.apache.org/repos/dist&lt;/url&gt;
&lt;/repository&gt;
&lt;/repositories&gt;
</code></pre>
<h3>Code Signing Setup</h3>
<p>If this is your first release then you will have to ensure that you have a code signing key prepared on the machine from which you perform the release. The process is quite intense. You can find information here:</p>
<ul>
<li><a href="http://www.apache.org/dev/release-signing.html">http://www.apache.org/dev/release-signing.html</a></li>
<li><a href="http://maven.apache.org/developers/release/pmc-gpg-keys.html">http://maven.apache.org/developers/release/pmc-gpg-keys.html</a></li>
</ul>
<p>However, the basic steps are:</p>
<ul>
<li>Create a key using <strong>gpg --gen-key</strong>, using size 4096 and answering the questions that command issues.</li>
<li>During the process you will have to generate random entropy, this is best achieved in another console and issuing the command <strong>find / > /dev/null</strong> and waiting a minute.</li>
<li>List the keys using <strong>gpg --list-keys</strong> and take note of the name</li>
</ul>
<p>Once you have your key then you will need to append it to the key file here:</p>
<ul>
<li><a href="http://www.apache.org/dist/tomee/KEYS">http://www.apache.org/dist/tomee/KEYS</a></li>
</ul>
<p>That is best done as the file itself explains, once you open and view it in a UTF-8 safe text editor you will see the description at the top. <br />
Just follow the instructions there on how to append your key. The basic steps are also here, please read both before you proceed:</p>
<ul>
<li>Save the KEYS file on your local machine and import it using <strong>gpg --import KEYS</strong></li>
<li>Then create the new KEYS file using <strong>(gpg --list-sigs <your name> &amp;&amp; gpg --armor --export <your name>) >> KEYS</strong></li>
<li>Check that the new KEYS file contains your key.</li>
<li>Log in to people.apache.org and locate /dist/tomee/KEYS</li>
<li>Make a backup of the remote KEYS file just in case</li>
<li>Overwrite the old /dist/tomee/KEYS file with your new one that now also contains your key.</li>
<li>Go to <a href="http://pgp.mit.edu/">http://pgp.mit.edu/</a> and add your ascii armoured key</li>
<li>Take note of your key fingerprint using <strong>gpg --fingerprint <your name></strong></li>
<li>Go to <a href="https://id.apache.org">https://id.apache.org</a>, log in and fill OpenPGP Public Key Primary Fingerprint: with the value of your fingerprint.</li>
</ul>
<h3>Build the Release Tools</h3>
<p>Checkout the release tools using SVN from here <a href="https://svn.apache.org/repos/asf/tomee/sandbox/release-tools">https://svn.apache.org/repos/asf/tomee/sandbox/release-tools</a></p>
<p>Really read the README.mdtext and follow the instructions for building the 3rd party libraries. <br />
Basically SVN checkout and compile <a href="https://svn.codehaus.org/swizzle/trunk">Swizzle</a> and <a href="https://svn.apache.org/repos/asf/creadur/tentacles/trunk">Tentacles</a></p>
<p>Build the release tools, <em>mvn clean install -DskipTests -DfailIfNoTests=false</em></p>
<p>Have a look at <strong>run.sh</strong> to see the entry point.</p>
<p>Understand that the release tools are not polished, and you currently may have to edit source and re-compile.</p>
<h3>Site Staging</h3>
<p><a href="#staging"/>
For some of the release steps you will need to provide documentation on the site. Checkout the site here:</p>
<p><a href="https://svn.apache.org/repos/asf/tomee/site/trunk">https://svn.apache.org/repos/asf/tomee/site/trunk</a></p>
<p>Most of the content can be found under 'content' and subdirectories.</p>
<p>When you commit changes the site should be built automatically by the buildbot, but you can force a build on IRC using:</p>
<pre><code>**tomee-bot: force build tomee-site-staging**
</code></pre>
<p>The buildbot staging result can be seen here:</p>
<p><a href="http://ci.apache.org/builders/tomee-site-staging">http://ci.apache.org/builders/tomee-site-staging</a></p>
<p>And the actual staging site, where you can review your changes, is here:</p>
<p><a href="http://tomee.staging.apache.org/">http://tomee.staging.apache.org/</a></p>
<p>Once you are happy with the staging you can publish to the real site using:</p>
<p><a href="https://cms.apache.org/tomee/publish">https://cms.apache.org/tomee/publish</a></p>
<h3>Begin The Release Process</h3>
<p>Ensure TCK is passing all tests, and if so create an SVN tag from the branch.</p>
<pre><code>Note: It is a future goal to either separate OpenEJB from TomEE or unify the versions so the
[maven-release-plugin](http://maven.apache.org/maven-release/maven-release-plugin/) can be used.
Because we cannot use the Maven release tools we currently have to create a an SVN tag manually. The best way to do this is to:
- Copy the branch to a staging branch using:
&gt; svn copy https://svn.apache.org/repos/asf/tomee/tomee/branches/tomee-[version] https://svn.apache.org/repos/asf/tomee/tomee/branches/tomee-[version]-staging -m "Staging [version]"
- Checkout the staging branch using:
&gt; svn co https://svn.apache.org/repos/asf/tomee/tomee/branches/tomee-[version]-staging tomee-[version]-staging
- Update all SNAPSHOT versions to the release versions in the local tomee-[version]-staging and commit.
- Create the tag from the staging:
&gt; svn copy https://svn.apache.org/repos/asf/tomee/tomee/branches/tomee-[version]-staging https://svn.apache.org/repos/asf/tomee/tomee/tags/tomee-[version] -m "Tag [version]"
- Delete the staging branch using:
&gt; svn rm https://svn.apache.org/repos/asf/tomee/tomee/branches/tomee-[version]-staging -m "Delete staging"
</code></pre>
<p>Open a console on the release-tools directory.</p>
<p>Note: Before running any <strong>./run.sh</strong> activity always check the release tools code for the command tomee-release-tools/src/main/java/org/apache/openejb/tools/release/cmd.
At the moment some of the commands need manually editing to work. Eventually the commands should be re-written.</p>
<p>All JIRA actions should be performed on the ASF JIRA here:</p>
<p><a href="https://issues.apache.org/jira/browse/TOMEE">https://issues.apache.org/jira/browse/TOMEE</a></p>
<p>Ensure JIRAs have been filed for commits using <strong>./run.sh reviewcommits</strong></p>
<p>Update fixVersions for JIRAs used in SVN commits using <strong>./run.sh updatejiras</strong> - <em>Untested, requires investigation</em></p>
<p>Review and bulk Close all JIRAs for the version to be released.</p>
<p>Publish the changed binaries report (if any) using <strong>./run.sh comparelibraries</strong></p>
<p>Write and publish the release notes preview on the staging site. </p>
<p>Publish a summary of the RAT report preview on the staging site.</p>
<p>Using the RAT report as a guide update LICENSE and NOTICE files for any changed binaries, and add new ones if required.</p>
<p>Update branch versions. How you do this is up to you at this point in time.</p>
<p>Update trunk versions. How you do this is up to you at this point in time.</p>
<p>Create the next version iterations in JIRA.</p>
<h3>Rolling Out The Preview</h3>
<pre><code>Note: Before running anything below ensure you either have:
- A valid tomee-release.properties from the last release in your home directory (Speak to the last release manager).
- Or have modified **tomee-release-tools/src/main/java/org/apache/openejb/tools/release/Release.java** with current versions and **mvn clean install**.
</code></pre>
<p>Ensure the TCK passes with preview repositories by editing and ensuring paths are correct in the following files:</p>
<pre><code>\tckbranch\plus.properties
\tckbranch\pom.xml
\tckbranch\webprofile-plus.properties
\tckbranch\webprofile.properties
</code></pre>
<p>Publish the preview using <strong>./run.sh roll binaries legal releasenotes preview</strong> - You can run these tasks like so, or individually in order.
It will be likely that this will have to be repeated several times before a successful vote.</p>
<p>The <em>legal</em> step will create the legal report files in the /tmp/download/staging-[revision]/legal directory. These need to be added to the staging repo.
- Delete the [legal]/repo and [legal]/content directories, as these are no longer required
rm -R /tmp/download/staging-[revision]/legal/content
rm -R /tmp/download/staging-[revision]/legal/repo</p>
<ul>
<li>Perform a non-recursive checkout of the staging repo and add the legal:
svn co -N https://dist.apache.org/repos/dist/dev/tomee/staging-[revision] /tmp/download/staging
mv /tmp/download/staging-[revision]/legal /tmp/download/staging
cd /tmp/download/staging-[revision]
svn add legal</li>
</ul>
<p>Once the binaries are in place add the staging repository to the corresponding TCK project and fire off a build.
To fire off a build on EC2 from the TCK directory speak to the last release manager for the <strong>curl</strong> command to use</p>
<p>If the TCK fails then discuss, fix and re-roll.</p>
<p>Publish a <a href="https://www.apache.org/foundation/voting.html">Vote</a> if, and only if, the TCK passes.</p>
<p>Votes are generally managed and identified using keywords such as [VOTE], [CANCELLED] and [RESULT]</p>
<p>If the vote fails then discuss, fix and re-roll.</p>
<h3>Voted Binaries</h3>
<p>Once the vote has passed then release the binaries on Nexus: <a href="https://repository.apache.org/index.html#welcome">https://repository.apache.org/index.html#welcome</a></p>
<p>Update both OpenEJB and TomEE JIRA versions as released (Set the release date).</p>
<p>Copy the binaries to the release location (User rights require a PMC to do this)</p>
<pre><code>From: https://dist.apache.org/repos/dist/dev/tomee/staging-[stagingId]/tomee-[version]
To: https://dist.apache.org/repos/dist/release/tomee/tomee-[version]
</code></pre>
<p>Wait for the binaries to replicate to mirrors. Here is a neat script from David to check the status:</p>
<pre><code>#!/bin/bash
RELEASE=${1?Specify a release, such as './mirror_check.sh tomee-1.7.1'}
function list_mirrors {
DYN=http://www.apache.org/dyn/closer.cgi/tomee/$RELEASE/
wget -q -O - $DYN | tr '"&gt;&lt; ' '\n' | grep "^http.*$RELEASE/" | sort | uniq
}
function status_code {
wget -v "$1" 2&gt;&amp;1| grep 'awaiting response' | tr ' ' '\n' | grep "[0-9]"
}
list_mirrors | while read n; do
echo "$(status_code $n) $n"
done | sort | grep 'http'
</code></pre>
<p>Commit and publish changes to the site, see <a href="release-tomee.html#staging">Site Staging</a></p>
<pre><code>https://cms.apache.org/tomee/publish
</code></pre>
<h3>Blog</h3>
<p>Announce to the world that TomEE has new bells and whistles!</p>
<p><a href="https://blogs.apache.org/roller-ui/login.rol">https://blogs.apache.org/roller-ui/login.rol</a> <br />
<a href="http://twitter.com/ApacheTomEE">http://twitter.com/ApacheTomEE</a> <br />
<a href="http://facebook.com/ApacheTomEE">http://facebook.com/ApacheTomEE</a> <br />
<a href="https://plus.google.com/118203123063829126066">https://plus.google.com/118203123063829126066</a> </p>
<div id="edit" class="modal hide fade in" style="display: none; ">
<div class="modal-header">
<a class="close" data-dismiss="modal">x</a>
<h3>Thank you for contributing to the documentation!</h3>
</div>
<div class="modal-body">
<h4>Any help with the documentation is greatly appreciated.</h4>
<p>All edits are reviewed before going live, so feel free to do much more than fix typos or links. If you see a page that could benefit from an entire rewrite, we'd be thrilled to review it. Don't be surprised if we like it so much we ask you for help with other pages :)</p>
<small>NOTICE: unless indicated otherwise on the pages in question, all editable content available from apache.org is presumed to be licensed under the Apache License (AL) version 2.0 and hence all submissions to apache.org treated as formal Contributions under the license terms.</small>
<!--[if gt IE 6]>
<h4>Internet Explorer Users</h4>
<p>If you are not an Apache committer, click the Yes link and enter a <i>anonymous</i> for the username and leave the password empty</p>
<![endif]-->
</div>
<div class="modal-footer">
Do you have an Apache ID?
<a href="javascript:void(location.href='https://cms.apache.org/redirect?uri='+escape(location.href))" class="btn">Yes</a>
<a href="javascript:void(location.href='https://anonymous:@cms.apache.org/redirect?uri='+escape(location.href))" class="btn">No</a>
</div>
</div>
<script src="./../resources/js/bootstrap-modal.js"></script>
<footer>
<p>Copyright &copy; 1999-2016 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.
Apache TomEE, TomEE, Apache, the Apache feather logo, and the Apache TomEE project logo are trademarks of The Apache Software Foundation.
All other marks mentioned may be trademarks or registered trademarks of their respective owners.</p>
</footer>
</div> <!-- /container -->
<!-- Javascript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="./../resources/js/bootstrap-dropdown.js"></script>
</body>
</html>