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

| 
|



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 member 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>`_.
The key must be 4096 bit RSA.
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/>`_.

Artifactory account with access to Apache organisation
------------------------------------------------------

Publishing a successfully voted upon release requires Artifactory access using your Apache LDAP credentials. Please verify that you have logged into Artifactory `here <https://apache.jfrog.io/>`_.


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 the 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 the ASF nexus staging repository and dev distribution location::


    cd ~/git
    git clone https://github.com/apache/cassandra-builds.git
    git clone https://github.com/apache/cassandra.git

    # Edit the variables at the top of the `prepare_release.sh` file
    edit cassandra-builds/cassandra-release/prepare_release.sh

    # Ensure your 4096 RSA key is the default secret key
    edit ~/.gnupg/gpg.conf # update the `default-key` line
    edit ~/.rpmmacros # update the `%gpg_name <key_id>` line

    # Ensure DEBFULLNAME and DEBEMAIL is defined and exported, in the debian scripts configuration
    edit ~/.devscripts

    # 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.
    cd cassandra
    git switch cassandra-<version-branch>

    # The following cuts the release artifacts (including deb and rpm packages) and deploy to staging environments
    ../cassandra-builds/cassandra-release/prepare_release.sh -v <version>

Follow the prompts.

If building the deb or rpm packages fail, those steps can be repeated individually using the `-d` and `-r` flags, respectively.

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 member 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
    # edit the variables at the top of the `finish_release.sh` file
    edit cassandra-builds/cassandra-release/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>

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.


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.


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

Update the codebase to point to the next development version::

    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, move up any entries that were added after the release was cut and staged
    git commit -m "Increment version to <next-version>" build.xml debian/changelog CHANGES.txt

    # …and forward merge and push per normal procedure


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

Wait for the artifacts to sync at https://downloads.apache.org/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>`_.

An example of removing old releases::

    svn rm https://dist.apache.org/repos/dist/release/cassandra/<previous_version>