.. 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.

.. include:: ../../common.defs

.. _developer-release-process:

Release Process
***************

Managing a release is easiest in an environment that is as clean as possible.
For this reason, cloning the code base in to a new directory for the release
process is recommended.

Requirements
============

* A system for git and building.

* A cryptographic key that has been signed by at least two other PMC members.
  This should be preferentially associated with your ``apache.org`` email
  address but that is not required.

.. _release-management-release-candidate:

Release Candidate
=================

The first step in a release is making a release candidate. This is distributed
to the community for validation before the actual release.

Document
========

Gather up information about the changes for the release. The ``CHANGES`` file
is a good starting point. You may also want to check the commits since the last
release. The primary purpose of this is to generate a list of the important
changes since the last release.

Create or update a page on the Wiki for the release. If it is a major or minor
release it should have its own page. Use the previous release page as a
template. Point releases should get a section at the end of the corresponding
release page.

Write an announcement for the release. This will contain much of the same
information that is on the Wiki page but more concisely. Check the
`mailing list archives <http://mail-archives.apache.org/mod_mbox/trafficserver-dev/>`_
for examples to use as a base.

Build
=====

#. Go to the top level source directory.

#. Check the version in ``configure.ac``. There are two values near the top that
   need to be set, ``TS_VERSION_S`` and ``TS_VERSION_N``. These are the release
   version number in different encodings.

#. Check the variable ``RC`` in the top level ``Makefile.am``. This should be
   the point release value. This needs to be changed for every release
   candidate. The first release candidate is ``0`` (zero).

#. Execute the following commands to make the distribution files. ::

      autoreconf -i
      ./configure
      make rel-candidate

These steps will create the distribution files and sign them using your key.
Expect to be prompted twice for your passphrase unless you use an ssh key agent.
If you have multiple keys you will need to set the default appropriately
beforehand, as no option will be provided to select the signing key. The files
should have names that start with ``trafficserver-X.Y.Z-rcA.tar.bz2`` where
``X.Y.Z`` is the version and ``A`` is the release candidate counter. There
should be four such files, one with no extension and three others with the
extensions ``asc``, ``md5``, and ``sha1``. This will also create a signed git
tag of the form ``X.Y.Z-rcA``.

Distribute
==========

The release candidate files should be uploaded to some public storage. Your
personal storage on *people.apache.org* is a reasonable location to use.

Send the release candidate announcement to the *users* and *dev* mailing
lists, noting that it is a release *candidate* and providing a link to the
distribution files you uploaded. This announcement should also call for a vote
on the candidate, generally with a 72 hours time limit.

If the voting was successful (at least three "+1" votes and no "-1" votes),
proceed to :ref:`release-management-official-release`. Otherwise, repeat the
:ref:`release-management-release-candidate` process.

.. _release-management-official-release:

Official Release
================

Build the distribution files with the command ::

   make release

Be sure to not have changed anything since the release candidate was built so
the checksums are identical. This will create a signed git tag of the form
``X.Y.Z`` and produce the distribution files. Push the tag to the ASF repository
with the command ::

   git push origin X.Y.Z

This presumes ``origin`` is the name for the ASF remote repository which is
correct if you originally clone from the ASF repository.

The distribution files must be added to an SVN repository. This can be accessed
with the command::

   svn co https://dist.apache.org/repos/dist/release/trafficserver <local-directory>

All four of the distribution files go here. If you are making a point release
then you should also remove the distribution files for the previous release.
Allow 24 hours for the files to be distributed through the ASF infrastructure.

The Traffic Server website must be updated. This is an SVN repository which you
can access with ::

   svn co https://svn.apache.org/repos/asf/trafficserver/site/trunk <local-directory>

The files of interest are in the ``content`` directory.

``index.html``
   This is the front page. The places to edit here are any security
   announcements at the top and the "News" section.

``downloads.en.mdtext``
   Update the downloads page to point to the new download objects.

After making changes, commit them and then run ::

   publish.pl trafficserver <apache-id>

On the ``people.apache.org`` host.

If needed, update the Wiki page for the release to point at the release
distribution files.

Update the announcement, if needed, to refer to the release distribution files
and remove the comments concerning the release candidate. This announcement
should be sent to the *users* and *dev* mailing lists. It should also be sent
to the ASF announcement list, which must be done using an ``apache.org`` email
address.

Finally, update various files after the release:

* The ``STATUS`` file for master and for the release branch to include this version.

* The ``CHANGES`` file to have a header for the next version.

* ``configure.ac`` to be set to the next version.

* In the top level ``Makefile.am`` change ``RC`` to have the value ``0``.

