~~ $Id$
~~
~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements.  See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership.  The ASF licenses this file
~~ to you under the Apache License, Version 2.0 (the
~~ "License"); you may not use this file except in compliance
~~ with the License.  You may obtain a copy of the License at
~~
~~ http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing,
~~ software distributed under the License is distributed on an
~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~~ KIND, either express or implied.  See the License for the
~~ specific language governing permissions and limitations
~~ under the License.
~~
         -----------
         Release Process
         -----------

Tiles Release Process

  Here you will find the steps to create releases for Tiles.

Prerequisites

  To create a release you have to install:

  * {{{http://www.oracle.com/technetwork/java/javase/overview/index.html}Java 9}}. If you are using a newer
  version of Java <<change JAVA_HOME environment variable>>
  when calling Maven, so it points to an instance of Java 9;

  * {{{http://maven.apache.org/}Maven 3.2.2+}};

  * {{{http://www.gnupg.org/}GnuPG}};

  * {{{http://www.openssh.com/}OpenSSH}};

  * {{{http://www.graphviz.org/}GraphViz}};

One-time operations

  These operations need to be performed only one time.

* Create and publish your GPG key

  To create a GPG key, follow the
  {{{http://www.apache.org/dev/openpgp.html}guidelines}}.
  Include it in:

-------------------------------------
https://svn.apache.org/repos/asf/tiles/site/KEYS
-------------------------------------

  Publish your GPG key in a PGP key server, such as
  {{{http://pgp.mit.edu/} MIT Keyserver}}.

* Modify <<<settings.xml>>>

  Your <<<settings.xml>>> must be modified to allow deployment.

  This is the minimal configuration, obviously if you already have a <<<settings.xml>>> file,
  you must edit it:

---------------------------
<settings xmlns="http://maven.apache.org/POM/4.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <servers>
        <server>
            <id>apache-site</id>
            <username>YOUR_APACHE_USERNAME</username>
            <filePermissions>664</filePermissions>
            <directoryPermissions>775</directoryPermissions>
        </server>
        <server>
            <id>apache.snapshots.https</id>
            <username>YOUR_APACHE_USERNAME</username>
            <password>YOUR_APACHE_PASSWORD</password>
        </server>
        <server>
            <id>apache.releases.https</id>
            <username>YOUR_APACHE_USERNAME</username>
            <password>YOUR_APACHE_PASSWORD</password>
        </server>
    </servers>
    <profiles>
        <profile>
            <id>release</id>
            <properties>
                <gpg.passphrase>YOUR_SECRET_PHRASE</gpg.passphrase>
            </properties>
            </profile>
        </profile>
    </profiles>
</settings>
---------------------------

Repeatable operations

  These steps must be performed <<for each>> release.

* Prepare the release tag

  To prepare the release Subversion tag, check out the branch/trunk from where
  you are preparing the release and type:

-----------------------------------
mvn release:prepare -Dusername=YOUR_SVN_USER -Dpassword=YOUR_SVN_PASSWORD
-----------------------------------

  The plugin interactively will ask you the version to release, the Subversion
  tag to use and the next snapshot version. It is recommended to use the tag:
  <<tiles-X.X.X>>.

  See also {{{http://www.apache.org/dev/publishing-maven-artifacts.html}the recommendations of the ASF}}.

* Perform the Release

  To perform the release, i.e. creating and deploying Maven artifacts, use:

-----------------------------------
mvn release:perform -Duser.name=YOUR_PEOPLE_APACHE_SSH_USER -Darguments="-Duser.name=YOUR_PEOPLE_APACHE_SSH_USER"
-----------------------------------

  It should compile and test everything, build and upload the artifacts and the website for the project.

  Upload the assemblies manually with

-----------------------------------
cd target/
svn co https://dist.apache.org/repos/dist/dev/tiles tiles-dist-dev
mkdir tiles-dist-dev/request/${version}
cp checkout/assembly/target/assembly/* tiles-dist-dev/${version}/
svn add tiles-dist-dev/${version}
svn ci tiles-dist-dev/${version}
-----------------------------------

* Close the staging repository

  Login to {{{https://repository.apache.org} Nexus repository}} using your Apache LDAP credentials.
  Click on "Staging". Then click on "tiles" in the list of repositories.
  In the panel below you should see an open repository that is linked to your username and ip.
  Right click on this repository and select "Close".
  This will close the repository from future deployments and make it available for others to view.
  If you are staging multiple releases together, skip this step until you have staged everything.
  Enter the name and version of the artifact being released in the "Description" field and then click "Close".
  This will make it easier to identify it later.

* Verify the staged artifacts

  If you click on your repository, a tree view will appear below.
  You can then browse the contents to ensure the artifacts are as you expect them.
  Pay particular attention to the existence of *.asc (signature) files.
  If the you don't like the content of the repository, right click your repository and choose "Drop".
  You can then rollback your release and repeat the process.

  Note the repository URL, you will need this in your vote email.

* Verify the uploaded assemblies

  * go to the destination directory on people.apache.org (cd /www/people.apache.org/builds/tiles/${version}).

  * check the presence of the 3 distributions (bin, doc and src), and their signature files (*.asc, *.md5, *sha1).

* Release the JIRA version

  * In JIRA go to the version that you want to release and release it.

  * Create a new version, if it has not been done before.

  * Create the release notes and <<write down the link>> that it uses.

* Send announcement for the test build

  In <<developers mailing list>> send an announcement for the test build:

-----------------------------------
Subject: [ANNOUNCE] Tiles ${version} test build available

The test build of Tiles ${version} is available.


No determination as to the quality ('alpha,' 'beta,' or 'GA') of Tiles
${version} has been made, and at this time it is simply a "test build". We
welcome any comments you may have, and will take all feedback into
account if a quality vote is called for this build.

Release notes:

* ${jira.release.notes}

Distribution:

 * https://dist.apache.org/repos/dist/dev/tiles/${version}/

Maven 2 staging repository:

 * https://repository.apache.org/content/repositories/tiles-[YOUR REPOSITORY ID]/

A vote regarding the quality of this test build will be initiated
within the next couple of days.
-----------------------------------

* Call for a vote

  A few days after the test build announcement, call for a vote in
  <<developers mailing list>>.

-----------------------------------
Subject: [VOTE] ${version} Release Quality

The Tiles ${version} test build has been available since ${testBuildDate}.

Release notes:

* ${jira.release.notes}

Distribution:

 * https://dist.apache.org/repos/dist/dev/tiles/${version}/

Maven 2 staging repository:

 * https://repository.apache.org/content/repositories/tiles-[YOUR REPOSITORY ID]/

If you have had a chance to review the test build, please respond with
a vote on its quality:

 [ ] Leave at test build
 [ ] Alpha
 [ ] Beta
 [ ] General Availability (GA)


Everyone who has tested the build is invited to vote. Votes by PMC
members are considered binding. A vote passes if there are at least
three binding +1s and more +1s than -1s.
-----------------------------------

* Post-vote operations

  After a vote is finished, and it has been decided that is
  <<at least of alpha quality>>, there is the need of a post-vote process.

** Promote staged artifacts

  Once the release is deemed fit for public consumption it can be transfered to a production repository where it will be available to all users.

  Login to {{{https://repository.apache.org}Nexus repository}} again.
  Click on "Staging" and then on the repository with id "tiles-staging".
  Find your closed staging repository, right click on it and choose "Promote".
  Select the "Releases" repository and click "Promote".

  Next click on "Repositories", select the "Releases" repository
  and validate that your artifacts exist as you expect them.

** Move assemblies

  * Move assemblies to the Apache distribution mirrors:

-------------------------------------------

svn mv https://dist.apache.org/repos/dist/dev/tiles/${version} https://dist.apache.org/repos/dist/release/tiles/

-------------------------------------------

** Update the site

  * Wait 24 hours to let the mirror sync to the release and then update the
  site. In particular you have to update the index and the download pages:

------------------------------------------------
https://svn.apache.org/repos/asf/tiles/site/src/site/xdoc/index.xml
https://svn.apache.org/repos/asf/tiles/site/src/site/apt/download.apt
------------------------------------------------

  Build and publish the site:

--------------------------------------
mvn site
mvn site:deploy
--------------------------------------

** Send announcement

  Finally, send an an announcement to the <<users>> and <<developers mailing
  list>>:

--------------------------------------
Subject: [ANNOUNCE] Tiles ${version} ${quality} released

The Apache Tiles team is pleased to announce the release of Tiles ${version}
${quality}.

Tiles ${version} is available in a binary and a source distribution.

http://tiles.apache.org/download.html

It is also available in the central Maven repository under Group ID
"org.apache.tiles".

The 3.0.x series of the Apache Tiles framework has a minimum
requirement of the following specification versions:

* Java Servlet 2.5 and JavaServer Pages (JSP) 2.1
* Java Standard Edition (Java SE) 1.8

The release notes are available online at:

* ${jira.release.notes}

Please feel free to test the distribution and post your comments to
the user list, or, if appropriate, file a ticket with JIRA.
--------------------------------------

** Delete old releases

  As described in http://www.apache.org/dev/release.html#when-to-archive



  <<You have finished!>>
