---
layout: doc_page
---
<!--
    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 For Java Components 
__NOTES:__

* This process covers major and minor releases only. Bug-fix releases, which increment the third digit, are performed on a A.B.X branch and not on master, but otherwise are similar.
* Some of these operations can be performed either on the Command-Line or in your IDE, whatever you prefer.

## Preparation

### Check for Code Completeness
* Confirm that all __temporary__ branches are checked into master and/or deleted, both local and remote.
* Confirm any new bug fixes have corresponding tests
* At major version releases, search for deprecated code and remove at __Major Versions__ only.
    * `find . -name "*.java" -type f -print | xargs grep -i -n -s -A0 "deprecated"`
    * **Note:** When first marking a segment of code deprecated, please add the current version number. This will make it easier to know when to remove the deprecated code.

### Check Maven Plugin, Dependency, Property Versions of the POM:
* `mvn versions:display-plugin-updates`
* `mvn versions:display-dependency-updates`
* `mvn versions:display-property-updates`
* `mvn clean -Papache-release`

### Visual Checks for Correctness
* LICENSE
* NOTICE -- check for copyright dates
* README.md
* .asf.yaml
* .travis.yml (if used)
* .gitattributes -- used to exclude files from release zip, assumes .gitignore
* .github/workflows
* .gitignore -- used to exclude files from origin
* pom.xml / apache-rat-plugin config -- checks for license headers, assumes .gitignore
* pom.xml

### Run Maven Tests
* `mvn apache-rat:check`
* `mvn clean test`
* `mvn clean test -P strict`
* `mvn clean test -P check-cpp-files`
* `mvn clean javadoc:javadoc`
* `mvn clean install -DskipTests=true`

* Check that the /target/ directory has 5 jars: (may need to refresh)
    * datasketches-\<component\>-SNAPSHOT-javadoc.jar
    * datasketches-\<component\>-SNAPSHOT-sources.jar
    * datasketches-\<component\>-SNAPSHOT-test-sources.jar
    * datasketches-\<component\>-SNAPSHOT-tests.jar
    * datasketches-\<component\>-SNAPSHOT.jar
* Check your local Maven local repository
    * _~/.m2/repository/org/apache/datasketches/datasketches-\<component\>/A.B.0-SNAPSHOT/_ 
    * It should have 5 new jars and a .pom file. 

### Run IDE Checks
* Run Code Coverage > 90%
* SpotBugs checks (is it properly configured?)
* Checkstyle (is it properly configured?)

## Create Permanent Release Branch & Update POM Version

### Make sure GPG-Agent is running and GitHub is clean
* From Command Line at Component root:
    * `eval $(gpg-agent --daemon)`
        * if it is not running it will start it.
        * if it is already running you will see something like:
        * `gpg-agent: a gpg-agent is already running - not starting a new one`  

    * Confirm GitHub repository is current and git status is clean:
        * `git status` # should return:
        * "On branch master, your branch is up to date with 'origin/master', nothing to commit, working tree clean."
     
### Create New Release Branch
* Assume current master POM version = A.B.0-SNAPSHOT
* Create new __Permanent Branch__: "A.B.X"
    * Note: This assumes a normal progression of release numbers. However, when moving to a new major release the current A.B.0-SNAPSHOT will be followed by a new __Permanent Branch__: A'.0.X, where A' = A + 1.

### Edit Release Branch POM Version to Target Release Version 
* Switch to new Release Branch
* Edit pom.xml version to A.B.0 (remove -SNAPSHOT, do not change A or B) in case of normal progression, or A'.0.0 in the case of a new major release.
* Commit the change. __DO NOT PUSH!__
* Create Annotated TAG for this commit: A.B.0-RC1 (or RCn) or A'.0.0-RC1
* Write down the Git hash : example: 40c6f4f (you will need it later)
* __Now Push__ Branch  "A.B.X" with edited pom.xml to origin __NEVER MERGE THIS PERMANENT BRANCH INTO MASTER__
* Do explicit push of tags on new branch A.B.X (or A'.0.X) to origin:
    * `git push origin --tags`

### Confirm new Release Branch, Tag and Git hash
* From a web browser at origin web site: github.com/apache/datasketches-\<component\>
    * Select the A.B.X branch or A'.0.X
    * Confirm that the tag: A.B.0-RC1 (or A'.0.0-RC1) exists and that the tag is on the latest commit and with the correct Git hash.
    * __DO NOT CREATE PR OR MERGE THIS PERMANENT BRANCH INTO MASTER__
* From IDE or Command Line:
    * Confirm that the tag A.B.0-RC1 and the branch A.B.X, (or A'.0.0-RC1 and the branch A'.0.X) and HEAD coincide with the correct Git hash.
    * Confirm that there are no unstaged or staged changes.
    * Return to master branch

### Edit Master Branch with the SNAPSHOT Version of the Next Release
* Edit master pom.xml to A'.B'.0-SNAPSHOT where A' or B' will be incremented by 1. (Bug fix releases will change the 3rd digit)
* Commit and Push this change to origin/master with the comment "Release Process: Change pom version to A'.B'.0-SNAPSHOT."
    * This may require changing to a temparary branch and creating a PR to be approved if master branch is restricted. 
* Create a tag A'.B'.0-SNAPSHOT on master at the HEAD.
* Push the tag to origin: `git push origin --tags`
* Return to release branch A.B.X (or A'.0.X)
* You may minimize your IDE, pointing at the release branch.

## Push Candidate Release to *dist/dev*

### If Absent, Create Local *dist/dev* directories on your system
* On your system create the two directory structures that mirror the dist.apache.org/repos/ directories:
    * `mkdir dist/dev/datasketches/`
    * `mkdir dist/release/datasketches/`

### Checkout the *dist/dev* directory 
* Open a terminal in the dist/dev/datasketches directory and do a checkout:
    * `svn co https://dist.apache.org/repos/dist/dev/datasketches/ .`      #Note the DOT
    * `svn status`    # make sure it is clean: does not list any (?) or (!) files

### Create & Push Zip Files & Signatures/Hashes to *dist/dev*
* You will need the following arguments:
  * Absolute path of target project.basedir on your system
  * Project.artifactId : datasketches-\<component\> where component is e.g., java, pig, hive,...
  * GitHub Tag: A.B.0-RC1 (or RCn)
  * Have your GPG passphrase handy -- you may have only a few seconds to enter it!
* Start a new terminal in the above *dist/dev/datasketches/scripts* directory on your system:
  * Confirm *gpg-agent* is running:
      * `eval $(gpg-agent --daemon)`
          * if it is not running it will start it
          * if it is already running you will see something like:
          * `gpg-agent: a gpg-agent is already running - not starting a new one`  
  * Run something like this (you need to copy & edit):
    * `./bashDeployToDist.sh /Users/<name>/dev/git/Apache/datasketches-<component> datasketches-<component> A.B.0-RC1`
    * Follow the instructions.
    * NOTE: if you get the error "gpg: signing failed: No pinentry":
        * open .gnupg/gpg-agent.conf
        * change to: pinentry-program */usr/local/bin/pinentry-tty*
        * reload the gpg agent in the terminal: `gpg-connect-agent reloadagent /bye` 
        * restart the *./bashDeployToDist* script
    * Close the terminal

### Check Primary Zip Files & Signatures/Hashes
* Check this web URL ~ *https://dist.apache.org/repos/dist/dev/datasketches/\<component\>/A.B.0-RC1/*
    * There should be 3 files: \*-src.zip, \*-src.zip.asc, \*-src.zip.sha512
    * Copy the URL for later.

## Java Only: Push Jars to Nexus (Maven Central) Staging
* Return to original terminal at the project.basedir, still in the A.B.X branch.
* If starting new terminal make sure GPG is running:
  * Confirm *gpg-agent* is running:
      * `eval $(gpg-agent --daemon)`
          * if it is not running it will start it
          * if it is already running you will see something like:
          * `gpg-agent: a gpg-agent is already running - not starting a new one`  
* `git status` # make sure you are still on the release branch: A.B.X

### TRIAL-RUN:
* **Have your GPG passphrase handy -- you may have only a few seconds to enter it!**
* `mvn clean install -Pnexus-jars -DskipTests=true`
    * Check target/ that jars & pom have .asc signatures

### DEPLOY
* **Have your GPG passphrase handy -- you may have only a few seconds to enter it, but it may be automatic!**
* `mvn clean deploy -Pnexus-jars -DskipTests=true`

### DEPLOY-CHECK
* Login to [repository.apache.org](https://repository.apache.org/) / Staging Repositories for orgapachedatasketches-XXXX
* Click __Content__ and search to the end.  Each jar & pom should have .asc, .md5, .sha1 signatures

### CLOSE (Very Important)
* [CLOSE] the Staging Repository with a comment: "\<component\> A.B.0"

### CHECK CLOSE
* Confirm its existance under Repositories/Staging web-site URL (in the summary window)
* Grab its URL while there. You will need it for the Vote Letter.

### CHECK Local Maven Repo
* Check your local Maven repository
    * _~/.m2/repository/org/apache/datasketches/datasketches-\<component\>/A.B.0/_ 
    * It should have 5 new jars and a .pom file each with .asc, .md5, and .sha1 signatures

### Create Copy of External Artifact Distributions
#### JAVA ONLY
* Place copies of the artifact jars deployed to Nexus under a "maven" directory.  For example see <https://dist.apache.org/repos/dist/dev/datasketches/memory/1.3.0-RC1/>
* Note that the `jar` files with their `asc`, `md5` and `sha1` signature are all together in the .md2 archive 
* Add a `maven` directory under the `dist/dev/datasketches/<component>/A.B.0/`
* Bulk copy the `jar, asc, md5` and `sha1` files into the `maven` directory.
* `svn status` # check to see if it is ready to add
* `svn add . --force`
* `svn ci -m "add nexus jars to dist/dev/datasketches"`

#### NON-JAVA
* For external artifacts such as Python or Docker the subdirectory name should be relevant to the type.
* These must be signed with GPG (.asc) and SHA512 (.sha512)

## Prepare & Send [VOTE] Letter to dev@
* See VoteTemplates directory for a recent example
* If vote is not successful, fix the problem and repeat above steps.
* After a successful vote return to __this point__ and continue ...

## Prepare & Send [VOTE-RESULT] Letter to dev@
* See VoteTemplates directory for a recent example
* Declare that the vote is closed.
* Summarize vote results

## If Successful, Finalize the Release

### Copy files from *dist/dev* to *dist/release*
* In local *dist/__dev__/datasketches/*
    * Open Terminal #1
        * Confirm you are in the `/dev/` directory: `pwd`
        * Perform SVN Checkout:
            * `svn co https://dist.apache.org/repos/dist/dev/datasketches/ .`  #note dot at end
            * `svn status` #make sure checkout is clean: does not list any (?) or (!) files
* In local *dist/__release__/datasketches/*
    * Open Terminal #2
        * Confirm you are in the `/release/` directory: `pwd`
        * Perform SVN Checkout:
            * `svn co https://dist.apache.org/repos/dist/release/datasketches/ .` #note dot at end
            * `svn status` #make sure checkout is clean: does not list any (?) or (!) files
        * Create new version directory under appropriate component directory:
            * `mkdir -p <component>/A.B.0`
    * Using local file system copy files 
        * From  ... /dist/dev/datasketches/\<component\>/version-RCnn/*
        * To    ... /dist/release/datasketches/\<component\>/version (no RCnn)/*
        * Make sure to move External Artifact Distributions *dist/dev* to *dist/release*
    * Using Terminal #2 at ... /dist/release/datasketches directory:
        * `svn add . --force`
        * `svn ci -m "Release A.B.0"`
        * Remove the prior release...
        * `svn remove <component>/X.Y.0`
        * `svn ci -m "Remove Prior release"`
        * `svn status` # should be empty
    * Using local file system
        * Delete the prior X.Y.0 directory if necessary.

### Java Only: Release Jars on Nexus Staging
* On Nexus [repository.apache.org](https://repository.apache.org/) click on Staging Repositories
* Select "orgapachedatasketches-XXXX" (If more than one make sure you select the right one!)
* At the top of the window, select "Release"
* Confirm that the attributes have moved to the "Releases" repository under "Repositories"
    * Browse to *Releases/org/apache/datasketches/...*

### Java Only: Drop any previous Release Candidates that were not used.
* On Nexus [repository.apache.org](https://repository.apache.org/) click on Staging Repositories
* Select "orgapachedatasketches-XXXX" (If more than one make sure you select the right one!)
* At the top of the window, select "Drop"

### If necessary, update branch *master* from branch *A.B.X*
If you have gone through more than one Release Candidate, you may have changes that need to be 
reflected in the master. Use the **git cherry-pick** command for this.  

## Finalize Release Documentation

### Update Apache Reporter
* Because of the commit to the `dist/release` branch, you should get an automated email requesting you to update the Apache DataBase about the releaase. The email should point you to the [Apache Committee Report Helper](https://reporter.apache.org/addrelease.html?datasketches). You can choose to go there directly without waiting for the notice, there is only one box to fillout.
* Update the full name of the component release. For example: `Apache datasketches-memory-1.3.0`

### Create & Document Release Tag on GitHub
* Open your IDE and switch to the recently created Release Branch A.B.X
* Find the recently created A.B.0-RCn tag in that branch
* At that same GitHub ID hash, create a new tag A.B.0 (without the RCn).
* From the Command Line: Push the new tag to origin:
    * `git push origin --tags`
* On the GitHub component site document the release 

### Update Website Downloads.md "Latest Source Zip Files" Table
* This script assumes that the remote *.../dist/release/datasketches/...* directories are up-to-date with no old releases.  
* Start a new terminal in the *../dist/dev/datasketches/scripts* directory on your system:
* Make sure your local website directory is pointing to master and up-to-date. 
* Run the following with the argument specifying the location of your local website directory:
    * `./createDownloadsInclude.sh /Users/<name>/ ... /datasketches-website`
* When this is done, be sure to commit the changes to the website.

### Update Website Documentation (if new functionality)

### Prepare Announce Letter to dev@
* ASF requests that you wait 24 hours to publish Announce letter to allow the propagation to mirrors.
* Use recent template
* Summarize vote results

## Update These Instructions
* If you have updated this file or any of the scripts, please update this file on the [website](https://datasketches.apache.org/docs/Community/ReleaseProcessForJavaComponents.html) and dist/dev/datasketches for the scripts.
