| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 1 | How to Create a Release of GRPC Java (for Maintainers Only) |
| 2 | =============================================================== |
| 3 | |
| 4 | Build Environments |
| 5 | ------------------ |
| 6 | We deploy GRPC to Maven Central under the following systems: |
| 7 | - Ubuntu 14.04 with Docker 1.6.1 that runs CentOS 6.6 |
| 8 | - Windows 7 64-bit with MSYS2 with mingw32 and mingw64 |
| 9 | - Mac OS X 10.9.5 |
| 10 | |
| 11 | Other systems may also work, but we haven't verified them. |
| 12 | |
| 13 | Prerequisites |
| 14 | ------------- |
| 15 | |
| 16 | ### Setup OSSRH and Signing |
| 17 | |
| 18 | If you haven't deployed artifacts to Maven Central before, you need to setup |
| 19 | your OSSRH (OSS Repository Hosting) account and signing keys. |
| 20 | - Follow the instructions on [this |
| 21 | page](http://central.sonatype.org/pages/ossrh-guide.html) to set up an |
| 22 | account with OSSRH. |
| Carl Mastrangelo | 7a6b166 | 2015-08-12 13:52:45 -0700 | [diff] [blame] | 23 | - You only need to create the account, not set up a new project |
| 24 | - Contact a gRPC maintainer to add your account after you have created it. |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 25 | - (For release deployment only) Install GnuPG and [generate your key |
| 26 | pair](https://www.gnupg.org/documentation/howtos.html). You'll also |
| 27 | need to [publish your public key](https://www.gnupg.org/gph/en/manual.html#AEN464) |
| 28 | to make it visible to the Sonatype servers |
| 29 | (e.g. `gpg --keyserver pgp.mit.edu --send-key <key ID>`). |
| 30 | - Put your GnuPG key password and OSSRH account information in |
| 31 | `<your-home-directory>/.gradle/gradle.properties`. |
| 32 | |
| 33 | ``` |
| 34 | # You need the signing properties only if you are making release deployment |
| 35 | signing.keyId=<8-character-public-key-id> |
| 36 | signing.password=<key-password> |
| 37 | signing.secretKeyRingFile=<your-home-directory>/.gnupg/secring.gpg |
| 38 | |
| 39 | ossrhUsername=<ossrh-username> |
| 40 | ossrhPassword=<ossrh-password> |
| 41 | checkstyle.ignoreFailures=false |
| 42 | ``` |
| 43 | |
| 44 | ### Build Protobuf |
| 45 | Protobuf libraries are needed for compiling the GRPC codegen. Despite that you |
| 46 | may have installed Protobuf on your system, you may want to build Protobuf |
| 47 | separately and install it under your personal directory, because |
| 48 | |
| 49 | 1. The Protobuf version installed on your system may be different from what |
| 50 | GRPC requires. You may not want to pollute your system installation. |
| 51 | 2. We will deploy both 32-bit and 64-bit versions of the codegen, thus require |
| 52 | both variants of Protobuf libraries. You don't want to mix them in your |
| 53 | system paths. |
| 54 | |
| 55 | Please see the [Main Readme](README.md) for details on building protobuf. |
| 56 | |
| 57 | Tagging the Release |
| 58 | ---------------------- |
| Eric Anderson | b824565 | 2016-02-17 11:34:50 -0800 | [diff] [blame] | 59 | The first step in the release process is to create a release branch, bump |
| 60 | versions, and create a tag for the release. Our release branches follow the naming |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 61 | convention of `v<major>.<minor>.x`, while the tags include the patch version |
| 62 | `v<major>.<minor>.<patch>`. For example, the same branch `v0.7.x` |
| 63 | would be used to create all `v0.7` tags (e.g. `v0.7.0`, `v0.7.1`). |
| 64 | |
| Eric Anderson | b824565 | 2016-02-17 11:34:50 -0800 | [diff] [blame] | 65 | 1. Create the release branch and push it to GitHub: |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 66 | |
| 67 | ```bash |
| Eric Anderson | b824565 | 2016-02-17 11:34:50 -0800 | [diff] [blame] | 68 | $ MAJOR=0 MINOR=7 PATCH=0 # Set appropriately for new release |
| Eric Anderson | 1f7fb04 | 2016-08-19 11:12:09 -0700 | [diff] [blame] | 69 | $ VERSION_FILES=( |
| 70 | build.gradle |
| 71 | android-interop-testing/app/build.gradle |
| 72 | examples/build.gradle |
| 73 | examples/pom.xml |
| 74 | examples/android/helloworld/app/build.gradle |
| 75 | examples/android/routeguide/app/build.gradle |
| 76 | examples/thrift/build.gradle |
| 77 | ) |
| Eric Anderson | b824565 | 2016-02-17 11:34:50 -0800 | [diff] [blame] | 78 | $ git checkout -b v$MAJOR.$MINOR.x master |
| 79 | $ git push upstream v$MAJOR.$MINOR.x |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 80 | ``` |
| Eric Anderson | 554287a | 2016-06-16 10:12:41 -0700 | [diff] [blame] | 81 | 2. For `master`, change root build files to the next minor snapshot (e.g. |
| Eric Anderson | b824565 | 2016-02-17 11:34:50 -0800 | [diff] [blame] | 82 | ``0.8.0-SNAPSHOT``). |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 83 | |
| 84 | ```bash |
| Eric Anderson | b824565 | 2016-02-17 11:34:50 -0800 | [diff] [blame] | 85 | $ git checkout -b bump-version master |
| 86 | # Change version to next minor (and keep -SNAPSHOT) |
| 87 | $ sed -i 's/[0-9]\+\.[0-9]\+\.[0-9]\+\(.*CURRENT_GRPC_VERSION\)/'$MAJOR.$((MINOR+1)).0'\1/' \ |
| Eric Anderson | 1f7fb04 | 2016-08-19 11:12:09 -0700 | [diff] [blame] | 88 | "${VERSION_FILES[@]}" |
| Eric Anderson | 7b26a32 | 2016-07-01 11:59:21 -0700 | [diff] [blame] | 89 | $ ./gradlew build |
| Eric Anderson | b824565 | 2016-02-17 11:34:50 -0800 | [diff] [blame] | 90 | $ git commit -a -m "Start $MAJOR.$((MINOR+1)).0 development cycle" |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 91 | ``` |
| Eric Anderson | b824565 | 2016-02-17 11:34:50 -0800 | [diff] [blame] | 92 | 3. Go through PR review and push the master branch to GitHub: |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 93 | |
| 94 | ```bash |
| Eric Anderson | b824565 | 2016-02-17 11:34:50 -0800 | [diff] [blame] | 95 | $ git checkout master |
| 96 | $ git merge --ff-only bump-version |
| 97 | $ git push upstream master |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 98 | ``` |
| Eric Anderson | f25f55a | 2016-08-04 13:51:20 -0700 | [diff] [blame] | 99 | 4. For vMajor.Minor.x branch, change `README.md` to refer to the next release |
| 100 | version. _Also_ update the version numbers for protoc if the protobuf library |
| 101 | version was updated since the last release. |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 102 | |
| 103 | ```bash |
| Eric Anderson | b824565 | 2016-02-17 11:34:50 -0800 | [diff] [blame] | 104 | $ git checkout -b release v$MAJOR.$MINOR.x |
| Eric Anderson | f25f55a | 2016-08-04 13:51:20 -0700 | [diff] [blame] | 105 | # Bump documented versions. Don't forget protobuf version |
| 106 | $ ${EDITOR:-nano -w} README.md |
| 107 | $ git commit -a -m "Update README to reference $MAJOR.$MINOR.$PATCH" |
| 108 | ``` |
| 109 | 5. Change root build files to remove "-SNAPSHOT" for the next release version |
| 110 | (e.g. `0.7.0`). Commit the result and make a tag: |
| 111 | |
| 112 | ```bash |
| Eric Anderson | b824565 | 2016-02-17 11:34:50 -0800 | [diff] [blame] | 113 | # Change version to remove -SNAPSHOT |
| Eric Anderson | 1f7fb04 | 2016-08-19 11:12:09 -0700 | [diff] [blame] | 114 | $ sed -i 's/-SNAPSHOT\(.*CURRENT_GRPC_VERSION\)/\1/' "${VERSION_FILES[@]}" |
| Eric Anderson | 7b26a32 | 2016-07-01 11:59:21 -0700 | [diff] [blame] | 115 | $ ./gradlew build |
| Eric Anderson | b824565 | 2016-02-17 11:34:50 -0800 | [diff] [blame] | 116 | $ git commit -a -m "Bump version to $MAJOR.$MINOR.$PATCH" |
| 117 | $ git tag -a v$MAJOR.$MINOR.$PATCH -m "Version $MAJOR.$MINOR.$PATCH" |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 118 | ``` |
| Eric Anderson | f25f55a | 2016-08-04 13:51:20 -0700 | [diff] [blame] | 119 | 6. Change root build files to the next snapshot version (e.g. `0.7.1-SNAPSHOT`). |
| Eric Anderson | 554287a | 2016-06-16 10:12:41 -0700 | [diff] [blame] | 120 | Commit the result: |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 121 | |
| 122 | ```bash |
| Eric Anderson | b824565 | 2016-02-17 11:34:50 -0800 | [diff] [blame] | 123 | # Change version to next patch and add -SNAPSHOT |
| 124 | $ sed -i 's/[0-9]\+\.[0-9]\+\.[0-9]\+\(.*CURRENT_GRPC_VERSION\)/'$MAJOR.$MINOR.$((PATCH+1))-SNAPSHOT'\1/' \ |
| Eric Anderson | 1f7fb04 | 2016-08-19 11:12:09 -0700 | [diff] [blame] | 125 | "${VERSION_FILES[@]}" |
| Eric Anderson | 7b26a32 | 2016-07-01 11:59:21 -0700 | [diff] [blame] | 126 | $ ./gradlew build |
| Eric Anderson | b824565 | 2016-02-17 11:34:50 -0800 | [diff] [blame] | 127 | $ git commit -a -m "Bump version to $MAJOR.$MINOR.$((PATCH+1))-SNAPSHOT" |
| 128 | ``` |
| Eric Anderson | f25f55a | 2016-08-04 13:51:20 -0700 | [diff] [blame] | 129 | 7. Go through PR review and push the release tag and updated release branch to |
| Eric Anderson | b824565 | 2016-02-17 11:34:50 -0800 | [diff] [blame] | 130 | GitHub: |
| 131 | |
| 132 | ```bash |
| 133 | $ git checkout v$MAJOR.$MINOR.x |
| 134 | $ git merge --ff-only release |
| 135 | $ git push upstream v$MAJOR.$MINOR.$PATCH |
| 136 | $ git push upstream v$MAJOR.$MINOR.x |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 137 | ``` |
| 138 | |
| 139 | Setup Build Environment |
| 140 | --------------------------- |
| 141 | |
| 142 | ### Linux |
| 143 | The deployment for Linux uses [Docker](https://www.docker.com/) running |
| 144 | CentOS 6.6 in order to ensure that we have a consistent deployment environment |
| 145 | on Linux. You'll first need to install Docker if not already installed on your |
| Carl Mastrangelo | 8f6562e | 2015-08-13 15:19:53 -0700 | [diff] [blame] | 146 | system. Make sure to have at least version 1.7.1 or later. |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 147 | |
| 148 | 1. Under the [Protobuf source directory](https://github.com/google/protobuf), |
| 149 | build the `protoc-artifacts` image: |
| 150 | |
| 151 | ```bash |
| 152 | protobuf$ docker build -t protoc-artifacts protoc-artifacts |
| 153 | ``` |
| 154 | 2. Under the grpc-java source directory, build the `grpc-java-deploy` image: |
| 155 | |
| 156 | ```bash |
| 157 | grpc-java$ docker build -t grpc-java-deploy compiler |
| 158 | ``` |
| 159 | 3. Start a Docker container that has the deploy environment set up for you. The |
| 160 | GRPC source is cloned into `/grpc-java`. |
| 161 | |
| 162 | ```bash |
| 163 | $ docker run -it --rm=true grpc-java-deploy |
| 164 | ``` |
| 165 | |
| 166 | Note that the container will be deleted after you exit. Any changes you have |
| 167 | made (e.g., copied configuration files) will be lost. If you want to keep the |
| 168 | container, remove `--rm=true` from the command line. |
| 169 | 4. Next, you'll need to copy your OSSRH credentials and GnuPG keys to your docker container. |
| Kun Zhang | 2bd0887 | 2016-01-22 15:32:04 -0800 | [diff] [blame] | 170 | In Docker: |
| 171 | ``` |
| 172 | # mkdir /root/.gradle |
| 173 | ``` |
| 174 | Find the container ID in your bash prompt, which is shown as `[root@<container-ID> ...]`. |
| 175 | In host: |
| 176 | ``` |
| 177 | $ docker cp ~/.gnupg <container-ID>:/root/ |
| 178 | $ docker cp ~/.gradle/gradle.properties <container-ID>:/root/.gradle/ |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 179 | ``` |
| 180 | |
| 181 | You'll also need to update `signing.secretKeyRingFile` in |
| 182 | `/root/.gradle/gradle.properties` to point to `/root/.gnupg/secring.gpg`. |
| 183 | |
| 184 | ### Windows |
| 185 | |
| 186 | #### Windows 64-bit with MSYS2 (Recommended for Windows) |
| 187 | Because the gcc shipped with MSYS2 doesn't support multilib, you have to |
| 188 | compile and deploy 32-bit and 64-bit binaries in separate steps. |
| 189 | |
| 190 | ##### Under MinGW-w64 Win32 Shell |
| 191 | 1. Compile and install 32-bit protobuf: |
| 192 | |
| 193 | ```bash |
| 194 | protobuf$ ./configure --disable-shared --prefix=$HOME/protobuf-32 |
| 195 | protobuf$ make clean && make && make install |
| 196 | ``` |
| 197 | 2. Configure CXXFLAGS needed by the protoc plugin when building. |
| 198 | |
| 199 | ```bash |
| 200 | grpc-java$ export CXXFLAGS="-I$HOME/protobuf-32/include" \ |
| 201 | LDFLAGS="-L$HOME/protobuf-32/lib" |
| 202 | ``` |
| 203 | |
| 204 | ##### Under MinGW-w64 Win64 Shell |
| 205 | 1. Compile and install 64-bit protobuf: |
| 206 | |
| 207 | ```bash |
| 208 | protobuf$ ./configure --disable-shared --prefix=$HOME/protobuf-64 |
| 209 | protobuf$ make clean && make && make install |
| 210 | ``` |
| 211 | 2. Configure CXXFLAGS needed by the protoc plugin when building. |
| 212 | |
| 213 | ```bash |
| 214 | grpc-java$ export CXXFLAGS="-I$HOME/protobuf-64/include" \ |
| 215 | LDFLAGS="-L$HOME/protobuf-64/lib" |
| 216 | ``` |
| 217 | |
| 218 | #### Windows 64-bit with Cygwin64 (TODO: incomplete) |
| 219 | Because the MinGW gcc shipped with Cygwin64 doesn't support multilib, you have |
| 220 | to compile and deploy 32-bit and 64-bit binaries in separate steps. |
| 221 | |
| 222 | 1. Compile and install 32-bit protobuf. `-static-libgcc -static-libstdc++` are |
| 223 | needed for `protoc` to be successfully run in the unit test. |
| 224 | |
| 225 | ```bash |
| 226 | protobuf$ LDFLAGS="-static-libgcc -static-libstdc++" ./configure --host=i686-w64-mingw32 --disable-shared --prefix=$HOME/protobuf-32 |
| 227 | protobuf$ make clean && make && make install |
| 228 | ``` |
| 229 | |
| 230 | 2. Compile and install 64-bit protobuf: |
| 231 | |
| 232 | ```bash |
| 233 | protobuf$ ./configure --host=x86_64-w64-mingw32 --disable-shared --prefix=$HOME/protobuf-64 |
| 234 | protobuf$ make clean && make && make install |
| 235 | ``` |
| 236 | |
| 237 | ### Mac |
| 238 | Please refer to [Protobuf |
| 239 | README](https://github.com/google/protobuf/blob/master/README.md) for how to |
| 240 | set up GCC and Unix tools on Mac. |
| 241 | |
| 242 | Mac OS X has been 64-bit-only since 10.7 and we are compiling for 10.7 and up. |
| 243 | We only build 64-bit artifact for Mac. |
| 244 | |
| 245 | 1. Compile and install protobuf: |
| 246 | |
| 247 | ```bash |
| 248 | protobuf$ CXXFLAGS="-m64" ./configure --disable-shared --prefix=$HOME/protobuf |
| 249 | protobuf$ make clean && make && make install |
| 250 | ``` |
| 251 | 2. Configure CXXFLAGS needed by the protoc plugin when building. |
| 252 | |
| 253 | ```bash |
| 254 | grpc-java$ export CXXFLAGS="-I$HOME/protobuf/include" \ |
| 255 | LDFLAGS="$HOME/protobuf/lib/libprotobuf.a $HOME/protobuf/lib/libprotoc.a" |
| 256 | ``` |
| 257 | |
| 258 | Build and Deploy |
| 259 | ---------------- |
| 260 | We currently distribute the following OSes and architectures: |
| 261 | |
| 262 | | OS | x86_32 | x86_64 | |
| 263 | | --- | --- | --- | |
| 264 | | Linux | X | X | |
| 265 | | Windows | X | X | |
| 266 | | Mac | | X | |
| 267 | |
| 268 | Deployment to Maven Central (or the snapshot repo) is a two-step process. The only |
| 269 | artifact that is platform-specific is codegen, so we only need to deploy the other |
| 270 | jars once. So the first deployment is for all of the artifacts from one of the selected |
| 271 | OS/architectures. After that, we then deploy the codegen artifacts for the remaining |
| 272 | OS/architectures. |
| 273 | |
| 274 | **NOTE: _Before building/deploying, be sure to switch to the appropriate branch or tag in |
| 275 | the grpc-java source directory._** |
| 276 | |
| 277 | ### First Deployment |
| 278 | |
| 279 | As stated above, this only needs to be done once for one of the selected OS/architectures. |
| 280 | The following command will build the whole project and upload it to Maven |
| Eric Anderson | 41a9c94 | 2016-04-29 15:19:24 -0700 | [diff] [blame] | 281 | Central. Parallel building [is not safe during |
| 282 | uploadArchives](https://issues.gradle.org/browse/GRADLE-3420). |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 283 | ```bash |
| Eric Anderson | 41a9c94 | 2016-04-29 15:19:24 -0700 | [diff] [blame] | 284 | grpc-java$ ./gradlew clean build && ./gradlew -Dorg.gradle.parallel=false uploadArchives |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 285 | ``` |
| 286 | |
| 287 | If the version has the `-SNAPSHOT` suffix, the artifacts will automatically |
| 288 | go to the snapshot repository. Otherwise it's a release deployment and the |
| 289 | artifacts will go to a freshly created staging repository. |
| 290 | |
| 291 | ### Deploy GRPC Codegen for Additional Platforms |
| 292 | The previous step will only deploy the codegen artifacts for the OS you run on |
| 293 | it and the architecture of your JVM. For a fully fledged deployment, you will |
| 294 | need to deploy the codegen for all other supported OSes and architectures. |
| 295 | |
| 296 | To deploy the codegen for an OS and architecture, you must run the following |
| 297 | commands on that OS and specify the architecture by the flag `-PtargetArch=<arch>`. |
| 298 | |
| 299 | If you are doing a snapshot deployment: |
| 300 | |
| 301 | ```bash |
| Eric Anderson | 41a9c94 | 2016-04-29 15:19:24 -0700 | [diff] [blame] | 302 | grpc-java$ ./gradlew clean grpc-compiler:build grpc-compiler:uploadArchives \ |
| 303 | -PtargetArch=<arch> -Dorg.gradle.parallel=false |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 304 | ``` |
| 305 | |
| 306 | When deploying a Release, the first deployment will create |
| 307 | [a new staging repository](https://oss.sonatype.org/#stagingRepositories). You'll need |
| 308 | to look up the ID in the OSSRH UI (usually in the form of `iogrpc-*`). Codegen |
| 309 | deployment commands should include `-PrepositoryId=<repository-id>` in order to |
| 310 | ensure that the artifacts are pushed to the same staging repository. |
| 311 | |
| 312 | ```bash |
| 313 | grpc-java$ ./gradlew clean grpc-compiler:build grpc-compiler:uploadArchives -PtargetArch=<arch> \ |
| Eric Anderson | 41a9c94 | 2016-04-29 15:19:24 -0700 | [diff] [blame] | 314 | -PrepositoryId=<repository-id> -Dorg.gradle.parallel=false |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 315 | ``` |
| 316 | |
| 317 | Releasing on Maven Central |
| 318 | -------------------------- |
| 319 | Once all of the artifacts have been pushed to the staging repository, the |
| 320 | repository must first be `closed`, which will trigger several sanity checks |
| 321 | on the repository. If this completes successfully, the repository can then |
| 322 | be `released`, which will begin the process of pushing the new artifacts to |
| 323 | Maven Central (the staging repository will be destroyed in the process). You can |
| 324 | see the complete process for releasing to Maven Central on the [OSSRH site] |
| 325 | (http://central.sonatype.org/pages/releasing-the-deployment.html). |
| 326 | |
| Eric Anderson | f25f55a | 2016-08-04 13:51:20 -0700 | [diff] [blame] | 327 | Update README.md |
| 328 | ---------------- |
| 329 | After waiting ~1 day and verifying that the release appears on [Maven Central] |
| 330 | (http://mvnrepository.com/), cherry-pick the commit that updated the README into |
| 331 | the master branch and go through review process. |
| 332 | |
| 333 | ``` |
| 334 | $ git checkout -b bump-readme master |
| 335 | $ git cherry-pick v$MAJOR.$MINOR.$PATCH^ |
| 336 | ``` |
| 337 | |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 338 | Notify the Community |
| 339 | -------------------- |
| Eric Anderson | f25f55a | 2016-08-04 13:51:20 -0700 | [diff] [blame] | 340 | Finally, document and publicize the release. |
| nmittler | 483738e | 2015-06-08 14:32:37 -0700 | [diff] [blame] | 341 | |
| 342 | 1. Add [Release Notes](https://github.com/grpc/grpc-java/releases) for the new tag. |
| 343 | The description should include any major fixes or features since the last release. |
| 344 | You may choose to add links to bugs, PRs, or commits if appropriate. |
| 345 | 2. Post a release announcement to [grpc-io](https://groups.google.com/forum/#!forum/grpc-io) |
| 346 | (`grpc-io@googlegroups.com`). The title should be something that clearly identifies |
| 347 | the release (e.g.`GRPC-Java <tag> Released`). |
| Eric Anderson | e64c755 | 2016-02-03 14:14:13 -0800 | [diff] [blame] | 348 | |
| Eric Anderson | e64c755 | 2016-02-03 14:14:13 -0800 | [diff] [blame] | 349 | Update Hosted Javadoc |
| 350 | --------------------- |
| 351 | |
| Eric Anderson | 27d8489 | 2016-03-10 16:28:35 -0800 | [diff] [blame] | 352 | Now we need to update gh-pages with the new Javadoc: |
| Eric Anderson | e64c755 | 2016-02-03 14:14:13 -0800 | [diff] [blame] | 353 | |
| 354 | ```bash |
| 355 | git checkout gh-pages |
| 356 | rm -r javadoc/ |
| Eric Anderson | 27d8489 | 2016-03-10 16:28:35 -0800 | [diff] [blame] | 357 | wget -O grpc-all-javadoc.jar "http://search.maven.org/remotecontent?filepath=io/grpc/grpc-all/$MAJOR.$MINOR.$PATCH/grpc-all-$MAJOR.$MINOR.$PATCH-javadoc.jar" |
| 358 | unzip -d javadoc grpc-all-javadoc.jar |
| 359 | rm grpc-all-javadoc.jar |
| Eric Anderson | e64c755 | 2016-02-03 14:14:13 -0800 | [diff] [blame] | 360 | rm -r javadoc/META-INF/ |
| 361 | git add -A javadoc |
| Eric Anderson | 27d8489 | 2016-03-10 16:28:35 -0800 | [diff] [blame] | 362 | git commit -m "Javadoc for $MAJOR.$MINOR.$PATCH" |
| Eric Anderson | e64c755 | 2016-02-03 14:14:13 -0800 | [diff] [blame] | 363 | ``` |
| 364 | |
| 365 | Push gh-pages to the main repository and verify the current version is [live |
| 366 | on grpc.io](http://www.grpc.io/grpc-java/javadoc/). |