Add initial releasing instructions. (#212)
* Add initial releasing instructions.
diff --git a/RELEASING.md b/RELEASING.md
new file mode 100644
index 0000000..67a0541
--- /dev/null
+++ b/RELEASING.md
@@ -0,0 +1,122 @@
+# How to Create a Release of Instrumentation Java (for Maintainers Only)
+
+## Build Environments
+
+We deploy Instrumentation Java to Maven Central under the following systems:
+
+- Ubuntu 14.04
+
+Other systems may also work, but we haven't verified them.
+
+## Prerequisites
+
+### Setup OSSRH and Signing
+
+If you haven't deployed artifacts to Maven Central before, you need to setup
+your OSSRH (OSS Repository Hosting) account and signing keys.
+
+- Follow the instructions on [this
+ page](http://central.sonatype.org/pages/ossrh-guide.html) to set up an
+ account with OSSRH.
+ - You only need to create the account, not set up a new project
+ - Contact a Instrumentation Java maintainer to add your account after you
+ have created it.
+- (For release deployment only) [Install
+ GnuPG](http://central.sonatype.org/pages/working-with-pgp-signatures.html#installing-gnupg)
+ and [generate your key
+ pair](http://central.sonatype.org/pages/working-with-pgp-signatures.html#generating-a-key-pair).
+ You'll also need to [publish your public
+ key](http://central.sonatype.org/pages/working-with-pgp-signatures.html#distributing-your-public-key)
+ to make it visible to the Sonatype servers.
+- Put your GnuPG key password and OSSRH account information in
+ `<your-home-directory>/.gradle/gradle.properties`:
+
+ ```
+ # You need the signing properties only if you are making release deployment
+ signing.keyId=<8-character-public-key-id>
+ signing.password=<key-password>
+ signing.secretKeyRingFile=<your-home-directory>/.gnupg/secring.gpg
+
+ ossrhUsername=<ossrh-username>
+ ossrhPassword=<ossrh-password>
+ checkstyle.ignoreFailures=false
+ ```
+
+## Tagging the Release
+
+The first step in the release process is to create a release branch, bump
+versions, and create a tag for the release. Our release branches follow the
+naming convention of `v<major>.<minor>.x`, while the tags include the patch
+version `v<major>.<minor>.<patch>`. For example, the same branch `v0.4.x` would
+be used to create all `v0.4` tags (e.g. `v0.4.0`, `v0.4.1`).
+
+In this section upstream repository refers to the main instrumentation-java
+github repository.
+
+1. Create the release branch and push it to GitHub:
+
+ ```bash
+ $ MAJOR=0 MINOR=4 PATCH=0 # Set appropriately for new release
+ $ VERSION_FILES=(
+ build.gradle
+ )
+ $ git checkout -b v$MAJOR.$MINOR.x master
+ $ git push upstream v$MAJOR.$MINOR.x
+ ```
+
+2. For `master` branch:
+
+ - Change root build files to the next minor snapshot (e.g.
+ `0.5.0-SNAPSHOT`).
+
+ ```bash
+ $ git checkout -b bump-version master
+ # Change version to next minor (and keep -SNAPSHOT)
+ $ sed -i 's/[0-9]\+\.[0-9]\+\.[0-9]\+\(.*CURRENT_INSTRUMENTATION_VERSION\)/'$MAJOR.$((MINOR+1)).0'\1/' \
+ "${VERSION_FILES[@]}"
+ $ ./gradlew build
+ $ git commit -a -m "Start $MAJOR.$((MINOR+1)).0 development cycle"
+ ```
+
+ - Go through PR review and push the master branch to GitHub:
+
+ ```bash
+ $ git checkout master
+ $ git merge --ff-only bump-version
+ $ git push upstream master
+ ```
+
+3. For `vMajor.Minor.x` branch:
+
+ - Change root build files to remove "-SNAPSHOT" for the next release
+ version (e.g. `0.4.0`). Commit the result and make a tag:
+
+ ```bash
+ $ git checkout -b release v$MAJOR.$MINOR.x
+ # Change version to remove -SNAPSHOT
+ $ sed -i 's/-SNAPSHOT\(.*CURRENT_INSTRUMENTATION_VERSION\)/\1/' "${VERSION_FILES[@]}"
+ $ ./gradlew build
+ $ git commit -a -m "Bump version to $MAJOR.$MINOR.$PATCH"
+ $ git tag -a v$MAJOR.$MINOR.$PATCH -m "Version $MAJOR.$MINOR.$PATCH"
+ ```
+
+ - Change root build files to the next snapshot version (e.g.
+ `0.4.1-SNAPSHOT`). Commit the result:
+
+ ```bash
+ # Change version to next patch and add -SNAPSHOT
+ $ sed -i 's/[0-9]\+\.[0-9]\+\.[0-9]\+\(.*CURRENT_INSTRUMENTATION_VERSION\)/'$MAJOR.$MINOR.$((PATCH+1))-SNAPSHOT'\1/' \
+ "${VERSION_FILES[@]}"
+ $ ./gradlew build
+ $ git commit -a -m "Bump version to $MAJOR.$MINOR.$((PATCH+1))-SNAPSHOT"
+ ```
+
+ - Go through PR review and push the release tag and updated release branch
+ to GitHub:
+
+ ```bash
+ $ git checkout v$MAJOR.$MINOR.x
+ $ git merge --ff-only release
+ $ git push upstream v$MAJOR.$MINOR.$PATCH
+ $ git push upstream v$MAJOR.$MINOR.x
+ ```