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

This document describes the steps required to release a version of TinkerPop.  The release is handled by a "release
manager" (a committer fulfills this role), who ensures that the steps in this document are executed. The process is
multi-phased and can therefore take several weeks to complete given the time needed for Apache voting and community
feedback.  Once a release point has been identified, the following phases represent the flow of "release":

* Pre-flight check.
* Optionally, produce a release candidate for community feedback.
* Submit the official release for PMC vote.
* Submit the official release for Incubator vote.
* Release and promote.

Pre-flight Check
----------------

The "pre-flight check" is a list of things performed by the release manager during the weeks leading up to a scheduled
day to release.  These checks will help to ensure that that release day goes smoothly by identifying problems up early
and communicating with other members of the community.

. Fourteen days before release, issue an email to the dev mailing list to remind the community of the pending release.
.. Note any important issues open in JIRA in that post.
.. Request review and update of the "upgrade documentation" and CHANGELOG.
. Seven days before release, announce the code freeze on the dev mailing list to remind the community that the branch
under release is protected. Tweaks to documentation and other odds and ends related to release are still allowed
during this period.
. At some point during the week:
.. Run the full integration test suite: `mvn clean install -DskipIntegrationTests=false -DincludeNeo4j`
.. Deploy a final SNAPSHOT to the snapshot repository.
.. Review LICENSE and NOTICE files to make sure that no <<dependencies,changes are needed>>.
.. Review javadoc filters on the "Core API" docs to be sure nothing needs to change.
. When all documentation changes are in place, use `bin/publish-docs.sh` to deploy a final `SNAPSHOT` representation
of the docs and thus validate that there are no issues with the documentation generation process. Request review
of the published documentation on the dev mailing list.

Release Candidate
-----------------

A release candidate is an unofficial release that is represented by a tagged version in the Git repository.  It is
offered in cases where there is significant change in a particular version and the potential for upgrades and problems
might be high.

. `mvn clean install -DincludeNeo4j`
.. `mvn verify -DskipIntegrationTests=false -DincludeNeo4j`
.. `mvn verify -DskipPerformanceTests=false`
. `bin/publish-docs.sh <username>` - note that under a release candidate the documentation is published as SNAPSHOT
. `mvn versions:set -DnewVersion=x.y.z -DgenerateBackupPoms=false` to update the project files to reference a non-SNAPSHOT version
. `git diff` and review the updated files (expect all `pom.xml` files and this README)
. `git commit -a -m "TinkerPop x.y.z release"` and `git push`
. `git tag -a -m "TinkerPop x.y.z release" x.y.z` and `git push --tags`
. `mvn clean install -Dmaven.test.skip=true`
. `mvn versions:set -DnewVersion=x.y.z-SNAPSHOT -DgenerateBackupPoms=false` to go back to SNAPSHOT
. `git commit -a -m "Returned to x.y.z-SNAPSHOT"` and `git push`
. Announce the release candidate to `dev` mailing list and await feedback
. Repeat as required or proceed to the next phase

PMC Vote
--------

A positive vote for a particular release from the TinkerPop PMC is required to move to the following phase.

. `mvn clean install`
.. `mvn verify -DskipIntegrationTests=false -DincludeNeo4j`
.. `mvn verify -DskipPerformanceTests=false`
. Perform manual tests:
.. Execute `:remote connect conf/remote.yaml` and send some requests to a running Gremlin Server instance.
.. Execute `:?` to display the help in the Console.
. Update `CHANGELOG.asciidoc`:
.. Update the release date
.. Generate the JIRA release notes report for the current version and append them to the `CHANGELOG.asciidoc`
.. Organize "breaking" changes to be clearly marked (use JIRA and the "breaking" label to identify those)
. Update "upgrade documentation":
.. Update the release date.
.. Update the link to CHANGELOG.asciidoc
. `mvn versions:set -DnewVersion=x.y.z -DgenerateBackupPoms=false` to update project files to reference the non-SNAPSHOT version
. `git diff` and review the updated files (expect all `pom.xml` files and this README)
. `git commit -a -m "TinkerPop x.y.z release"` and `git push`
. `git tag -a -m "TinkerPop x.y.z release" x.y.z` and `git push --tags`
. `mvn clean install -Dmaven.test.skip=true` - need to build first so that the right version of the console is used with `bin/publish-docs.sh`
. `bin/publish-docs.sh <username>`
. `mvn install -Papache-release -Djavadoc -DcreateChecksum=true -Dmaven.test.skip=true`
. `mvn deploy -Papache-release -DcreateChecksum=true -Dmaven.test.skip=true`- deploy signed artifacts with checksums to link:https://repository.apache.org/[Apache Nexus]. Review (artifacts versions, file sizes, anything that might be out of place - request another committer to review as well) but do NOT close/release the staging repository at this time.
. Review generated artifacts to be sure they have both javadocs and asciidocs present
. Upload artifacts to `https://dist.apache.org/repos/dist/dev/incubator/tinkerpop` for `[VOTE]` review.
.. `svn co --depth empty https://dist.apache.org/repos/dist/dev/incubator/tinkerpop/ dev` and `mkdir dev/x.y.z`
.. `cp ~/.m2/repository/org/apache/tinkerpop/gremlin-console/x.y.z/gremlin-console-x.y.z-distribution.zip* dev/x.y.z`
.. `cp ~/.m2/repository/org/apache/tinkerpop/gremlin-server/x.y.z/gremlin-server-x.y.z-distribution.zip* dev/x.y.z`
.. `cp ~/.m2/repository/org/apache/tinkerpop/tinkerpop/x.y.z/tinkerpop-x.y.z-source-release.zip* dev/x.y.z`
.. `cd dev/x.y.z`
.. pass:[<code>ls * | xargs -n1 -I {} echo "mv apache-{} {}" | sed -e 's/distribution/bin/' -e 's/source-release/src/' -e s'/^\(.*\) \(.*\) \(.*\)$/\1 \3 \2/' | /bin/bash</code>]
.. `cd ..; svn add x.y.z/; svn ci -m "TinkerPop x.y.z release"`
. Execute `bin/validate-distribution.sh` and any other relevant testing.
. Perform JIRA administration tasks:
.. "Release" the current version and set the "release date"
.. If there is to be a follow on release in the current line of code, create that new version specifying the "start date"
.. Migrate the "Affected Version" of all unresolved issues to the next lowest common denominator version - if version 3.0.1 released then all 3.0.0 issues should move forward to 3.0.1 as they now "affect" that latest release
. Submit for `[VOTE]` at `dev@tinkerpop.incubator.apache.org` (see email template below)
. *Wait for vote acceptance* (72 hours)

Incubator Vote
--------------

A positive vote for a particular release from the Apache Incubator is required to move to the following phase.

. Submit for `[VOTE]` at `general@incubator.apache.org` (see email template below)
.. Include the vote tally: "Apache TinkerPop (http://tinkerpop.incubator.apache.org/) would like to release TinkerPop x.y.z. We had a dev@ VOTE which resulted in a tally of +1 (3), 0 (0), and -1 (0). We now present our artifacts for vote by Incubator."
. *Wait for vote acceptance* (72 hours)

Release & Promote
-----------------

. Close the staging repository at link:https://repository.apache.org/[Apache Nexus]) and then release.
. `svn co --depth empty https://dist.apache.org/repos/dist/dev/incubator/tinkerpop dev; svn up dev/x.y.z`
. `svn co --depth empty https://dist.apache.org/repos/dist/release/incubator/tinkerpop release; mkdir release/x.y.z`
. `cd release; svn add x.y.z/; svn ci -m "TinkerPop x.y.z release"`
. Update homepage with references to latest distribution and to other internal links elsewhere on the page.
. Wait for Apache Central to sync the jars and src (link:http://repo1.maven.org/maven2/org/apache/tinkerpop/tinkerpop/[http://repo1.maven.org/maven2/org/apache/tinkerpop/tinkerpop/]).
. Announce release on `dev@`/`gremlin-users@` mailing lists and tweet from `@apachetinkerpop`

Example `[VOTE]` email:

```
[VOTE] TinkerPop x.y.z Release

Hello,

The release artifacts can be found at this location:
	https://dist.apache.org/repos/dist/dev/incubator/tinkerpop/x.y.z/

The source distribution is provided by:
	apache-tinkerpop-x.y.z-source-release.zip

Two binary distributions are provided for user convenience:
	apache-gremlin-console-x.y.z-distribution.zip
	apache-gremlin-server-x.y.z-distribution.zip

The online docs can be found here:
	http://tinkerpop.incubator.apache.org/docs/x.y.z/ (user docs)
	http://tinkerpop.incubator.apache.org/docs/x.y.z/upgrade.html (upgrade docs)
	http://tinkerpop.incubator.apache.org/javadocs/x.y.z/core/ (core javadoc)
	http://tinkerpop.incubator.apache.org/javadocs/x.y.z/full/ (full javadoc)

The tag in Apache Git can be found here:
	https://git-wip-us.apache.org/repos/asf?p=incubator-tinkerpop.git;...

The release notes are available here:
	https://github.com/apache/incubator-tinkerpop/blob/master/CHANGELOG.asciidoc#...

The [VOTE] will be open for the next 72 hours --- closing <DayOfTheWeek> (<Month> <Day> <Year>) at <Time> <TimeZone>.

My vote is +1.

Thank you very much,
<TinkerPop Committer Name>
```