 -----
 Release Guide
 -----
 -----
 -----

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

~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/doxia/references/apt-format.html

Release Guide

  * Prepare

  To prepare and perform a release, you must be at least a Apache Kalumet committer.

    ** each and every release must be [SIGNED|http://www.apache.org/dev/release-signing.html]

    ** your public key should also be cross-signed by other Apache committers (not required, but suggested)

    ** make sure you have all Apache servers defined in your [settings.xml|http://maven.apache.org/developers/committer-settings.html]

    ** use Maven 3.x

  Your settings.xml should look like:

+---
<settings>
  ...
  <profiles>
    <profile>
      <id>release</id>
       <properties>
         <gpg.passphrase> <!-- YOUR KEY PASSPHRASE --> </gpg.passphrase>
       </properties>
    </profile>
  </profiles>
  ...
  <servers>
    <!-- To publish a snapshot of some part of Maven -->
    <server>
      <id>apache.snapshots.https</id>
      <username> <!-- YOUR APACHE SVN USERNAME --> </username>
      <password> <!-- YOUR APACHE SVN PASSWORD --> </password>
    </server>
    <!-- To stage a release of some part of Maven -->
    <server>
      <id>apache.releases.https</id>
      <username> <!-- YOUR APACHE SVN USERNAME --> </username>
      <password> <!-- YOUR APACHE SVN PASSWORD --> </password>
    </server>
    ...
  </servers>
</settings>
+---

  * Staging the Release Candidate

    ** Grab the latest source

+---
 svn co https://svn.apache.org/repos/asf/incubator/kalumet/trunk
+---

    ** Prepare the POM for release:

      *** make sure there is not SNAPSHOTS in the dependencies or plugins definition

      *** make sure everything build fine

      *** validate that the release prepare works fine in dryRun: mvn release:prepare -DdryRun

      *** publish a SNAPSHOT before releasing: mvn deploy

    ** Prepare the release

+---
 mvn release:clean
 mvn release:prepare
+---

    ** Stage the release for vote

+---
 mvn release:perform
+---

    ** Close the staging repository. To do that, logon on [http://repository.apache.org|http://repository.apache.org],
    click "Stage Repositories" on the left menu. Select your stage repository and click on the "Close" button.

    ** Verify the staged artifacts.

      *** if you click on your repository, a tree view will appear below. You can browse the content to ensure that
      the artifacts are as you expect. Pay attention to the existence of signature files (*.asc). If you repository is
      not correct, you can drop it to create a new one after cancelling the release (see later).

      *** note the staging repository URL (you will need it for the vote e-mail)

  * Starting the vote

    Propose a vote on dev mailing list, for example:

+---
To: "Kalumet Developers List" <kalumet-dev@incubator.apache.org>
Subject: [VOTE] Release Apache Kalumet xx.yy

    Hi,

    We solved N issues in this release:
    http://issues.apache.org/jira/...

    There are still some outstanding issues:
    http://issues.apache.org/jira/...

    Staging repository:
    https://repository.apache.org/content/repositories/YOUR REPOSITORY ID/

    Please vote to approve this release:

    [ ] +1 Approve the release
    [ ] -1 Do not approve the release (please provide specific comments)

    This vote will be open for 72 hours.
+---

  * Wait for the result

    To be approved, a release requires at least 3 binding votes (a binding vote is a vote performed by a PMC/IPMC).

    At the end of the vote period, you can close the vote by sending a result e-mail:

+---
To: "Kalumet Developers List" <kalumet-dev@incubator.apache.org>
Subject: [RESULT][VOTE] Release Apache Kalumet xx.yy

    Hi,

    The vote has passed with the following result :

      +1 (binding): <<list of names>>
      +1 (non binding): <<list of names>>

    I will promote the artifacts on Central and update Jira versions.
+---

    If the vote is unsuccessful, you have to fix the identified issues and restart the release process (see "Cancelling the release" section).
    If the vote is successful, you can promote the staging repository and update the Jira (see "Promoting the release" section).

  * Cancelling the release

    If the vote fails, or you decided to redo the release:

    ** remove the release tag from Subversion (svn del ...)

    ** logon http://repository.apache.org and drop the staged repository.

    ** rollback the version in pom.xml and commit any fixes.

  * Promoting the release

    If the vote passes:

    ** logon http://repository.apache.org, click on "Staged Repository" on the left menu. Select your staged repository
    and click on "Release" button.

    ** update the versions in Jira by setting the release date

    ** update the download section of the website

    ** announce the release (on the website and on the mailing lists):

+---
To: "Kalumet Developers List" <kalumet-dev@incubator.apache.org>
Subject: [ANN] Apache Kalumet xx.yy released

    The Kalumet team is pleased to announce the release of Kalumet xx.yy

    <<insert short description of the release>>

    This release is available from http://incubator.apache.org/kalumet/downloads and Maven:

      <dependency>
        <groupId>org.apache.kalumet</groupId>
        <artifactId>org.apache.kalumet.XXX</artifactId>
        <version>Y.Z</version>
      </dependency>

    Release Notes:

    <<insert release notes in text format from JIRA>>

    Enjoy!

    -The Kalumet team
+---