[CALCITE-3493] Update docker script to use gradle
diff --git a/docker-compose.yml b/docker-compose.yml
index e5a1013..ef95550 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -16,52 +16,47 @@
 version: '3'
 services:
   dry-run:
-    image: maven
+    image: gradle:5.6-jdk
     working_dir: /src
     command: sh -c "./docker.sh dry-run"
+    network_mode: "host"
     volumes:
       - .:/src
-      - maven-repo:/root/.m2
-
-  release:
-    image: maven
-    working_dir: /src
-    command: sh -c "./docker.sh release"
-    volumes:
-      - .:/src
-      - maven-repo:/root/.m2
-
-  clean:
-    image: maven
-    working_dir: /src
-    command: sh -c "./docker.sh clean"
-    volumes:
-      - .:/src
-      - maven-repo:/root/.m2
+      - gradle-cache:/home/gradle/.gradle
 
   publish-release-for-voting:
-    image: maven
+    image: gradle:5.6-jdk
     working_dir: /src
     command: sh -c "./docker.sh publish-release-for-voting"
     volumes:
       - .:/src
+      - gradle-cache:/home/gradle/.gradle
+
+  clean:
+    image: gradle:5.6-jdk
+    working_dir: /src
+    command: sh -c "./docker.sh clean"
+    volumes:
+      - .:/src
+      - gradle-cache:/home/gradle/.gradle
 
   promote-release:
-    image: maven
+    image: gradle:5.6-jdk
     working_dir: /src
     command: sh -c "./docker.sh promote-release"
     volumes:
       - .:/src
+      - gradle-cache:/home/gradle/.gradle
 
   test:
-    image: maven
+    image: gradle:5.6-jdk
     working_dir: /src
     command: sh -c "./docker.sh test"
     volumes:
       - .:/src
-      - maven-repo:/root/.m2
+      - gradle-cache:/home/gradle/.gradle
 
 volumes:
-  maven-repo:
+  gradle-cache:
 
 # End docker-compose.yml
diff --git a/docker.sh b/docker.sh
index fa1f97e..be033b7 100755
--- a/docker.sh
+++ b/docker.sh
@@ -17,11 +17,6 @@
 
 set -e
 
-GITBOX_URL=https://gitbox.apache.org/repos/asf/calcite-avatica.git
-RELEASE_REPO=https://dist.apache.org/repos/dist/release/calcite/
-DEV_REPO=https://dist.apache.org/repos/dist/dev/calcite/
-PRODUCT=apache-calcite-avatica
-
 function terminate() {
     printf "\n\nUser terminated build. Exiting...\n"
     exit 1
@@ -29,10 +24,19 @@
 
 trap terminate SIGINT
 
+PRODUCT=apache-calcite-avatica
+RELEASE_REPO=https://dist.apache.org/repos/dist/release/calcite/
+DEV_REPO=https://dist.apache.org/repos/dist/dev/calcite/
+
 KEYS=()
 
 GPG_COMMAND="gpg"
 
+install_gnupg2(){
+  apt update
+  apt install gnupg2 -y
+}
+
 get_gpg_keys(){
     GPG_KEYS=$($GPG_COMMAND --list-keys --with-colons --keyid-format LONG)
 
@@ -148,9 +152,7 @@
     done
 }
 
-RELEASE_VERSION=""
 RC_NUMBER=""
-DEV_VERSION=""
 ASF_USERNAME=""
 ASF_PASSWORD=""
 NAME=""
@@ -158,14 +160,11 @@
 get_dry_run_build_configuration(){
 
     while $DRY_RUN_NOT_CONFIRMED; do
-        read -p "Enter the version number to be released (example: 1.12.0): " RELEASE_VERSION
         read -p "Enter the release candidate number (example: if you are releasing rc0, enter 0): " RC_NUMBER
-        read -p "Enter the development version number (example: if your release version is 1.12.0, enter 1.13.0): " DEV_VERSION
         read -p "Enter your ASF username: " ASF_USERNAME
         read -p "Enter your name (this will be used for git commits): " NAME
         echo "Build configured as follows:"
-        echo "Release: $RELEASE_VERSION-rc$RC_NUMBER"
-        echo "Next development version: $DEV_VERSION-SNAPSHOT"
+        echo "RC: $RC_NUMBER"
         echo "ASF Username: $ASF_USERNAME"
         echo "Name: $NAME"
 
@@ -187,13 +186,10 @@
 get_build_configuration(){
 
     while $BUILD_NOT_CONFIRMED; do
-        read -p "Enter the version number to be released (example: 1.12.0): " RELEASE_VERSION
         read -p "Enter the release candidate number (example: if you are releasing rc0, enter 0): " RC_NUMBER
-        read -p "Enter the development version number (example: if your release version is 1.12.0, enter 1.13.0): " DEV_VERSION
         read -p "Enter your name (this will be used for git commits): " NAME
         echo "Build configured as follows:"
-        echo "Release: $RELEASE_VERSION-rc$RC_NUMBER"
-        echo "Next development version: $DEV_VERSION-SNAPSHOT"
+        echo "RC: $RC_NUMBER"
         echo "Name: $NAME"
 
         INVALID_CONFIRMATION=true
@@ -233,184 +229,6 @@
     done
 }
 
-set_git_credentials(){
-    echo https://$ASF_USERNAME:$ASF_PASSWORD@gitbox.apache.org >> /root/.git-credentials
-    git config --global credential.helper 'store --file=/root/.git-credentials'
-
-    git config --global user.name "$NAME"
-}
-
-set_maven_credentials(){
-    mkdir -p /root/.m2
-    rm -f /root/.m2/settings.xml
-    rm -f /root/.m2/settings-security.xml
-
-    ENCRYPTED_MAVEN_PASSWORD="$(mvn --encrypt-master-password $ASF_PASSWORD)"
-
-    cat <<EOF >> /root/.m2/settings-security.xml
-<settingsSecurity>
-  <master>$ENCRYPTED_MAVEN_PASSWORD</master>
-</settingsSecurity>
-EOF
-
-    ENCRYPTED_ASF_PASSWORD="$(mvn --encrypt-password $ASF_PASSWORD)"
-
-    cat <<EOF >> /root/.m2/settings.xml
-<settings>
-  <servers>
-    <server>
-      <id>apache.snapshots.https</id>
-      <username>${ASF_USERNAME}</username>
-      <password>${ENCRYPTED_ASF_PASSWORD}</password>
-    </server>
-    <server>
-      <id>apache.releases.https</id>
-      <username>${ASF_USERNAME}</username>
-      <password>${ENCRYPTED_ASF_PASSWORD}</password>
-    </server>
-  </servers>
-</settings>
-EOF
-}
-
-publish_release_for_voting(){
-
-    LATEST_TAG=$(git describe --tags `git rev-list --tags --max-count=1`)
-
-    if [[ ! $LATEST_TAG =~ .+-rc[[:digit:]]+$ ]]; then
-        echo "The latest tag ($LATEST_TAG) is not a RC release and should not be published for voting."
-        exit 1
-    fi
-
-    TAG_WITHOUT_PRODUCT=$(echo $LATEST_TAG | sed -e 's/avatica-//')
-    TAG_WITHOUT_RC=$(echo $TAG_WITHOUT_PRODUCT | sed -e 's/-rc[0-9][0-9]*//')
-    SOURCE_RELEASE=$PRODUCT-$TAG_WITHOUT_RC-src.tar.gz
-    GPG_SIGNATURE=$PRODUCT-$TAG_WITHOUT_RC-src.tar.gz.asc
-    SHA512=$PRODUCT-$TAG_WITHOUT_RC-src.tar.gz.sha512
-    GPG_SHA512=$PRODUCT-$TAG_WITHOUT_RC-src.tar.gz.asc.sha512
-    COMMIT=$(git rev-list -n 1 $LATEST_TAG)
-
-    # Check to see a release is built
-    MISSING_FILES=false
-
-    if [ ! -f "target/$SOURCE_RELEASE" ]; then
-        echo "Did not find source release ($SOURCE_RELEASE) in target folder."
-        MISSING_FILES=true
-    fi
-
-    if [ ! -f "target/$GPG_SIGNATURE" ]; then
-        echo "Did not find GPG signature ($GPG_SIGNATURE) in target folder."
-        MISSING_FILES=true
-    fi
-
-    if [ ! -f "target/$SHA512" ]; then
-        echo "Did not find SHA512 ($SHA512) in target folder."
-        MISSING_FILES=true
-    fi
-
-    if [ ! -f "target/$GPG_SHA512" ]; then
-        echo "Did not find GPG SHA512 ($GPG_SHA512) in target folder."
-        MISSING_FILES=true
-    fi
-
-    if $MISSING_FILES == true; then
-        exit 1
-    fi
-
-    while $NOT_CONFIRMED; do
-        echo "Publish configured as follows:"
-        echo "Release: $LATEST_TAG"
-
-        INVALID_CONFIRMATION=true
-
-        while $INVALID_CONFIRMATION; do
-            read -p "Is this correct? (y/n) " CONFIRM
-
-            if [[ ($CONFIRM == "Y") || ($CONFIRM == "y") ]]; then
-                NOT_CONFIRMED=false
-                INVALID_CONFIRMATION=false
-            elif [[ ($CONFIRM == "N") || ($CONFIRM == "n") ]]; then
-                INVALID_CONFIRMATION=false
-            fi
-        done
-    done
-
-    HASH=$(cat "target/$SHA512" | tr -d '\n')
-
-    get_asf_credentials
-
-    svn checkout $DEV_REPO /tmp/calcite --depth empty
-    mkdir -p /tmp/calcite/$PRODUCT-$TAG_WITHOUT_PRODUCT
-    cp -R target/$PRODUCT-* /tmp/calcite/$PRODUCT-$TAG_WITHOUT_PRODUCT
-
-    cd /tmp/calcite
-    svn add $PRODUCT-$TAG_WITHOUT_PRODUCT
-    chmod -x $PRODUCT-$TAG_WITHOUT_PRODUCT/*
-
-    svn commit -m "$PRODUCT-$TAG_WITHOUT_PRODUCT" --force-log --username $ASF_USERNAME --password $ASF_PASSWORD
-
-    [[ $LATEST_TAG =~ -rc([[:digit:]]+)$ ]]
-    RC_NUMBER=${BASH_REMATCH[1]}
-
-    [[ $TAG_WITHOUT_RC =~ ([[:digit:]]+\.[[:digit:]]+)\.[[:digit:]]+$ ]]
-    BRANCH_VERSION=${BASH_REMATCH[1]}
-
-    read -p "Please enter your first name for the voting email: " FIRST_NAME
-    read -p "Enter the ID at the end of the staged repository (for orgapachecalcite-1000, enter 1000): " STAGED_REPO_ID
-
-    echo "The release $PRODUCT-$TAG_WITHOUT_PRODUCT has been uploaded to the development repository."
-    printf "\n"
-    printf "\n"
-    echo "Email the following message to dev@calcite.apache.org. Please check the message before sending."
-    printf "\n"
-    echo "To: dev@calcite.apache.org"
-    echo "Subject: [VOTE] Release $PRODUCT-$TAG_WITHOUT_RC (release candidate $RC_NUMBER)"
-    echo "Message:
-Hi all,
-
-I have created a build for Apache Calcite Avatica $TAG_WITHOUT_RC, release candidate $RC_NUMBER.
-
-Thanks to everyone who has contributed to this release.
-
-You can read the release notes here:
-https://github.com/apache/calcite-avatica/blob/branch-avatica-$BRANCH_VERSION/site/_docs/history.md
-
-The commit to be voted upon:
-https://gitbox.apache.org/repos/asf?p=calcite-avatica.git;a=commit;h=$COMMIT
-
-Its hash is $COMMIT
-
-The artifacts to be voted on are located here:
-$DEV_REPO$PRODUCT-$TAG_WITHOUT_PRODUCT/
-
-The hashes of the artifacts are as follows:
-src.tar.gz.sha512 $HASH
-
-A staged Maven repository is available for review at:
-https://repository.apache.org/content/repositories/orgapachecalcite-$STAGED_REPO_ID
-
-Release artifacts are signed with the following key:
-https://people.apache.org/keys/committer/$ASF_USERNAME.asc
-
-If you do not have a Java environment available, you can run the tests using docker. To do so, install docker and docker-compose, then run \"docker-compose run test\" from the root of the directory.
-
-Please vote on releasing this package as Apache Calcite Avatica $TAG_WITHOUT_RC.
-
-The vote is open for the next 72 hours and passes if a majority of at least three +1 PMC votes are cast.
-
-[ ] +1 Release this package as Apache Calcite 1.14.0
-[ ]  0 I don't feel strongly about it, but I'm okay with the release
-[ ] -1 Do not release this package because...
-
-
-Here is my vote:
-
-+1 (binding)
-
-$FIRST_NAME
-"
-}
-
 promote_release(){
 
     LATEST_TAG=$(git describe --tags `git rev-list --tags --max-count=1`)
@@ -422,6 +240,7 @@
 
     TAG_WITHOUT_PRODUCT=$(echo $LATEST_TAG | sed -e 's/avatica-//')
     TAG_WITHOUT_RC=$(echo $TAG_WITHOUT_PRODUCT | sed -e 's/-rc[0-9][0-9]*//')
+    RC_NUMBER=$(echo $TAG_WITHOUT_PRODUCT | sed -e 's/^[0-9\.]*-rc//')
 
     if ! svn ls $DEV_REPO/$PRODUCT-$TAG_WITHOUT_PRODUCT; then
         echo "The release $PRODUCT-$TAG_WITHOUT_PRODUCT was not found in the dev repository. Was it uploaded for voting?"
@@ -429,30 +248,7 @@
     fi
 
     get_asf_credentials
-
-    set_git_credentials
-
-    # Tag release and push it
-    git tag rel/avatica-$TAG_WITHOUT_RC $LATEST_TAG
-    git push $GITBOX_URL rel/avatica-$TAG_WITHOUT_RC
-
-    # Merge release branch back to master and push
-    [[ $TAG_WITHOUT_RC =~ ([[:digit:]]+\.[[:digit:]]+)\.[[:digit:]]+$ ]]
-    BRANCH_VERSION=${BASH_REMATCH[1]}
-    git checkout master
-    git merge branch-avatica-$BRANCH_VERSION --ff-only
-    git push $GITBOX_URL master
-
-    svn checkout $RELEASE_REPO /tmp/release
-    rm -rf /tmp/release/$PRODUCT-$TAG_WITHOUT_RC
-    mkdir -p /tmp/release/$PRODUCT-$TAG_WITHOUT_RC
-
-    svn checkout $DEV_REPO/$PRODUCT-$TAG_WITHOUT_PRODUCT /tmp/rc
-    cp -rp /tmp/rc/* /tmp/release/$PRODUCT-$TAG_WITHOUT_RC
-
-    cd /tmp/release
-
-    svn add $PRODUCT-$TAG_WITHOUT_RC
+    gradle publishDist -Pasf -PasfSvnUsername=$ASF_USERNAME -PasfSvnPassword=$ASF_PASSWORD -PasfNexusUsername=$ASF_USERNAME -PasfNexusPassword=$ASF_PASSWORD -PasfGitSourceUsername=$ASF_USERNAME -PasfGitSourcePassword=$ASF_PASSWORD -Prc=$RC_NUMBER
 
     # If there is more than 1 release, delete all of them, except for the newest one
     # To do this, we do the following:
@@ -481,31 +277,26 @@
 
 case $1 in
     dry-run)
+        install_gnupg2
         mount_gpg_keys
         select_gpg_key
         get_dry_run_build_configuration
 
-        mvn -Dmaven.artifact.threads=20 -DdryRun=true -DreleaseVersion=$RELEASE_VERSION -DdevelopmentVersion=$DEV_VERSION-SNAPSHOT -Dtag="avatica-$RELEASE_VERSION-rc$RC_NUMBER" -Papache-release -Duser.name=$ASF_USERNAME release:prepare -Darguments=-Dgpg.keyname=$SELECTED_GPG_KEY
+        gradle prepareVote -PasfTestSvnUsername=test -PasfTestSvnPassword=test -PasfTestNexusUsername=test -PasfTestNexusPassword=test -PasfTestGitSourceUsername=test -PasfTestGitSourcePassword=test -Prc=$RC_NUMBER -PuseGpgCmd -Psigning.gnupg.keyName=$SELECTED_GPG_KEY
         ;;
 
-    release)
+    publish-release-for-voting)
+        install_gnupg2
         mount_gpg_keys
         select_gpg_key
         get_build_configuration
         get_asf_credentials
-        set_git_credentials
-        set_maven_credentials
 
-        mvn -Dmaven.artifact.threads=20 -DreleaseVersion=$RELEASE_VERSION -DdevelopmentVersion=$DEV_VERSION-SNAPSHOT -Dtag="avatica-$RELEASE_VERSION-rc$RC_NUMBER" -Papache-release -Duser.name=$ASF_USERNAME release:prepare -Darguments=-Dgpg.keyname=$SELECTED_GPG_KEY
-        mvn -Dmaven.artifact.threads=20 -Papache-release -Duser.name=$ASF_USERNAME release:perform -Darguments="-DskipTests -Dgpg.keyname=$SELECTED_GPG_KEY"
+        gradle prepareVote -Pasf -PasfCommitterId=$ASF_USERNAME -PasfSvnUsername=$ASF_USERNAME -PasfSvnPassword=$ASF_PASSWORD -PasfNexusUsername=$ASF_USERNAME -PasfNexusPassword=$ASF_PASSWORD -PasfGitSourceUsername=$ASF_USERNAME -PasfGitSourcePassword=$ASF_PASSWORD -Prc=$RC_NUMBER -PuseGpgCmd -Psigning.gnupg.keyName=$SELECTED_GPG_KEY
         ;;
 
     clean)
-        mvn release:clean
-        ;;
-
-    publish-release-for-voting)
-        publish_release_for_voting
+        gradle clean
         ;;
 
     promote-release)
@@ -513,11 +304,11 @@
         ;;
 
     test)
-        mvn clean verify -Dcheckstyle.skip
+        gradle test
         ;;
 
     *)
-       echo $"Usage: $0 {dry-run|release|clean|publish-release-for-voting|promote-release|test}"
+       echo $"Usage: $0 {dry-run|publish-release-for-voting|clean|promote-release|test}"
        ;;
 
 esac
diff --git a/site/_docs/howto.md b/site/_docs/howto.md
index c987662..4867c57 100644
--- a/site/_docs/howto.md
+++ b/site/_docs/howto.md
@@ -240,12 +240,20 @@
 the script will make a copy of the contents and move it to a different location, so that it will not modify the contents of your original
 `~/.gnupg` directory during the build.
 
+* Start the [asflike-release-environment](https://github.com/vlsi/asflike-release-environment) to prepare a staging environment for a dry-run.
+
 {% highlight bash %}
-# On Linux:
+# On Linux (dry-run):
 docker-compose run -v ~/.gnupg:/.gnupg dry-run
 
-# On Windows
+# On Windows (dry-run):
 docker-compose run -v /c/Users/username/AppData/Roaming/gnupg:/.gnupg dry-run
+
+# On Linux (push to ASF servers):
+docker-compose run -v ~/.gnupg:/.gnupg publish-release-for-voting
+
+# On Windows (push to ASF servers):
+docker-compose run -v /c/Users/username/AppData/Roaming/gnupg:/.gnupg publish-release-for-voting
 {% endhighlight %}
 
 ## Checking the artifacts