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

.. highlight:: none
..  release_process:

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

.. contents:: :depth: 3

| 
|

.. attention::

    WORK IN PROGRESS
     * A number of these steps still have been finalised/tested.
     * The use of people.apache.org needs to be replaced with svnpubsub and dist.apache.org


The steps for Release Managers to create, vote and publish releases for Apache Cassandra.

While a committer can perform the initial steps of creating and calling a vote on a proposed release, only a PMC can complete the process of publishing and announcing the release.


Prerequisites
=============

Background docs
 * `ASF Release Policy <http://www.apache.org/legal/release-policy.html>`_
 * `ASF Release Distribution Policy <http://www.apache.org/dev/release-distribution>`_
 * `ASF Release Best Practices <http://www.eu.apache.org/dev/release-publishing.html>`_


A debian based linux OS is required to run the release steps from. Debian-based distros provide the required RPM, dpkg and repository management tools.


Create and publish your GPG key
-------------------------------

To create a GPG key, follow the `guidelines <http://www.apache.org/dev/openpgp.html>`_.
Include your public key in::

  https://dist.apache.org/repos/dist/release/cassandra/KEYS


Publish your GPG key in a PGP key server, such as `MIT Keyserver <http://pgp.mit.edu/>`_.


Create Release Artifacts
========================

Any committer can perform the following steps to create and call a vote on a proposed release.

Check that there are no open urgent jira tickets currently being worked on. Also check with a PMC that there's security vulnerabilities currently being worked on in private.'
Current project habit is to check the timing for a new release on the dev mailing lists.

Perform the Release
-------------------

Run the following commands to generate and upload release artifacts, to a nexus staging repository and distribution location::


    cd ~/git
    git clone https://github.com/apache/cassandra-builds.git
    # Edit the variables at the top of `cassandra-builds/cassandra-release/prepare_release.sh`

    # After cloning cassandra-builds repo, the prepare_release.sh is run from the actual cassandra git checkout, 
    # on the branch/commit that we wish to tag for the tentative release along with version number to tag.
    # For example here <version-branch> might be `3.11` and <version> `3.11.3`
    cd ~/git/cassandra/
    git checkout cassandra-<version-branch>
    ../cassandra-builds/cassandra-release/prepare_release.sh -v <version>

If successful, take note of the email text output which can be used in the next section "Call for a Vote".

After validating the uploaded artifacts in staging, increment the version number in Cassandra on the `cassandra-<version-branch>`

    cd ~/git/cassandra/
    git checkout cassandra-<version-branch>
    edit build.xml          # update `<property name="base.version" value="…"/> `
    edit debian/changelog   # add entry for new version
    edit CHANGES.txt        # add entry for new version
    git commit -m "Update version to <next-version>" build.xml debian/changelog CHANGES.txt
    git push

Call for a Vote
===============

Fill out the following email template and send to the dev mailing list::

    I propose the following artifacts for release as <version>.

    sha1: <git-sha>

    Git: https://gitbox.apache.org/repos/asf?p=cassandra.git;a=shortlog;h=refs/tags/<version>-tentative

    Artifacts: https://repository.apache.org/content/repositories/orgapachecassandra-<nexus-id>/org/apache/cassandra/apache-cassandra/<version>/

    Staging repository: https://repository.apache.org/content/repositories/orgapachecassandra-<nexus-id>/

    The distribution packages are available here: https://dist.apache.org/repos/dist/dev/cassandra/${version}/

    The vote will be open for 72 hours (longer if needed).

    [1]: (CHANGES.txt) https://git1-us-west.apache.org/repos/asf?p=cassandra.git;a=blob_plain;f=CHANGES.txt;hb=<version>-tentative
    [2]: (NEWS.txt) https://git1-us-west.apache.org/repos/asf?p=cassandra.git;a=blob_plain;f=NEWS.txt;hb=<version>-tentative



Post-vote operations
====================

Any PMC can perform the following steps to formalize and publish a successfully voted release.

Publish Artifacts
-----------------

Run the following commands to publish the voted release artifacts::

    cd ~/git
    git clone https://github.com/apache/cassandra-builds.git
    # edit the variables at the top of `finish_release.sh`

    # After cloning cassandra-builds repo, `finish_release.sh` is run from the actual cassandra git checkout,
    # on the tentative release tag that we wish to tag for the final release version number tag.
    cd ~/git/cassandra/
    git checkout <version>-tentative
    ../cassandra-builds/cassandra-release/finish_release.sh -v <version> <staging_number>

If successful, take note of the email text output which can be used in the next section "Send Release Announcement".
The output will also list the next steps that are required. The first of these is to commit changes made to your https://dist.apache.org/repos/dist/release/cassandra/ checkout.


Promote Nexus Repository
------------------------

 * Login to `Nexus repository <https://repository.apache.org>`_ again.
 * Click on "Staging" and then on the repository with id "cassandra-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.

Sign and Upload Distribution Packages to Bintray
---------------------------------------

Run the following command::

    cd ~/git
    # FIXME the next command is wrong while people.apache.org is used instead of svnpubsub and dist.apache.org
    svn mv https://dist.apache.org/repos/dist/dev/cassandra/<version> https://dist.apache.org/repos/dist/release/cassandra/

    # Create the yum metadata, sign the metadata, and sign some files within the signed repo metadata that the ASF sig tool errors out on
    svn co https://dist.apache.org/repos/dist/release/cassandra/redhat/ cassandra-dist-redhat
    cd cassandra-dist-redhat/<abbreviated-version>x/
    createrepo .
    gpg --detach-sign --armor repodata/repomd.xml
    for f in `find repodata/ -name *.bz2`; do
      gpg --detach-sign --armor $f;
    done

    svn co https://dist.apache.org/repos/dist/release/cassandra/<version> cassandra-dist-<version>
    cd cassandra-dist-<version>
    cassandra-build/cassandra-release/upload_bintray.sh cassandra-dist-<version>


Update and Publish Website
--------------------------

See `docs https://svn.apache.org/repos/asf/cassandra/site/src/README`_ for building and publishing the website.
Also update the CQL doc if appropriate.

Release version in JIRA
-----------------------

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.

Update to Next Development Version
----------------------------------

Edit and commit ``build.xml`` so the base.version property points to the next version.

Wait for Artifacts to Sync
--------------------------

Wait for the artifacts to sync at http://www.apache.org/dist/cassandra/

Send Release Announcement
-------------------------

Fill out the following email template and send to both user and dev mailing lists::

    The Cassandra team is pleased to announce the release of Apache Cassandra version <version>.

    Apache Cassandra is a fully distributed database. It is the right choice
    when you need scalability and high availability without compromising
    performance.

     http://cassandra.apache.org/

    Downloads of source and binary distributions are listed in our download
    section:

     http://cassandra.apache.org/download/

    This version is <the first|a bug fix> release[1] on the <version-base> series. As always,
    please pay attention to the release notes[2] and let us know[3] if you
    were to encounter any problem.

    Enjoy!

    [1]: (CHANGES.txt) https://git1-us-west.apache.org/repos/asf?p=cassandra.git;a=blob_plain;f=CHANGES.txt;hb=<version>
    [2]: (NEWS.txt) https://git1-us-west.apache.org/repos/asf?p=cassandra.git;a=blob_plain;f=NEWS.txt;hb=<version>
    [3]: https://issues.apache.org/jira/browse/CASSANDRA

Update Slack Cassandra topic
---------------------------

Update topic in ``cassandra`` :ref:`Slack room <slack>`
    /topic cassandra.apache.org | Latest releases: 3.11.4, 3.0.18, 2.2.14, 2.1.21 | ask, don't ask to ask

Tweet from @Cassandra
---------------------

Tweet the new release, from the @Cassandra account

Delete Old Releases
-------------------

As described in `When to Archive <http://www.apache.org/dev/release.html#when-to-archive>`_.
Also check people.apache.org as previous release scripts used it.
