1# How to Create a Release of OpenCensus Java (for Maintainers Only) 2 3## Build Environments 4 5We deploy OpenCensus Java to Maven Central under the following systems: 6 7- Ubuntu 14.04 8 9Other systems may also work, but we haven't verified them. 10 11## Prerequisites 12 13### Setup OSSRH and Signing 14 15If you haven't deployed artifacts to Maven Central before, you need to setup 16your OSSRH (OSS Repository Hosting) account and signing keys. 17 18- Follow the instructions on [this 19 page](http://central.sonatype.org/pages/ossrh-guide.html) to set up an 20 account with OSSRH. 21 - You only need to create the account, not set up a new project 22 - Contact a OpenCensus Java maintainer to add your account after you 23 have created it. 24- (For release deployment only) [Install 25 GnuPG](http://central.sonatype.org/pages/working-with-pgp-signatures.html#installing-gnupg) 26 and [generate your key 27 pair](http://central.sonatype.org/pages/working-with-pgp-signatures.html#generating-a-key-pair). 28 You'll also need to [publish your public 29 key](http://central.sonatype.org/pages/working-with-pgp-signatures.html#distributing-your-public-key) 30 to make it visible to the Sonatype servers. 31- Put your GnuPG key password and OSSRH account information in 32 `<your-home-directory>/.gradle/gradle.properties`: 33 34 ``` 35 # You need the signing properties only if you are making release deployment 36 signing.keyId=<8-character-public-key-id> 37 signing.password=<key-password> 38 signing.secretKeyRingFile=<your-home-directory>/.gnupg/secring.gpg 39 40 ossrhUsername=<ossrh-username> 41 ossrhPassword=<ossrh-password> 42 checkstyle.ignoreFailures=false 43 ``` 44 45## Tagging the Release 46 47The first step in the release process is to create a release branch, bump 48versions, and create a tag for the release. Our release branches follow the 49naming convention of `v<major>.<minor>.x`, while the tags include the patch 50version `v<major>.<minor>.<patch>`. For example, the same branch `v0.4.x` would 51be used to create all `v0.4` tags (e.g. `v0.4.0`, `v0.4.1`). 52 53In this section upstream repository refers to the main opencensus-java github 54repository. 55 56Before any push to the upstream repository you need to create a [personal access 57token](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/). 58 591. Create the release branch and push it to GitHub: 60 61 ```bash 62 $ MAJOR=0 MINOR=4 PATCH=0 # Set appropriately for new release 63 $ VERSION_FILES=( 64 build.gradle 65 examples/build.gradle 66 examples/pom.xml 67 api/src/main/java/io/opencensus/common/OpenCensusLibraryInformation.java 68 exporters/trace/ocagent/src/main/java/io/opencensus/exporter/trace/ocagent/OcAgentNodeUtils.java 69 ) 70 $ git checkout -b v$MAJOR.$MINOR.x master 71 $ git push upstream v$MAJOR.$MINOR.x 72 ``` 73 The branch will be automatically protected by the GitHub branch protection rule for release 74 branches. 75 762. For `master` branch: 77 78 - Change root build files to the next minor snapshot (e.g. 79 `0.5.0-SNAPSHOT`). 80 81 ```bash 82 $ git checkout -b bump-version master 83 # Change version to next minor (and keep -SNAPSHOT) 84 $ sed -i 's/[0-9]\+\.[0-9]\+\.[0-9]\+\(.*CURRENT_OPENCENSUS_VERSION\)/'$MAJOR.$((MINOR+1)).0'\1/' \ 85 "${VERSION_FILES[@]}" 86 $ ./gradlew build 87 $ git commit -a -m "Start $MAJOR.$((MINOR+1)).0 development cycle" 88 ``` 89 90 - Go through PR review and push the master branch to GitHub: 91 92 ```bash 93 $ git checkout master 94 $ git merge --ff-only bump-version 95 $ git push upstream master 96 ``` 97 983. For `vMajor.Minor.x` branch: 99 100 - Change root build files to remove "-SNAPSHOT" for the next release 101 version (e.g. `0.4.0`). Commit the result and make a tag: 102 103 ```bash 104 $ git checkout -b release v$MAJOR.$MINOR.x 105 # Change version to remove -SNAPSHOT 106 $ sed -i 's/-SNAPSHOT\(.*CURRENT_OPENCENSUS_VERSION\)/\1/' "${VERSION_FILES[@]}" 107 $ ./gradlew build 108 $ git commit -a -m "Bump version to $MAJOR.$MINOR.$PATCH" 109 $ git tag -a v$MAJOR.$MINOR.$PATCH -m "Version $MAJOR.$MINOR.$PATCH" 110 ``` 111 112 - Change root build files to the next snapshot version (e.g. 113 `0.4.1-SNAPSHOT`). Commit the result: 114 115 ```bash 116 # Change version to next patch and add -SNAPSHOT 117 $ sed -i 's/[0-9]\+\.[0-9]\+\.[0-9]\+\(.*CURRENT_OPENCENSUS_VERSION\)/'$MAJOR.$MINOR.$((PATCH+1))-SNAPSHOT'\1/' \ 118 "${VERSION_FILES[@]}" 119 $ ./gradlew build 120 $ git commit -a -m "Bump version to $MAJOR.$MINOR.$((PATCH+1))-SNAPSHOT" 121 ``` 122 123 - Go through PR review and push the release tag and updated release branch 124 to GitHub: 125 126 ```bash 127 $ git checkout v$MAJOR.$MINOR.x 128 $ git merge --ff-only release 129 $ git push upstream v$MAJOR.$MINOR.$PATCH 130 $ git push upstream v$MAJOR.$MINOR.x 131 ``` 132 133## Deployment 134 135Deployment to Maven Central (or the snapshot repo) is for all of the artifacts 136from the project. 137 138### Branch 139 140Before building/deploying, be sure to switch to the appropriate tag. The tag 141must reference a commit that has been pushed to the main repository, i.e., has 142gone through code review. For the current release use: 143 144```bash 145$ git checkout -b v$MAJOR.$MINOR.$PATCH tags/v$MAJOR.$MINOR.$PATCH 146``` 147 148### Initial Deployment 149 150The following command will build the whole project and upload it to Maven 151Central. Parallel building [is not safe during 152uploadArchives](https://issues.gradle.org/browse/GRADLE-3420). 153 154```bash 155$ ./gradlew clean build && ./gradlew -Dorg.gradle.parallel=false uploadArchives 156``` 157 158If the version has the `-SNAPSHOT` suffix, the artifacts will automatically go 159to the snapshot repository. Otherwise it's a release deployment and the 160artifacts will go to a staging repository. 161 162When deploying a Release, the deployment will create [a new staging 163repository](https://oss.sonatype.org/#stagingRepositories). You'll need to look 164up the ID in the OSSRH UI (usually in the form of `opencensus-*`). 165 166## Releasing on Maven Central 167 168Once all of the artifacts have been pushed to the staging repository, the 169repository must first be `closed`, which will trigger several sanity checks on 170the repository. If this completes successfully, the repository can then be 171`released`, which will begin the process of pushing the new artifacts to Maven 172Central (the staging repository will be destroyed in the process). You can see 173the complete process for releasing to Maven Central on the [OSSRH 174site](http://central.sonatype.org/pages/releasing-the-deployment.html). 175 176## Announcement 177 178Once deployment is done, go to Github [release 179page](https://github.com/census-instrumentation/opencensus-java/releases), press 180`Draft a new release` to write release notes about the new release. 181 182You can use `git log upstream/v$MAJOR.$((MINOR-1)).x..upstream/v$MAJOR.$MINOR.x --graph --first-parent` 183or the Github [compare tool](https://github.com/census-instrumentation/opencensus-java/compare/) 184to view a summary of all commits since last release as a reference. In addition, you can refer to 185[CHANGELOG.md](https://github.com/census-instrumentation/opencensus-java/blob/master/CHANGELOG.md) 186for a list of major changes since last release. 187 188Please pick major or important user-visible changes only. 189 190## Update release versions in documentations and build files 191 192After releasing is done, you need to update all readmes and examples to point to the 193latest version. 194 1951. Update README.md and gradle/maven build files on `master` branch: 196 197```bash 198$ git checkout -b bump-document-version master 199$ BUILD_FILES=( 200 examples/build.gradle 201 examples/pom.xml 202 ) 203$ README_FILES=( 204 README.md 205 contrib/appengine_standard_util/README.md 206 contrib/exemplar_util/README.md 207 contrib/grpc_util/README.md 208 contrib/http_util/README.md 209 contrib/log_correlation/log4j2/README.md 210 contrib/log_correlation/stackdriver/README.md 211 contrib/monitored_resource_util/README.md 212 contrib/spring/README.md 213 contrib/spring_sleuth_v1x/README.md 214 contrib/zpages/README.md 215 exporters/stats/prometheus/README.md 216 exporters/stats/signalfx/README.md 217 exporters/stats/stackdriver/README.md 218 exporters/trace/instana/README.md 219 exporters/trace/logging/README.md 220 exporters/trace/jaeger/README.md 221 exporters/trace/ocagent/README.md 222 exporters/trace/stackdriver/README.md 223 exporters/trace/zipkin/README.md 224 ) 225# Substitute versions in build files 226$ sed -i 's/[0-9]\+\.[0-9]\+\.[0-9]\+\(.*LATEST_OPENCENSUS_RELEASE_VERSION\)/'$MAJOR.$MINOR.$PATCH'\1/' \ 227 "${BUILD_FILES[@]}" 228# Substitute versions in build.gradle examples in README.md 229$ sed -i 's/\(\(compile\|runtime\).\+io\.opencensus:.\+:\)[0-9]\+\.[0-9]\+\.[0-9]\+/\1'$MAJOR.$MINOR.$PATCH'/' \ 230 "${README_FILES[@]}" 231# Substitute versions in maven pom examples in README.md 232$ sed -i 's/\(<version>\)[0-9]\+\.[0-9]\+\.[0-9]\+/\1'$MAJOR.$MINOR.$PATCH'/' \ 233 "${README_FILES[@]}" 234``` 235 2362. Update bazel dependencies for subproject `examples`: 237 238 - Follow the instructions on [this 239 page](https://docs.bazel.build/versions/master/generate-workspace.html) to 240 install bazel migration tool. You may also need to manually apply 241 this [patch]( 242 https://github.com/nevillelyh/migration-tooling/commit/f10e14fd18ad3885c7ec8aa305e4eba266a07ebf) 243 if you encounter `Unable to find a version for ... due to Invalid Range Result` error when 244 using it. 245 246 - Use the following command to generate new dependencies file: 247 248 ```bash 249 $ bazel run //generate_workspace -- \ 250 --artifact=com.google.guava:guava-jdk5:23.0 251 --artifact=com.google.guava:guava:23.0 \ 252 --artifact=io.grpc:grpc-all:1.9.0 \ 253 --artifact=io.opencensus:opencensus-api:$MAJOR.$MINOR.$PATCH \ 254 --artifact=io.opencensus:opencensus-contrib-grpc-metrics:$MAJOR.$MINOR.$PATCH \ 255 --artifact=io.opencensus:opencensus-contrib-zpages:$MAJOR.$MINOR.$PATCH \ 256 --artifact=io.opencensus:opencensus-exporter-stats-prometheus:$MAJOR.$MINOR.$PATCH \ 257 --artifact=io.opencensus:opencensus-exporter-stats-stackdriver:$MAJOR.$MINOR.$PATCH \ 258 --artifact=io.opencensus:opencensus-exporter-trace-logging:$MAJOR.$MINOR.$PATCH \ 259 --artifact=io.opencensus:opencensus-exporter-trace-stackdriver:$MAJOR.$MINOR.$PATCH \ 260 --artifact=io.opencensus:opencensus-impl:$MAJOR.$MINOR.$PATCH \ 261 --artifact=io.prometheus:simpleclient_httpserver:0.3.0 \ 262 --repositories=http://repo.maven.apache.org/maven2 263 Wrote 264 /usr/local/.../generate_workspace.runfiles/__main__/generate_workspace.bzl 265 ``` 266 267 - Copy this file to overwrite `examples/opencensus_workspace.bzl`. 268 269 - Use the following command to rename the generated rules and commit the 270 changes above: 271 272 ```bash 273 $ sed -i 's/def generated_/def opencensus_/' examples/opencensus_workspace.bzl 274 $ git commit -a -m "Update release versions for all readme and build files." 275 ``` 276 2773. Go through PR review and merge it to GitHub master branch. 278 2794. In addition, create a PR to mark the new release in 280[CHANGELOG.md](https://github.com/census-instrumentation/opencensus-java/blob/master/CHANGELOG.md) 281on master branch. Once that PR is merged, cherry-pick the commit and create another PR to the 282release branch (branch v$MAJOR.$MINOR.x). 283 284 285## Known Issues 286 287### Deployment for tag v0.5.0 288To rebuild the releases on the tag v0.5.0 use: 289```bash 290$ ./gradlew clean build && ./gradlew uploadArchives 291``` 292 293If option `-Dorg.gradle.parallel=false` is used, you will hit [this bug](https://issues.sonatype.org/browse/OSSRH-19485) 294caused by [this bug](https://github.com/gradle/gradle/issues/1827) in gradle 3.5. 295