diff options
Diffstat (limited to 'RELEASING.md')
| -rw-r--r-- | RELEASING.md | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/RELEASING.md b/RELEASING.md new file mode 100644 index 00000000..649ac81f --- /dev/null +++ b/RELEASING.md @@ -0,0 +1,294 @@ +# How to Create a Release of OpenCensus Java (for Maintainers Only) + +## Build Environments + +We deploy OpenCensus 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 OpenCensus 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 opencensus-java github +repository. + +Before any push to the upstream repository you need to create a [personal access +token](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/). + +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 + examples/build.gradle + examples/pom.xml + api/src/main/java/io/opencensus/common/OpenCensusLibraryInformation.java + exporters/trace/ocagent/src/main/java/io/opencensus/exporter/trace/ocagent/OcAgentNodeUtils.java + ) + $ git checkout -b v$MAJOR.$MINOR.x master + $ git push upstream v$MAJOR.$MINOR.x + ``` + The branch will be automatically protected by the GitHub branch protection rule for release + branches. + +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_OPENCENSUS_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_OPENCENSUS_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_OPENCENSUS_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 + ``` + +## Deployment + +Deployment to Maven Central (or the snapshot repo) is for all of the artifacts +from the project. + +### Branch + +Before building/deploying, be sure to switch to the appropriate tag. The tag +must reference a commit that has been pushed to the main repository, i.e., has +gone through code review. For the current release use: + +```bash +$ git checkout -b v$MAJOR.$MINOR.$PATCH tags/v$MAJOR.$MINOR.$PATCH +``` + +### Initial Deployment + +The following command will build the whole project and upload it to Maven +Central. Parallel building [is not safe during +uploadArchives](https://issues.gradle.org/browse/GRADLE-3420). + +```bash +$ ./gradlew clean build && ./gradlew -Dorg.gradle.parallel=false uploadArchives +``` + +If the version has the `-SNAPSHOT` suffix, the artifacts will automatically go +to the snapshot repository. Otherwise it's a release deployment and the +artifacts will go to a staging repository. + +When deploying a Release, the deployment will create [a new staging +repository](https://oss.sonatype.org/#stagingRepositories). You'll need to look +up the ID in the OSSRH UI (usually in the form of `opencensus-*`). + +## Releasing on Maven Central + +Once all of the artifacts have been pushed to the staging repository, the +repository must first be `closed`, which will trigger several sanity checks on +the repository. If this completes successfully, the repository can then be +`released`, which will begin the process of pushing the new artifacts to Maven +Central (the staging repository will be destroyed in the process). You can see +the complete process for releasing to Maven Central on the [OSSRH +site](http://central.sonatype.org/pages/releasing-the-deployment.html). + +## Announcement + +Once deployment is done, go to Github [release +page](https://github.com/census-instrumentation/opencensus-java/releases), press +`Draft a new release` to write release notes about the new release. + +You can use `git log upstream/v$MAJOR.$((MINOR-1)).x..upstream/v$MAJOR.$MINOR.x --graph --first-parent` +or the Github [compare tool](https://github.com/census-instrumentation/opencensus-java/compare/) +to view a summary of all commits since last release as a reference. In addition, you can refer to +[CHANGELOG.md](https://github.com/census-instrumentation/opencensus-java/blob/master/CHANGELOG.md) +for a list of major changes since last release. + +Please pick major or important user-visible changes only. + +## Update release versions in documentations and build files + +After releasing is done, you need to update all readmes and examples to point to the +latest version. + +1. Update README.md and gradle/maven build files on `master` branch: + +```bash +$ git checkout -b bump-document-version master +$ BUILD_FILES=( + examples/build.gradle + examples/pom.xml + ) +$ README_FILES=( + README.md + contrib/appengine_standard_util/README.md + contrib/exemplar_util/README.md + contrib/grpc_util/README.md + contrib/http_util/README.md + contrib/log_correlation/log4j2/README.md + contrib/log_correlation/stackdriver/README.md + contrib/monitored_resource_util/README.md + contrib/spring/README.md + contrib/spring_sleuth_v1x/README.md + contrib/zpages/README.md + exporters/stats/prometheus/README.md + exporters/stats/signalfx/README.md + exporters/stats/stackdriver/README.md + exporters/trace/instana/README.md + exporters/trace/logging/README.md + exporters/trace/jaeger/README.md + exporters/trace/ocagent/README.md + exporters/trace/stackdriver/README.md + exporters/trace/zipkin/README.md + ) +# Substitute versions in build files +$ sed -i 's/[0-9]\+\.[0-9]\+\.[0-9]\+\(.*LATEST_OPENCENSUS_RELEASE_VERSION\)/'$MAJOR.$MINOR.$PATCH'\1/' \ + "${BUILD_FILES[@]}" +# Substitute versions in build.gradle examples in README.md +$ sed -i 's/\(\(compile\|runtime\).\+io\.opencensus:.\+:\)[0-9]\+\.[0-9]\+\.[0-9]\+/\1'$MAJOR.$MINOR.$PATCH'/' \ + "${README_FILES[@]}" +# Substitute versions in maven pom examples in README.md +$ sed -i 's/\(<version>\)[0-9]\+\.[0-9]\+\.[0-9]\+/\1'$MAJOR.$MINOR.$PATCH'/' \ + "${README_FILES[@]}" +``` + +2. Update bazel dependencies for subproject `examples`: + + - Follow the instructions on [this + page](https://docs.bazel.build/versions/master/generate-workspace.html) to + install bazel migration tool. You may also need to manually apply + this [patch]( + https://github.com/nevillelyh/migration-tooling/commit/f10e14fd18ad3885c7ec8aa305e4eba266a07ebf) + if you encounter `Unable to find a version for ... due to Invalid Range Result` error when + using it. + + - Use the following command to generate new dependencies file: + + ```bash + $ bazel run //generate_workspace -- \ + --artifact=com.google.guava:guava-jdk5:23.0 + --artifact=com.google.guava:guava:23.0 \ + --artifact=io.grpc:grpc-all:1.9.0 \ + --artifact=io.opencensus:opencensus-api:$MAJOR.$MINOR.$PATCH \ + --artifact=io.opencensus:opencensus-contrib-grpc-metrics:$MAJOR.$MINOR.$PATCH \ + --artifact=io.opencensus:opencensus-contrib-zpages:$MAJOR.$MINOR.$PATCH \ + --artifact=io.opencensus:opencensus-exporter-stats-prometheus:$MAJOR.$MINOR.$PATCH \ + --artifact=io.opencensus:opencensus-exporter-stats-stackdriver:$MAJOR.$MINOR.$PATCH \ + --artifact=io.opencensus:opencensus-exporter-trace-logging:$MAJOR.$MINOR.$PATCH \ + --artifact=io.opencensus:opencensus-exporter-trace-stackdriver:$MAJOR.$MINOR.$PATCH \ + --artifact=io.opencensus:opencensus-impl:$MAJOR.$MINOR.$PATCH \ + --artifact=io.prometheus:simpleclient_httpserver:0.3.0 \ + --repositories=http://repo.maven.apache.org/maven2 + Wrote + /usr/local/.../generate_workspace.runfiles/__main__/generate_workspace.bzl + ``` + + - Copy this file to overwrite `examples/opencensus_workspace.bzl`. + + - Use the following command to rename the generated rules and commit the + changes above: + + ```bash + $ sed -i 's/def generated_/def opencensus_/' examples/opencensus_workspace.bzl + $ git commit -a -m "Update release versions for all readme and build files." + ``` + +3. Go through PR review and merge it to GitHub master branch. + +4. In addition, create a PR to mark the new release in +[CHANGELOG.md](https://github.com/census-instrumentation/opencensus-java/blob/master/CHANGELOG.md) +on master branch. Once that PR is merged, cherry-pick the commit and create another PR to the +release branch (branch v$MAJOR.$MINOR.x). + + +## Known Issues + +### Deployment for tag v0.5.0 +To rebuild the releases on the tag v0.5.0 use: +```bash +$ ./gradlew clean build && ./gradlew uploadArchives +``` + +If option `-Dorg.gradle.parallel=false` is used, you will hit [this bug](https://issues.sonatype.org/browse/OSSRH-19485) +caused by [this bug](https://github.com/gradle/gradle/issues/1827) in gradle 3.5. |
