You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by bu...@apache.org on 2015/06/11 16:48:52 UTC

svn commit: r954502 - in /websites/staging/taverna/trunk: cgi-bin/ content/ content/community/releasing.html

Author: buildbot
Date: Thu Jun 11 14:48:51 2015
New Revision: 954502

Log:
Staging update by buildbot for taverna

Modified:
    websites/staging/taverna/trunk/cgi-bin/   (props changed)
    websites/staging/taverna/trunk/content/   (props changed)
    websites/staging/taverna/trunk/content/community/releasing.html

Propchange: websites/staging/taverna/trunk/cgi-bin/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Thu Jun 11 14:48:51 2015
@@ -1 +1 @@
-1684860
+1684907

Propchange: websites/staging/taverna/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Thu Jun 11 14:48:51 2015
@@ -1 +1 @@
-1684860
+1684907

Modified: websites/staging/taverna/trunk/content/community/releasing.html
==============================================================================
--- websites/staging/taverna/trunk/content/community/releasing.html (original)
+++ websites/staging/taverna/trunk/content/community/releasing.html Thu Jun 11 14:48:51 2015
@@ -217,9 +217,9 @@ as the working directory.</p>
 <h3 id="gpg-keys">GPG keys</h3>
 <p>You need to have <code>gpg</code> and preferably a <em>GPG Agent</em> installed on the machine
 you will build the release on. This needs to be configured with your
-GPG release key.</p>
-<p>Check that our
-<a href="https://dist.apache.org/repos/dist/release/incubator/taverna/KEYS">KEYS</a>
+<a href="https://www.apache.org/dev/release-signing.html">GPG release key</a>.</p>
+<p>Check that the Apache Taverna
+<a href="https://dist.apache.org/repos/dist/release/incubator/taverna/KEYS">KEYS</a> file
 contains your correct key and fingerprint. If not, then:</p>
 <p>Find your PGP fingerprint:</p>
 <div class="codehilite"><pre><span class="n">stain</span><span class="p">@</span><span class="n">biggie</span><span class="o">-</span><span class="n">utopic</span><span class="p">:</span><span class="o">~/</span><span class="n">src</span><span class="o">/</span><span class="n">rc1</span><span class="o">/</span><span class="n">dist</span>$ <span class="n">gpg</span> <span class="o">--</span><span class="n">fingerprint</span> <span class="n">stain</span><span class="p">@</span><span class="n">apache</span><span class="p">.</span><span class="n">org</span>
@@ -244,8 +244,9 @@ e.g.:</p>
 </pre></div>
 
 
-<p>Now verify that <a href="https://people.apache.org/keys/group/taverna.asc">taverna.asc</a>
-includes the correct key fingerprint, and update on dist:</p>
+<p>Now verify that the
+<a href="https://people.apache.org/keys/group/taverna.asc">people.apache.org taverna.asc</a>
+file now includes the correct key fingerprint, and update on dist:</p>
 <p>svn co https://dist.apache.org/repos/dist/release/incubator/taverna/
   cd taverna
   wget https://people.apache.org/keys/group/taverna.asc
@@ -264,7 +265,7 @@ Be sure to clone using the <em>Apache Co
 <p>Note that you do not need to clone the repositories which are already
 released and which don't form part of this release.</p>
 <h2 id="git-config">Git config</h2>
-<p><em>Important</em>: Make sure that each new checkout have the correct
+<p>Make sure that each new checkout have the correct
 user name information and your <code>@apache.org</code> email address:</p>
 <div class="codehilite"><pre><span class="n">cd</span> <span class="n">incubator</span><span class="o">-</span><span class="n">taverna</span><span class="o">-</span><span class="n">maven</span><span class="o">-</span><span class="n">parent</span>
 <span class="n">git</span> <span class="n">config</span> <span class="n">user</span><span class="p">.</span><span class="n">name</span> &quot;<span class="n">Your</span> <span class="n">Name</span>&quot;
@@ -328,34 +329,40 @@ will perform a build.</p>
 <p>Check the list of open
 <a href="https://repository.apache.org/#stagingRepositories">Staging Repositories</a>
 on the Nexus instance, and Close/Drop any old <code>orgapachetaverna-*</code> repositories.
-Do not touch the other repositories.</p>
+Do not touch the other repositories from other projects.</p>
 <h2 id="creating-release-candidate">Creating release candidate</h2>
 <h3 id="figure-out-release-order">Figure out release order</h3>
-<p>If more than one repository needs to be released, e.g. because the
-newer SNAPSHOT version is needed, then those repositories needs
-to be released in incrementing order. The dependency order is
-generally from top to bottom of the list in
-<a href="/download/code">code download page</a></p>
+<p>If more than one git repository needs to be released,
+e.g. because the newer SNAPSHOT version is needed, then those
+repositories needs to be released in incremental order. The
+dependency order is generally from top to bottom of the list on
+the <a href="/download/code">code download page</a>, e.g. <code>taverna-language</code>
+before <code>taverna-engine</code> before <code>taverna-workbench</code>.</p>
 <h3 id="fix-versions">Fix versions</h3>
-<p>Edit the top-level <code>pom.xml</code> of the repository to ensure there
+<p>Edit the top-level <code>pom.xml</code> of each project to release, ensuring there
 are no <code>-SNAPSHOT</code> dependencies in its <code>&lt;parent&gt;</code> and
 <code>&lt;properties&gt;</code>.</p>
 <p><strong>Do not fix</strong> the <code>&lt;version&gt;</code> of the Maven project itself or
-its submodules, as they must be on the form <code>-SNAPSHOT</code> in
+its submodules, as they must be on the form <code>*-SNAPSHOT</code> in
 order for the Maven Release Plugin to modify them.</p>
 <p>Check if a newer <code>taverna-maven-parent</code> or other <code>taverna.*.version</code>
-is needed. This is usually indicated by depending on an unreleased
-SNAPSHOT version.  Accordingly, after the release, do <em>not</em> update
-these versions to the bumped SNAPSHOT versions, as that would
+dependencies are needed. This is usually indicated by depending on an
+unreleased SNAPSHOT version.  Accordingly, after the release process,
+do <em>not</em> update <code>master</code> to use the bumped SNAPSHOT versions, as that would
 wrongly indicate that a newer dependency is needed.</p>
-<p>Update all <code>taverna.*.version</code> properties
-to the <em>latest released version</em>.
-(Exception to the rule - when OSGi backwards-compatibility is
-needed, e.g. a wsdl-activity that should work also with an older
-taverna-engine release).</p>
+<p>For compile/test purposes, update all <code>taverna.*.version</code> properties
+to the <em>latest released version</em>.</p>
+<p>Exception to the rule: - when OSGi backwards-compatibility is
+needed, e.g. an updated wsdl-activity that should work also with an
+older taverna-engine-api release.</p>
+<p>Remember that in OSGi, as long as we follow semantic
+versioning and don't break API compatibility, an upstream
+dependency can be updated without forcing an update release
+of its downstream users.</p>
 <p>If you are updating <code>taverna-maven-parent</code>, then try to
 update this to the latest
-<a href="http://central.maven.org/maven2/org/apache/apache/">Apache super-pom</a>.</p>
+<a href="http://central.maven.org/maven2/org/apache/apache/">Apache super-pom</a> - be aware
+that this could change Maven build settings.</p>
 <p>Commit your <code>pom.xml</code> changes (if any) and push.</p>
 <div class="codehilite"><pre><span class="n">git</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> &quot;<span class="n">Dependency</span> <span class="n">updates</span> <span class="k">for</span> <span class="n">release</span> 1<span class="p">.</span>2<span class="p">.</span>3&quot; <span class="n">pom</span><span class="p">.</span><span class="n">xml</span>
 <span class="n">git</span> <span class="n">push</span>
@@ -363,18 +370,19 @@ update this to the latest
 
 
 <h3 id="prepare-release-candidate">Prepare release candidate</h3>
-<p>Using the
+<p>We use the
 <a href="https://maven.apache.org/maven-release/maven-release-plugin/">Maven release plugin</a>
-is the recommended way to create
-release candidates as it ensures a consistent release process:</p>
+to release candidates as it ensures a consistent release process:</p>
 <div class="codehilite"><pre><span class="n">mvn</span> <span class="n">release</span><span class="p">:</span><span class="n">prepare</span>
 </pre></div>
 
 
-<p>(Note: The parameter <code>-Papache-release</code> is no longer needed, as it is activated by the
-<a href="https://github.com/apache/incubator-taverna-maven-parent/blob/master/pom.xml#L301">maven-release-plugin configuration</a>
-in taverna-maven-parent)</p>
-<p>The default for "What is the release version for" is usually good - but check the policy for version numbers below.</p>
+<p><strong>Note:</strong> Maven will use <code>gpg</code> to tag and sign the artifacts - so you might want to
+install and configure a <strong>GPG Agent</strong> to avoid repeatedly providing your
+GPG passphrase.</p>
+<p>The defaults for "What is the release version for" is usually good (assuming the SNAPSHOT version has been
+correctly bumped for any major/minor/patch changes to the code),
+but check the <a href="#Version_numbers">policy for version numbers below</a>.</p>
 <div class="codehilite"><pre><span class="p">[</span><span class="n">INFO</span><span class="p">]</span> <span class="n">Checking</span> <span class="n">dependencies</span> <span class="n">and</span> <span class="n">plugins</span> <span class="k">for</span> <span class="n">snapshots</span> <span class="p">...</span>
 <span class="n">What</span> <span class="n">is</span> <span class="n">the</span> <span class="n">release</span> <span class="n">version</span> <span class="k">for</span> &quot;<span class="n">Apache</span> <span class="n">Taverna</span> <span class="n">Language</span> <span class="n">APIs</span> <span class="p">(</span><span class="n">Scufl2</span><span class="p">,</span> <span class="n">Databundle</span><span class="p">)</span>&quot;? <span class="p">(</span><span class="n">org</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">taverna</span><span class="p">.</span><span class="n">language</span><span class="p">:</span><span class="n">taverna</span><span class="o">-</span><span class="n">language</span><span class="p">)</span> 0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span><span class="p">:</span> <span class="p">:</span>
 <span class="n">What</span> <span class="n">is</span> <span class="n">the</span> <span class="n">release</span> <span class="n">version</span> <span class="k">for</span> &quot;<span class="n">Apache</span> <span class="n">Taverna</span> <span class="n">Baclava</span> <span class="n">support</span>&quot;? <span class="p">(</span><span class="n">org</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">taverna</span><span class="p">.</span><span class="n">language</span><span class="p">:</span><span class="n">taverna</span><span class="o">-</span><span class="n">baclava</span><span class="o">-</span><span class="n">language</span><span class="p">)</span> 0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span><span class="p">:</span> <span class="p">:</span>
@@ -386,10 +394,10 @@ in taverna-maven-parent)</p>
 <p>You will be asked for each submodule what version they should have - generally
 their version should be the same as their parent (except to explicitly allow
 API backward compatibility)</p>
-<p><strong>Note</strong>: Take care to use the previous version number if preparing a
-second release candidate, as Maven would then suggest too high version
+<p><strong>Note</strong>: Take care to use the correct version number if preparing a
+second release candidate, as Maven could suggest a higher version
 number based on the bumped <code>-SNAPSHOT</code> version.  </p>
-<h4 id="apache-taverna-version-numbers">Apache Taverna version numbers</h4>
+<h4 id="version-numbers">Version numbers</h4>
 <ul>
 <li>Has to end in <code>-incubating</code> (while Apache Taverna is incubating)</li>
 <li>taverna-maven-parent is versioned with just major version, e.g. <code>4-incubating</code></li>
@@ -405,13 +413,33 @@ e.g. <code>2.13.1-incubating</code></li>
 <li>PATCH version when you make backwards-compatible bug fixes.</li>
 </ul>
 </blockquote>
+<p>Use <code>git diff</code> against the previous release tag for a rough check for changes.</p>
+<div class="codehilite"><pre><span class="n">git</span> <span class="n">diff</span> 0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">RC2</span>
+</pre></div>
+
+
+<p>Note that as we use of OSGi, the public Java API is usually just what is exposed
+by the <code>*-api</code> modules, meaning that implementatoin changes normally should
+just warrant a new patch version. We should also consider indirect APIs, such
+as an Activity's expected JSON configuration or
+the REST API of the Taverna Server.  </p>
+<p>Check with dev@taverna if you are not sure. Usually bumping minor
+(e.g. from <code>1.5.2</code> to <code>1.6.0</code>) is the right option, as we release all
+modules in the git repository.</p>
 <h4 id="tagging-and-next-snapshot-version">Tagging and next SNAPSHOT version</h4>
-<p>For the tag, use the proposed format, but modify <code>-RC1</code>
-for any subsequent release candidates.</p>
+<p>For the tag, use the proposed format (<code>0.15.0-incubating-RC1</code>), but
+modify <code>-RC1</code> for any subsequent release candidates.</p>
 <div class="codehilite"><pre><span class="n">What</span> <span class="n">is</span> <span class="n">SCM</span> <span class="n">release</span> <span class="n">tag</span> <span class="n">or</span> <span class="n">label</span> <span class="k">for</span> &quot;<span class="n">Apache</span> <span class="n">Taverna</span> <span class="n">Language</span> <span class="n">APIs</span> <span class="p">(</span><span class="n">Scufl2</span><span class="p">,</span> <span class="n">Databundle</span><span class="p">)</span>&quot;? <span class="p">(</span><span class="n">org</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">taverna</span><span class="p">.</span><span class="n">language</span><span class="p">:</span><span class="n">taverna</span><span class="o">-</span><span class="n">language</span><span class="p">)</span> 0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span><span class="o">-</spa
 n><span class="n">RC1</span><span class="p">:</span> <span class="p">:</span>
 </pre></div>
 
 
+<p><strong>Module-specific release</strong>: If a hot-patch update of a
+particular Maven module is being released from within its subfolder,
+then prefix the tag-name with the module name,
+e.g. <code>taverna-scufl2-t2flow-0.15.1-incubating-RC1</code>. Note that preparing a
+single module release requires careful consideration for
+setting the <code>&lt;parent&gt;</code> and <code>&lt;dependency&gt;</code> versions and
+should generally be avoided.</p>
 <p>The next development version should usually be one <em>patch version</em> higher,
 or for taverna-maven-parent simply the next number:</p>
 <div class="codehilite"><pre><span class="n">What</span> <span class="n">is</span> <span class="n">the</span> <span class="n">new</span> <span class="n">development</span> <span class="n">version</span> <span class="k">for</span> &quot;<span class="n">Apache</span> <span class="n">Taverna</span> <span class="n">Language</span> <span class="n">APIs</span> <span class="p">(</span><span class="n">Scufl2</span><span class="p">,</span> <span class="n">Databundle</span><span class="p">)</span>&quot;? <span class="p">(</span><span class="n">org</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">taverna</span><span class="p">.</span><span class="n">language</span><span class="p">:</span><span class="n">taverna</span><span class="o">-</span><span class="n">language</span><span class="p">)</span> 0<span class="p">.</span>15<span class="p">.</span>1<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">SN
 APSHOT</span><span class="p">:</span> <span class="p">:</span>
@@ -424,10 +452,7 @@ or for taverna-maven-parent simply the n
 <p>Maven will now transform your poms, create the tag, and push changes
 back to Apache's git repository.</p>
 <p>If you abort, you can start the process again using <code>mvn release:prepare</code>,
-which will pick up your answers so far from <code>release.profiles</code>.</p>
-<p>Note Maven will use <code>gpg</code> to tag and sign the artifacts - so you might want to
-install and configure a <strong>GPG Agent</strong> to avoid repeatedly providing your
-GPG passphrase.</p>
+which will pick up your answers so far from the file <code>release.profiles</code>.</p>
 <h4 id="rolling-back">Rolling back</h4>
 <p>If anything goes wrong at this stage, you will need to undo,
 edit and commit required changes, and start again:</p>
@@ -445,7 +470,8 @@ edit and commit required changes, and st
 
 
 <p>This will check out the tag, build it, then sign and
-deploy the packaged source code and compiled JARs.</p>
+deploy the packaged source code and compiled JARs
+to <code>repository.apache.org</code>.</p>
 <h3 id="locate-the-staging-repository">Locate the staging repository</h3>
 <p>On Apache's Nexus instance, locate the
 <a href="https://repository.apache.org/#stagingRepositories">Staging Repository</a>
@@ -459,24 +485,24 @@ projects that will form part of this <em
 next to it and click <em>Close</em>.</p>
 <p><strong>DO NOT CLICK RELEASE YET</strong> - the release candidate must pass <em>[VOTE]</em> emails
 on both dev@taverna and general@incubator before we release.</p>
-<p>Once closing has finished (check with <em>Refresh</em>, browse to the
+<p>Once closing has finished (check with <em>Refresh</em>), browse to the
 <em>URL</em>  of the
 <a href="https://repository.apache.org/content/repositories">staging repository</a>
 which should be something like
-https://repository.apache.org/content/repositories/orgapachetaverna-1001/</p>
+<code>https://repository.apache.org/content/repositories/orgapachetaverna-1003/</code></p>
 <h3 id="uploading-to-distapacheorg">Uploading to dist.apache.org</h3>
 <p>The release candidate source code, checksums and signatures
 should be uploaded to
 <a href="https://dist.apache.org/repos/dist/dev/incubator/taverna/">dist.apache.org</a>
-using <code>svn</code> - here we'll check out to a folder <code>~/src/rc1/dist</code>:</p>
+using <code>svn</code> - which we'll check out to a new folder <code>~/src/rc1/dist</code>:</p>
 <div class="codehilite"><pre><span class="n">svn</span> <span class="n">co</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">dist</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">org</span><span class="o">/</span><span class="n">repos</span><span class="o">/</span><span class="n">dist</span><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">incubator</span><span class="o">/</span><span class="n">taverna</span> <span class="n">dist</span>
 </pre></div>
 
 
-<p>The folder should normally be empty -- if
+<p>The <code>source</code> folder should normally be empty -- if
 you find remains of an earlier RC that is not
 still under <em>[VOTE]</em>, first remove them with <code>svn rm</code>:</p>
-<div class="codehilite"><pre><span class="n">cd</span> <span class="n">dist</span>
+<div class="codehilite"><pre><span class="n">cd</span> <span class="n">dist</span><span class="o">/</span><span class="n">source</span>
 <span class="n">svn</span> <span class="n">rm</span> <span class="o">*</span>
 </pre></div>
 
@@ -487,7 +513,10 @@ staging repository, located under the
 folder corresponding to the groupID and artifactId of the
 top-level project, e.g. <code>org/apache/taverna/language/0.15.0-incubating/</code>
 containing <code>taverna-language-0.15.0-incubating-source-release.zip</code></p>
-<p>Here's a convenient <code>wget</code> command to get all the release archives and
+<p>For consistency checking you also need to include the
+PGP signature <code>.asc</code> and the checksums
+<code>`.sha1</code> and <code>.md5</code></p>
+<p>Here's a convenient <code>wget</code> command to get all the release archives,
 their checksums and signatures:</p>
 <div class="codehilite"><pre><span class="n">wget</span> <span class="o">-</span><span class="n">e</span> <span class="n">robots</span><span class="p">=</span><span class="n">off</span> <span class="o">--</span><span class="n">recursive</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">parent</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">directories</span> <span class="o">-</span><span class="n">A</span> &quot;<span class="o">*-</span><span class="n">source</span><span class="o">-</span><span class="n">release</span><span class="o">*</span>&quot; <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">repository</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">org</span><span class="o">/</span><span class="n">content</span><span class="o">/</span><span class="n">repositories</span><span class="o">/</s
 pan><span class="n">orgapachetaverna</span><span class="o">-</span>1002<span class="o">/</span><span class="n">org</span><span class="o">/</span><span class="n">apache</span><span class="o">/</span><span class="n">taverna</span><span class="o">/</span>
 </pre></div>
@@ -496,36 +525,111 @@ their checksums and signatures:</p>
 <p>Make sure you have not got any extra files in your <code>dist/</code> folders, like
 <code>index.html</code> or duplicates like <code>*.zip.1</code></p>
 <div class="codehilite"><pre><span class="n">stain</span><span class="p">@</span><span class="n">biggie</span><span class="o">-</span><span class="n">utopic</span><span class="p">:</span><span class="o">~/</span><span class="n">src</span><span class="o">/</span><span class="n">rc1</span><span class="o">/</span><span class="n">dist</span>$  <span class="n">ls</span>
+<span class="n">binaries</span><span class="o">/</span> <span class="n">source</span><span class="o">/</span>
 <span class="n">taverna</span><span class="o">-</span><span class="n">language</span><span class="o">-</span>0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">source</span><span class="o">-</span><span class="n">release</span><span class="p">.</span><span class="n">zip</span>      <span class="n">taverna</span><span class="o">-</span><span class="n">language</span><span class="o">-</span>0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">source</span><span class="o">-</span><span class="n">release</span><span class="p">.</span><span class="n">zip</span><span class="p">.</span><span class="n">sha1</span>  <span class="n">taverna</span><span class="o">-</span><span class="n">parent</span><span class="o">-</span>1<span class="o">-</span><span class="n">incubating</span><span class="o">-</span
 ><span class="n">source</span><span class="o">-</span><span class="n">release</span><span class="p">.</span><span class="n">zip</span><span class="p">.</span><span class="n">md5</span>
 <span class="n">taverna</span><span class="o">-</span><span class="n">language</span><span class="o">-</span>0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">source</span><span class="o">-</span><span class="n">release</span><span class="p">.</span><span class="n">zip</span><span class="p">.</span><span class="n">asc</span>  <span class="n">taverna</span><span class="o">-</span><span class="n">parent</span><span class="o">-</span>1<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">source</span><span class="o">-</span><span class="n">release</span><span class="p">.</span><span class="n">zip</span>          <span class="n">taverna</span><span class="o">-</span><span class="n">parent</span><span class="o">-</span>1<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">source</span><span class="o">-</s
 pan><span class="n">release</span><span class="p">.</span><span class="n">zip</span><span class="p">.</span><span class="n">sha1</span>
 <span class="n">taverna</span><span class="o">-</span><span class="n">language</span><span class="o">-</span>0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">source</span><span class="o">-</span><span class="n">release</span><span class="p">.</span><span class="n">zip</span><span class="p">.</span><span class="n">md5</span>  <span class="n">taverna</span><span class="o">-</span><span class="n">parent</span><span class="o">-</span>1<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">source</span><span class="o">-</span><span class="n">release</span><span class="p">.</span><span class="n">zip</span><span class="p">.</span><span class="n">asc</span>
 </pre></div>
 
 
-<p>Now make a corresponding versioned folder for each product, and include the RC number:</p>
-<div class="codehilite"><pre><span class="n">mkdir</span> <span class="n">taverna</span><span class="o">-</span><span class="n">language</span><span class="o">-</span>0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">RC1</span>
-<span class="n">mkdir</span> <span class="n">taverna</span><span class="o">-</span><span class="n">parent</span><span class="o">-</span>1<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">RC1</span>
+<p>Under <code>source/</code>, make a corresponding versioned folder for each product,
+and <em>include the RC number</em>, avoiding confusion in case you need to
+make a second release candidate:</p>
+<div class="codehilite"><pre><span class="n">mkdir</span> <span class="n">source</span><span class="o">/</span><span class="n">averna</span><span class="o">-</span><span class="n">language</span><span class="o">-</span>0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">RC2</span>
+<span class="n">mkdir</span> <span class="n">source</span><span class="o">/</span><span class="n">taverna</span><span class="o">-</span><span class="n">parent</span><span class="o">-</span>1<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">RC2</span>
+<span class="n">mv</span> <span class="o">*</span><span class="n">language</span><span class="o">*</span><span class="n">release</span><span class="o">*</span> <span class="n">source</span><span class="o">/</span><span class="n">taverna</span><span class="o">-</span><span class="n">language</span><span class="o">-</span>0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">RC2</span>
+<span class="n">mv</span> <span class="o">*</span><span class="n">parent</span><span class="o">*</span><span class="n">release</span><span class="o">*</span> <span class="n">source</span><span class="o">/</span><span class="n">taverna</span><span class="o">-</span><span class="n">parent</span><span class="o">-</span>1<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">RC2</span>
 </pre></div>
 
 
-<p>Now add them to the <code>dist</code> folder with <code>svn add</code> and <code>svn commit</code></p>
-<div class="codehilite"><pre><span class="p">...</span> <span class="n">TODO</span>
+<p>Now add them to the <code>source</code> folder with <code>svn add</code> and <code>svn commit</code></p>
+<div class="codehilite"><pre><span class="n">svn</span> <span class="n">add</span> <span class="n">taverna</span><span class="o">-</span><span class="n">language</span><span class="o">-</span>0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">RC1</span> <span class="n">taverna</span><span class="o">-</span><span class="n">parent</span><span class="o">-</span>1<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">RC1</span>
+<span class="n">svn</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> &quot;<span class="n">taverna</span><span class="o">-</span><span class="n">language</span> 0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">RC1</span>&quot;
 </pre></div>
 
 
 <p>If any binary distributions are also be provided from the
 <a href="/download">Download page</a> (e.g. Taverna Workbench installers and
 Taverna Server <code>war</code>s), then download them as well <em>from the staging
-repository</em> and add them similarly with their corresponding
-<code>.asc</code>, <code>.md5</code> and <code>.sha1</code> files.</p>
+repository</em> and add them under equivalent versioned folders in <code>binaries/</code>,
+including their corresponding
+<code>.asc</code>, <code>.md5</code> and <code>.sha1</code> files,</p>
+<p>Versioned folders make it easier to tidy up after a dropped release
+candidate, and easier to promote the release.</p>
 <p>Now verify that the files are available on
 <a href="https://dist.apache.org/repos/dist/dev/incubator/taverna/">https://dist.apache.org/repos/dist/dev/incubator/taverna/</a> -
 you might need a <em>Refresh</em> in the browser.</p>
 <h2 id="voting">Voting</h2>
-<h3 id="vote">Vote</h3>
-<p><strong>TODO</strong></p>
+<p>Any Apache release must be approved through a
+<a href="http://www.apache.org/foundation/voting.html">vote</a>
+of the project's PMC. As Apache Taverna is an incubating project, a Taverna release must be
+approved by both the  <a href="/about">Apache Taverna PPMC</a> and the
+<a href="http://incubator.apache.org/guides/ppmc.html">Apache Incubator IPMC</a>.</p>
+<p>Before an Apache Taverna release can be distributed, it must thus pass two stages:</p>
+<ul>
+<li>[VOTE] on dev@taverna</li>
+<li>[VOTE] on general@incubator</li>
+</ul>
+<p>Each of the <em>[VOTE]</em> threads should be open for <strong>at least 72 hours</strong>, allowing time for
+sufficient <a href="#Reviewing">review</a>, and catering for differences in
+holidays and timezones.</p>
+<p>Including 24 hours grace period for the download mirrors,
+this means a release takes a minimum of a week before
+a release candidate might be published and released.</p>
+<p>Anyone in the <a href="/community">community</a> can participate in the
+review and vote, not just PMC members or committers. Only votes
+from IPMC members are <strong>binding</strong>.</p>
+<h3 id="vote-email-to-devtaverna">Vote email to dev@taverna</h3>
+<p>To start the release vote, modify the below example and send to dev@taverna.
+Remember <code>[VOTE]</code> in the subject line.</p>
+<p>Subject: [VOTE] Release Apache Taverna Language 0.15.0-incubating RC2</p>
+<p>I am pleased to be calling this vote for the source release of</p>
+<p>Apache Taverna Maven Parent 1-incubating
+  Apache Taverna Language 0.15.0-incubating</p>
+<p>Apache Taverna Language is a set of APIs for workflow definitions (SCUFL2)
+and workflow inputs/outputs/run (DataBundle), as consumed and produced by the
+Apache Taverna workflow system. The API includes support for working with
+Research Object Bundles, and loading/saving Taverna workflows in different
+formats.</p>
+<p>The release candidates to be voted over are available at:</p>
+<p>https://dist.apache.org/repos/dist/dev/incubator/taverna/source/taverna-parent-1-incubating-RC2/
+  https://dist.apache.org/repos/dist/dev/incubator/taverna/source/taverna-language-0.15.0-incubating-RC2/</p>
+<p>SHA-1 checksums:
+  8199880048a59cde622e0caa24c3bc3d83bc5d5a  taverna-parent-1-incubating-source-release.zip
+  7032e9d2be834f7c029aae562b62613481bf6939  taverna-language-0.15.0-incubating-source-release.zip</p>
+<p>MD5 checksums:
+  7f9b107b9f1dc0407783ac0ad484d6ea  taverna-parent-1-incubating-source-release.zip
+  35d3085b596b2dd4b30a0234259efade  taverna-language-0.15.0-incubating-source-release.zip</p>
+<p>Build the release candidate in the above order, using:</p>
+<div class="codehilite"><pre><span class="n">mvn</span> <span class="n">clean</span> <span class="n">install</span>
+</pre></div>
+
+
+<p>The release candidates correspond to the following git commits:</p>
+<p>https://git-wip-us.apache.org/repos/asf?p=incubator-taverna-maven-parent.git;a=commit;h=3ba669c78782d3fc3b548e2a512d201ee922b34a
+  https://git-wip-us.apache.org/repos/asf?p=incubator-taverna-language.git;a=commit;h=3340e2090e604b40ac0b88675f57c1d12032d060</p>
+<p>Release candidates are signed with a GPG key available at:</p>
+<p>https://dist.apache.org/repos/dist/release/incubator/taverna/KEYS</p>
+<p>A staged Maven repository is available for review at:</p>
+<p>https://repository.apache.org/content/repositories/orgapachetaverna-1003/</p>
+<p>The changelog for this release is available from JIRA:</p>
+<p>https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12318322&amp;version=12332247
+  https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12318322&amp;version=12332246</p>
+<p>Please vote on releasing these packages as:</p>
+<p>Apache Taverna Maven Parent 1-incubating
+  Apache Taverna Language 0.1.0-incubating</p>
+<p>The vote is open for at least 72 hours and passes if a
+majority of at least three +1 Apache Taverna PPMC votes are cast.</p>
+<p>[ ] +1 Release this package
+[ ]  0 I don't feel strongly about it, but don't object
+[ ] -1 Do not release this package because...</p>
+<p>Anyone can participate in testing and voting, not just
+committers, please feel free to try out the release candidate
+and provide your votes.</p>
+<h3 id="tallying-the-vote">Tallying the vote</h3>
+<h3 id="vote-email-to-generalincubator">Vote email to general@incubator</h3>
 <h2 id="dropping-a-release-candidate">Dropping a release candidate</h2>
-<p>If a release candidate is to be dropped, e.g. it fails the <em>[VOTE]</em>, then</p>
+<p>If a release candidate is to be dropped, e.g. it fails the <em>[VOTE]</em>, then:</p>
 <p>In Nexus, tick the <a href="https://repository.apache.org/#stagingRepositories">staging repository</a> and <em>Drop</em>.</p>
 <p>Delete the old tag:</p>
 <div class="codehilite"><pre><span class="n">git</span> <span class="n">push</span> <span class="n">origin</span> <span class="p">:</span>0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">RC1</span>
@@ -537,12 +641,37 @@ you might need a <em>Refresh</em> in the
 </pre></div>
 
 
-<p>In dist, svn rm all.</p>
-<div class="codehilite"><pre><span class="n">svn</span> <span class="n">rm</span> <span class="o">*/*</span>
+<p>In your <code>dist</code> checkout, <code>svn rm</code> the dropped RC folders:</p>
+<div class="codehilite"><pre><span class="n">svn</span> <span class="n">rm</span> <span class="o">*</span><span class="n">RC</span><span class="o">*</span>
+</pre></div>
+
+
+<h2 id="distributing">Distributing</h2>
+<p>Once a <em>[VOTE] [Results]</em> email has been agreed on general@incubator,
+then:</p>
+<ul>
+<li>Promiote the release candidate to a release</li>
+</ul>
+<h3 id="moving-to-release-area">Moving to release area</h3>
+<p>Use full URL <code>svn mv</code> to move the accepted release candidate
+to the <code>release</code> folder structure on dist.apache.org,
+e.g. at
+<a href="https://dist.apache.org/repos/dist/release/incubator/taverna/source/">https://dist.apache.org/repos/dist/release/incubator/taverna/source/</a>
+but remember to remove the <code>-RC1</code> from the folder name.</p>
+<div class="codehilite"><pre><span class="n">svn</span> <span class="n">mv</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">dist</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">org</span><span class="o">/</span><span class="n">repos</span><span class="o">/</span><span class="n">dist</span><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">incubator</span><span class="o">/</span><span class="n">taverna</span><span class="o">/</span><span class="n">source</span><span class="o">/</span><span class="n">taverna</span><span class="o">-</span><span class="n">language</span><span class="o">-</span>0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">RC2</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">dist</
 span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">org</span><span class="o">/</span><span class="n">repos</span><span class="o">/</span><span class="n">dist</span><span class="o">/</span><span class="n">release</span><span class="o">/</span><span class="n">incubator</span><span class="o">/</span><span class="n">taverna</span><span class="o">/</span><span class="n">source</span><span class="o">/</span><span class="n">taverna</span><span class="o">-</span><span class="n">language</span><span class="o">-</span>0<span class="p">.</span>15<span class="p">.</span>0<span class="o">-</span><span class="n">incubating</span>
+<span class="n">svn</span> <span class="n">mv</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">dist</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span><span class="n">org</span><span class="o">/</span><span class="n">repos</span><span class="o">/</span><span class="n">dist</span><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">incubator</span><span class="o">/</span><span class="n">taverna</span><span class="o">/</span><span class="n">source</span><span class="o">/</span><span class="n">taverna</span><span class="o">-</span><span class="n">parent</span><span class="o">-</span>1<span class="o">-</span><span class="n">incubating</span><span class="o">-</span><span class="n">RC2</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">dist</span><span class="p">.</span><span class="n">apache</span><span class="p">.</span>
 <span class="n">org</span><span class="o">/</span><span class="n">repos</span><span class="o">/</span><span class="n">dist</span><span class="o">/</span><span class="n">release</span><span class="o">/</span><span class="n">incubator</span><span class="o">/</span><span class="n">taverna</span><span class="o">/</span><span class="n">source</span><span class="o">/</span><span class="n">taverna</span><span class="o">-</span><span class="n">parent</span><span class="o">-</span>1<span class="o">-</span><span class="n">incubating</span>
 </pre></div>
 
 
-<h2 id="distributing">Distributing</h2></div>
+<h3 id="update-download-page">Update download page</h3>
+<p>Wait 24 hours for the download mirrors to pick up the new release from <code>dist.apache.org</code>.</p>
+<p>TODO.</p>
+<h3 id="removing-old-versions">Removing old versions</h3>
+<p>TODO</p>
+<h3 id="releasing-maven-repository">Releasing Maven repository</h3>
+<p>Tick the correct <a href="https://repository.apache.org/#stagingRepositories">staging repository</a> (perhaps do a quick check of an SHA1 sum against the vote email), then click <em>Release</em>.
+It should then propagate to <a href="https://repository.apache.org/content/repositories/releases/org/apache/taverna/">Apache's release Maven repository</a>
+and eventually mirrored to <a href="http://central.maven.org/maven2/org/apache/taverna/">Maven Central</a>.</p></div>
 
     </div>