This is an automated email from the ASF dual-hosted git repository.

volodymyr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/drill.git

commit a944afb8925ca710caa9e590e0bcb4a2d1a66ab5
Author: Volodymyr Vysotskyi <[email protected]>
AuthorDate: Wed Dec 11 13:10:27 2019 +0200

    DRILL-7230: Add README.md with instructions for release and release scripts
    
    closes #1937
---
 docs/dev/Release.md               | 398 ++++++++++++++++++++++++++++++++++++++
 tools/release-scripts/checksum.sh |  52 +++++
 tools/release-scripts/release.sh  | 181 +++++++++++++++++
 tools/verify_release.sh           | 173 -----------------
 4 files changed, 631 insertions(+), 173 deletions(-)

diff --git a/docs/dev/Release.md b/docs/dev/Release.md
new file mode 100644
index 0000000..c08ed39
--- /dev/null
+++ b/docs/dev/Release.md
@@ -0,0 +1,398 @@
+# Drill Release Process
+
+1. ## Setup release final cut-off date
+    1. Start mail thread on Apache Drill dev list.
+
+        Example:
+
+        Subject:
+        ```
+        [DISCUSS] Drill 1.17.0 release
+        ```
+        Body:
+        ```
+        Hi Drillers,
+
+        It's been several months since the last release and it is time to do 
the next one. I am volunteering to be the release manager.
+
+        If there are any issues on which work is in progress, that you feel we 
*must* include in the release, please post in reply to this thread. Based on 
your input we'll define release cut off date.
+
+        Kind regards
+
+        Thanks
+        ```
+    2. Gather a list of Jiras that need to be included in the release, discuss 
possible blockers.
+    3. Identify the final cut-off date.
+    4. Before starting the release send a reminder to the dev list that merge 
into Apache Drill master is forbidden during release.
+
+        Example:
+        ```
+        Note for the committers:
+        until the release is not over and Drill version is not changed to 
1.17.0-SNAPSHOT, please do not push any
+        changes into Drill master.
+        ```
+2. ## Setup environment:
+    1. ### SVN
+        1. Install subversion client (see instructions on 
http://subversion.apache.org/packages.html#osx for
+         installing svn on different systems).
+        2. Check that svn works:
+        ```
+        svn co https://dist.apache.org/repos/dist/release/drill 
~/src/release/drill-dist
+        ```
+        You also need writable access to Apache SVN. (You need to be a PMC 
member for this).
+    2. ### GPG key:
+        You will need a GPG key set up. This key is needed for signing the 
release.
+        1. Read [Apache docs for release 
signing](http://www.apache.org/dev/release-signing.html).
+        2. Install the `gpg2` package on Ubuntu, or `gnupg` on MacOS.
+        3. Generate GPG key using the **Apache email address** if it wasn't 
done before:
+            1. Run `gpg --gen-key` and follow the instructions.
+            2. Remember your passphrase.
+            3. Save your key pair:
+                ```
+               gpg --output mygpgkey_pub.gpg --armor --export MY_KEY_ID
+               gpg --output mygpgkey_sec.gpg --armor --export-secret-key 
MY_KEY_ID
+               ```
+        4. Or import existing GPG key pair if required:
+            ```
+            gpg --import mygpgkey_pub.gpg
+            gpg --allow-secret-key-import --import mygpgkey_sec.gpg
+            ```
+        5. Have another committer signed your key (add to the trust chain).
+            Apache advises to do it at 
+            [key signing 
parties](https://www.apache.org/dev/release-signing.html#key-signing-party).
+        6. Make sure the default key is the key generated using the Apache 
email.
+        7. Publish your public key to a public server (e.g. 
http://pgp.surfnet.nl or http://pgp.mit.edu)
+            using Web-UIs or CLI (for example using the following command:
+            `gpg --keyserver hkp://pool.sks-keyservers.net --trust-model 
always --send-keys`).
+        8. Add your key signature into the the `KEYS` file in the Drill 
sources repo in the project root directory.
+            Instruction on how to create the key signature is embedded at the 
beginning of the `KEYS` file.
+        9. Add your key signature into the the `KEYS` file in 
`https://dist.apache.org` (PMC permissions required for this):
+            1. `svn co https://dist.apache.org/repos/dist/release/drill 
~/src/release/drill-dist`.
+            2. Update `KEYS` file with required changes.
+            3. Commit changes: `svn ci -m "Add FirstName LastName's key to 
KEYS file"`.
+    3. ### Setting up LDAP credentials
+        1. Go to http://id.apache.org and log in using your Apache login and 
password.
+        2. Scroll to the bottom to the 'SSH Key' entry and add the SSH key 
from your `~/.ssh/id_rsa.pub` file.
+            If you don't have the SSH key, you should generate it by running 
`ssh-keygen`.
+        3. Note that you can add more than one SSH key corresponding to 
multiple machines.
+        4. Enter your Apache password and submit the changes.
+        5. Verify that you can do an sftp to the Apache server by running the 
following: `sftp <username>@home.apache.org`.
+    4. ### Setup Maven
+        1. Apache's Maven repository access is documented here:
+            http://www.apache.org/dev/publishing-maven-artifacts.html
+            http://www.apache.org/dev/publishing-maven-artifacts.html#dev-env.
+        2. For deploying Maven artifacts, you must add entries to your 
`~/.m2/settings.xml` file as described here:
+            http://www.apache.org/dev/publishing-maven-artifacts.html#dev-env.
+        3. In order to encrypt the LDAP password, see here:
+            http://maven.apache.org/guides/mini/guide-encryption.html.
+            The encrypted master password should be added to 
`~/.m2/security-settings.xml`.
+        4. Add encrypted password to `settings.xml` and 
`security-settings.xml`:
+            1. run `mvn --encrypt-master-password` and add an encrypted master 
password to `security-settings.xml` file;
+            2. run `mvn --encrypt-password` and add an encrypted Apache LDAP 
password to `settings.xml` file.
+    5. Check that `NOTICE` file in sources has the current copyright year.
+    6. Make sure you are using JDK 8.
+3. ## Manual Release process (this section is more for information how release 
process is performed, release manager should use `automated release process` 
described later).
+    1. Setup GPG Password env variable:
+        ```
+        read -s GPG_PASSPHRASE
+        ```
+    2. Tell GPG how to read a password from your terminal:
+        ```
+        export GPG_TTY=$(tty)
+        ```
+    3. Clean up old release directory and clone a new Drill repository:
+        ```
+        cd ~/src/release && \
+        rm -rf drill/ && \
+        git clone [email protected]:apache/drill.git && \
+        cd drill
+        ```
+    4. Checkout the current release:
+        ```
+        git checkout <git commit>
+        ```
+    5. Make sure build with tests succeeded along with license checks:
+        ```
+        mvn install -Drat.skip=false -Dlicense.skip=false
+        ```
+    6. Enforce memory options:
+        ```
+        MAVEN_OPTS='-Xmx4g -XX:MaxPermSize=512m'
+        ```
+    7. Clear any release history:
+        ```
+        mvn release:clean -Papache-release -DpushChanges=false -DskipTests
+        ```
+    8. Delete outgoing release tag if it exists:
+        ```
+        git push --delete origin drill-1.17.0
+        git tag -d drill-1.17.0
+        ```
+    9. Do the release preparation:
+        ```
+        mvn -X release:prepare -Papache-release -DpushChanges=false 
-DskipTests -Darguments="-Dgpg.passphrase=${GPG_PASSPHRASE}  -DskipTests=true 
-Dmaven.javadoc.skip=false" -DreleaseVersion=1.17.0 
-DdevelopmentVersion=1.18.0-SNAPSHOT -Dtag=drill-1.17.0
+        ```
+    10. Make sure to change Drill version to the proper one.
+    11. Check that `target` folder contains the following files (with the 
correct version number):
+        ```
+        apache-drill-1.17.0-src.tar.gz 
+        apache-drill-1.17.0-src.tar.gz.asc
+        apache-drill-1.17.0-src.tar.gz.sha512
+        apache-drill-1.17.0-src.zip
+        apache-drill-1.17.0-src.zip.asc 
+        apache-drill-1.17.0-src.zip.sha512
+        ```
+    12. Verify signature, ensure that GPG key for Apache was used (see details 
at
+        https://www.apache.org/info/verification.html#CheckingSignatures) and 
checksum
+        (see details at 
https://www.apache.org/info/verification.html#CheckingHashes):
+        ```
+        ./tools/release-scripts/checksum.sh 
target/apache-drill-1.17.0-src.tar.gz
+        ./tools/release-scripts/checksum.sh target/apache-drill-1.17.0-src.zip
+        ./tools/release-scripts/checksum.sh 
distribution/target/apache-drill-1.17.0.tar.gz
+        ```
+    13. You should see 2 new commits on top of the branch, for example:
+        ```
+        [maven-release-plugin] prepare release drill-1.17.0
+        [maven-release-plugin] prepare for next development iteration
+        ```
+        Also, you should see a new `drill-1.17.0` tag.
+        Push the new tag to your personal github repository:
+        ```
+        git push origin drill-1.17.0
+        ```
+    14. Perform the release but do the commits into personal repo
+        (since Apache doesn't allow rollbacks on master if mistakes are made):
+        ```
+        mvn release:perform 
-DconnectionUrl=scm:git:[email protected]:vvysotskyi/drill.git -DskipTests 
-Darguments="-Dgpg.passphrase=${GPG_PASSPHRASE} -DskipTests=true 
-DconnectionUrl=scm:git:[email protected]:vvysotskyi/drill.git"
+        ```
+        If you want to additionally check resulting archives and jars, add 
`-Dmaven.deploy.skip=true` flag to avoid deploying jars to the Nexus repository:
+        ```
+        mvn release:perform 
-DconnectionUrl=scm:git:[email protected]:vvysotskyi/drill.git -DskipTests 
-Darguments="-Dgpg.passphrase=${GPG_PASSPHRASE} -DskipTests=true 
-DconnectionUrl=scm:git:[email protected]:vvysotskyi/drill.git 
-Dmaven.deploy.skip=true"
+        ```
+        After checks are performed, run this command without the flag.
+    15. Deploy the release commit:
+        ```
+        git checkout drill-1.17.0
+        mvn deploy -Papache-release -DskipTests 
-Dgpg.passphrase=${GPG_PASSPHRASE}
+        ```
+    16. Copy release files to a local release staging directory:
+        ```
+        cp 
~/src/release/drill/target/target/checkout/apache-drill-1.17.0-src.tar.gz* 
~/release/1.17.0-rc0/ && \ 
+        cp ~/src/release/drill/target/target/checkout/apache-drill-1.17.0.zip* 
~/release/1.17.0-rc0/ \ 
+        cp 
~/src/release/drill/target/checkout/distribution/target/apache-drill-1.17.0.tar.gz*
 ~/release/1.17.0-rc0/ \ 
+        ```
+    17. Check if the artifacts are signed properly:
+        ```
+        ./tools/release-scripts/checksum.sh 
~/release/1.17.0-rc0/apache-drill-1.17.0-src.tar.gz
+        ./tools/release-scripts/checksum.sh 
~/release/1.17.0-rc0/apache-drill-1.17.0-src.zip
+        ./tools/release-scripts/checksum.sh 
~/release/1.17.0-rc0/apache-drill-1.17.0.tar.gz
+        ```
+    18. Copy release files to a directory on `home.apache.org` for voting:
+        ```
+        scp ~/release/1.17.0-rc0/* 
<username>@home.apache.org:~/public_html/drill/releases/1.17.0/rc0
+        ```
+
+4. ## Automated release process
+    Run the following script:
+    ```
+    tools/release-scripts/release.sh
+    ```
+    The release script will push the maven artifacts to the Maven staging repo.
+5. ## Publish release candidate and vote
+    1. Go to the [Apache Maven staging repo](https://repository.apache.org/) 
and close the new jar release.
+        This step is done in the Maven GUI. For detailed instructions on 
sonatype GUI please refer to 
+        
https://central.sonatype.org/pages/releasing-the-deployment.html#locate-and-examine-your-staging-repository.
+    2. Start vote (vote should last at least 72 hours).
+
+        Email should be sent to the Drill user and dev mailing lists.
+
+        Example:
+
+        Subject:
+        ```
+        [VOTE] Release Apache Drill 1.12.0 - RC0
+        ```
+        Body:
+        ```
+        Hi all,
+
+        I'd like to propose the first release candidate (RC0) of Apache Drill, 
version 1.12.0.
+
+        The release candidate covers a total of 100500 resolved JIRAs [1]. 
Thanks to everyone who contributed to this release.
+
+        The tarball artifacts are hosted at [2] and the maven artifacts are 
hosted at [3].
+
+        This release candidate is based on commit 
54d3d201882ef5bc2e0f754fd10edfead9947b60 located at [4].
+
+        Please download and try out the release.
+
+        The vote ends at 5 PM UTC (9 AM PDT, 7 PM EET, 10:30 PM IST), January 
1, 1970.
+
+        [ ] +1
+        [ ] +0
+        [ ] -1
+
+        Here's my vote: +1
+
+
+        [1] 
https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12313820&version=12341087
+        [2] http://home.apache.org/~arina/drill/releases/1.12.0/rc0/
+        [3] 
https://repository.apache.org/content/repositories/orgapachedrill-1043/
+        [4] https://github.com/arina-ielchiieva/drill/commits/drill-1.12.0
+        ```
+    3. If the vote fails, cancel RC and prepare new RC:
+        1. Send an email with announcing about canceling the vote.
+
+            Example:
+
+            Subject:
+            ```
+            [CANCEL] [VOTE] Release Apache Drill 1.17.0 - RC0
+            ```
+            Body:
+            ```
+            Hi all,
+
+            The vote for Apache Drill 1.17.0 - RC0 was canceled due to
+            [list issues]
+
+            Thanks to all who voted. A new release will be tagged as 1.17.0 - 
RC1 and
+            will be available for voting soon.
+            ```
+        2. Go to the [Apache Maven staging 
repo](https://repository.apache.org/) and drop the jar release.
+        3. Delete the release tag locally and remotely:
+            ```
+            git push --delete origin drill-1.17.0
+            git tag -d drill-1.17.0
+            ```
+    4. If the vote passes, finish the release:
+        1. Count votes (email to the dev mailing list).
+
+            Example:
+
+            Subject:
+            ```
+            [RESULT] [VOTE] Release Apache Drill 1.12.0 RC1
+            ```
+            Body:
+            ```
+            The vote passes. Thanks to everyone who has tested the release 
candidate and given their comments and votes. Final tally:
+
+            3x +1 (binding): Arina, Aman, Parth
+
+            5x +1 (non-binding): Vitalii, Holger, Prasad, Vova, Charles 
+
+            No 0s or -1s.
+
+            I'll start process for pushing the release artifacts and send an 
announcement once propagated.
+
+            Kind regards
+            ```
+        2. Add the release to the 
[dist.apache.org](https://dist.apache.org/repos/dist/release/drill/) and delete 
the old version, keeping two most recent.
+            This can only done by a PMC member:
+            ```
+            svn co https://dist.apache.org/repos/dist/release/drill 
~/src/release/drill-dist
+            cd ~/src/release/drill-dist
+            mkdir drill-1.17.0
+            cp -r ~/release/1.17.0-rc0 drill-1.17.0
+            svn add drill-1.17.0
+            svn commit --message "Upload Apache Drill 1.17.0 release."
+            svn delete 1.15.0
+            svn commit --message "Deleting drill-1.15.0 to keep only last two 
versions"
+            ```
+        3. Go to the [Apache Maven staging 
repo](https://repository.apache.org/) and promote the release to the production.
+        4. Create branch and tag for this release and update Drill version in 
master (if used automated scripts, tag will be like this `drill-1.11.0`. Branch 
should be named as `1.11.0`).
+            Add release description in GitHub [Drill releases 
page](https://github.com/apache/drill/releases):
+            open release tag, press `Edit tag` and add Release title like 
`Apache Drill 1.17.0` and specify release description.
+        5. After new tag is pushed, check that DockerHub triggered job to 
build and publish new image for the release to 
https://hub.docker.com/repository/docker/apache/drill.
+        5. Wait 24 hours, check download mirrors.
+        6. Post release:
+            1. "What's New" for the new release.
+            2. Update Apache JIRA and add release date for this release. Add a 
new release tag if not already there.
+            3. Update Drill Web site:
+                1. Generate release notes for Drill: 
https://confluence.atlassian.com/jira/creating-release-notes-185729647.html
+                    and create a MarkDown file for the release notes - post to 
the site the day of the release.
+                2. Write the blog post and push it out to the Apache Drill 
website so it can be referenced in the announcement.
+                    As an example, may be used [this 
commit](https://github.com/apache/drill/commit/374f55c619f5b7aea5d5161ea21b6e341a682c3f#diff-dfd4d960a68ac8b9a8d6af52c1bcbe4a).
+                3. Update the data in `_data/version.json` - making sure to 
either match your release notes url to the one
+                    below (`docs/apache-drill-1-6-0-release-notes`) or update 
it with the different URL:
+                    ```
+                    {
+                      "display_version": "1.6",
+                      "full_version": "1.6.0",
+                      "release_date": "February 16, 2016",
+                      "blog_post":"/blog/2016/02/16/drill-1.6-released",
+                      "release_notes": 
"https://drill.apache.org/docs/apache-drill-1-6-0-release-notes/";
+                    }
+                    ```
+                    As an example, may be used [this 
commit](https://github.com/apache/drill/commit/374f55c619f5b7aea5d5161ea21b6e341a682c3f#diff-25d705dfbe4caa6041b61ece80270bc1)
+                4. Build and publish JavaDocs to the Drill site:
+                    1. Checkout to the release version: `git checkout 
drill-1.17.0`
+                    2. Run the following command to generate Javadocs in 
`target/site/apidocs` directory:
+                        ```
+                        mvn install javadoc:aggregate -DskipTests
+                        ```
+                    3. Checkout to the `gh-pages` branch where sources for 
site are placed:
+                        ```
+                        git checkout gh-pages
+                        ```
+                    4. Remove JavaDocs for previous version:
+                        ```
+                        rm -rf apidocs
+                        ```
+                    5. Copy new JavaDocs and commit changes:
+                        ```
+                        mv target/site/apidocs .
+                        ```
+                    6. Commit changes with the commit message `Publish 
JavaDocs for the Apache Drill 1.17.0`
+                5. Instructions how to build and deploy Web site may be found 
here:
+                    https://github.com/apache/drill/blob/gh-pages/README.md
+            3. Post the announcement about new release on [Apache Drill 
Twitter](https://twitter.com/apachedrill]).
+            4. A PMC member needs to update the release date for new release 
here:
+                https://reporter.apache.org/addrelease.html?drill
+            5. Send the announcement to the `[email protected]` and 
`[email protected]` mailing lists.
+
+                Example:
+
+                Subject:
+                ```
+                [ANNOUNCE] Apache Drill 1.17.0 Released
+                ```
+                Body:
+                ```
+                On behalf of the Apache Drill community, I am happy to 
announce the release of Apache Drill 1.17.0.
+
+                Drill is an Apache open-source SQL query engine for Big Data 
exploration.
+                Drill is designed from the ground up to support 
high-performance analysis
+                on the semi-structured and rapidly evolving data coming from 
modern Big
+                Data applications, while still providing the familiarity and 
ecosystem of
+                ANSI SQL, the industry-standard query language. Drill provides
+                plug-and-play integration with existing Apache Hive and Apache 
HBase
+                deployments.
+
+                For information about Apache Drill, and to get involved, visit 
the project website [1].
+
+                Total of 200 JIRA's are resolved in this release of Drill with 
following
+                new features and improvements [2]:
+
+                - Hive complex types support (DRILL-7251, DRILL-7252, 
DRILL-7253, DRILL-7254)
+                - ESRI Shapefile (shp) (DRILL-4303) and Excel (DRILL-7177) 
format plugins support
+                - Drill Metastore support (DRILL-7272, DRILL-7273, DRILL-7357)
+                - Upgrade to HADOOP-3.2 (DRILL-6540)
+                - Schema Provision using File / Table Function (DRILL-6835)
+                - Parquet runtime row group pruning (DRILL-7062)
+                - User-Agent UDFs (DRILL-7343)
+                - Canonical Map<K,V> support (DRILL-7096)
+                - Kafka storage plugin improvements (DRILL-6739, DRILL-6723, 
DRILL-7164, DRILL-7290, DRILL-7388)
+
+                For the full list please see release notes [3].
+
+                The binary and source artifacts are available here [4].
+
+                Thanks to everyone in the community who contributed to this 
release!
+
+                1. https://drill.apache.org/
+                2. 
https://drill.apache.org/blog/2019/12/26/drill-1.17-released/
+                3. 
https://drill.apache.org/docs/apache-drill-1-17-0-release-notes/
+                4. https://drill.apache.org/download/
+                ```
diff --git a/tools/release-scripts/checksum.sh 
b/tools/release-scripts/checksum.sh
new file mode 100755
index 0000000..b0c9157
--- /dev/null
+++ b/tools/release-scripts/checksum.sh
@@ -0,0 +1,52 @@
+#!/bin/bash
+#
+# 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.
+#
+
+returnCode=0
+if [ -f $1.md5 ]; then
+    if [ "$(cat $1.md5)" = "$(openssl md5 $1 | cut -d ' ' -f 2)" ]; then
+        echo "md5 present and Ok"
+    else
+        echo "md5 does not match"
+        returnCode=1
+    fi
+fi
+
+if [ -f $1.sha1 ]; then
+    if [ "$(cat $1.sha1)" = "$(openssl sha1 $1 | cut -d ' ' -f 2)" ]; then
+        echo "sha1 present and Ok"
+    else
+        echo "sha1 does not match"
+        returnCode=2
+    fi
+fi
+
+if [ -f $1.sha512 ]; then
+    if [ "$(cat $1.sha512)" = "$(openssl sha1 -sha512 $1 | cut -d ' ' -f 2)" 
]; then
+        echo "sha512 present and Ok"
+    else
+        echo "sha512 does not match"
+        returnCode=3
+    fi
+fi
+
+if [ -f $1.asc ]; then
+    echo "GPG verification output"
+    returnCode=`gpg --verify $1.asc $1`
+fi
+exit $returnCode
diff --git a/tools/release-scripts/release.sh b/tools/release-scripts/release.sh
new file mode 100755
index 0000000..442cf90
--- /dev/null
+++ b/tools/release-scripts/release.sh
@@ -0,0 +1,181 @@
+#!/bin/bash
+#
+# 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.
+#
+
+#!/bin/bash
+set -e
+
+function pause(){
+    read -rsp $'Press any key to continue...\n' -n1 key
+}
+
+function runCmd(){
+    echo " ----------------- "  >> ${DRILL_RELEASE_OUTFILE}
+    echo " ----------------- $1 "
+    echo " ----------------- $1 " >> ${DRILL_RELEASE_OUTFILE}
+    echo " ----------------- "  >> ${DRILL_RELEASE_OUTFILE}
+    shift
+    # run the command, send output to out file
+    "$@" >> ${DRILL_RELEASE_OUTFILE} 2>&1
+    if [ $? -ne 0 ]; then
+        echo FAILED to run $1
+        echo FAILED to run $1 >> ${DRILL_RELEASE_OUTFILE}
+        exit 1
+    fi
+    # Wait for user to verify and continue
+    pause
+}
+
+function copyFiles(){
+    rm -rf ${LOCAL_RELEASE_STAGING_DIR}
+    mkdir -p ${LOCAL_RELEASE_STAGING_DIR}/${DRILL_RELEASE_VERSION}
+    cp ${DRILL_SRC}/target/apache-drill-${DRILL_RELEASE_VERSION}-src.tar.gz* 
${LOCAL_RELEASE_STAGING_DIR}/${DRILL_RELEASE_VERSION}/ && \
+    cp ${DRILL_SRC}/target/apache-drill-${DRILL_RELEASE_VERSION}-src.zip* 
${LOCAL_RELEASE_STAGING_DIR}/${DRILL_RELEASE_VERSION}/ && \
+    cp 
${DRILL_SRC}/distribution/target/apache-drill-${DRILL_RELEASE_VERSION}.tar.gz* 
${LOCAL_RELEASE_STAGING_DIR}/${DRILL_RELEASE_VERSION}/
+
+}
+
+function checkPassphrase(){
+    echo "1234" | gpg2 --batch --passphrase "${GPG_PASSPHRASE}" -o /dev/null 
-as -
+    if [ $? -ne 0 ]; then
+        echo "Invalid passphrase. Make sure the default key is set to the key 
you want to use (or make it the first key in the keyring)."
+        exit 1
+    fi
+}
+
+function createDirectoryIfAbsent() {
+    DIR_NAME="$1"
+    if [ ! -d "${DIR_NAME}" ]; then
+        echo "Creating directory ${DIR_NAME}"
+        mkdir -p "${DIR_NAME}"
+    fi
+}
+
+
+function readInputAndSetup(){
+
+    read -p "Drill Working Directory : " WORK_DIR
+    createDirectoryIfAbsent "${WORK_DIR}"
+
+    read -p "Drill Release Version (eg. 1.4.0) : " DRILL_RELEASE_VERSION
+
+    read -p "Drill Development Version (eg. 1.5.0-SNAPSHOT) : " 
DRILL_DEV_VERSION
+
+    read -p "Release Commit SHA : " RELEASE_COMMIT_SHA
+
+    read -p "Write output to (directory) : " DRILL_RELEASE_OUTDIR
+    createDirectoryIfAbsent "${DRILL_RELEASE_OUTDIR}"
+
+    read -p "Staging (personal) repo : " MY_REPO
+
+    read -p "Local release staging directory : " LOCAL_RELEASE_STAGING_DIR
+    createDirectoryIfAbsent "${LOCAL_RELEASE_STAGING_DIR}"
+
+    read -p "Apache login : " APACHE_LOGIN
+
+    read -p "Release candidate attempt : " RELEASE_ATTEMPT
+
+    read -s -p "GPG Passphrase (Use quotes around a passphrase with spaces) : 
" GPG_PASSPHRASE
+
+    DRILL_RELEASE_OUTFILE="${DRILL_RELEASE_OUTDIR}/drill_release.out.txt"
+    DRILL_SRC=${WORK_DIR}/drill-release
+
+    echo ""
+    echo "-----------------"
+    echo "Drill Working Directory : " ${WORK_DIR}
+    echo "Drill Src Directory : " ${DRILL_SRC}
+    echo "Drill Release Version : " ${DRILL_RELEASE_VERSION}
+    echo "Drill Development Version : " ${DRILL_DEV_VERSION}
+    echo "Release Commit SHA : " ${RELEASE_COMMIT_SHA}
+    echo "Write output to : " ${DRILL_RELEASE_OUTFILE}
+    echo "Staging (personal) repo : " ${MY_REPO}
+    echo "Local release staging dir : " ${LOCAL_RELEASE_STAGING_DIR}
+
+    touch ${DRILL_RELEASE_OUTFILE}
+}
+
+checkPassphraseNoSpace(){
+    # The checkPassphrase function does not work for passphrases with embedded 
spaces.
+    if [ -z "${GPG_PASSPHRASE##* *}" ] ;then
+        echo "Passphrase contains a space - No Validation performed."
+    else
+        echo -n "Validating passphrase .... "
+        checkPassphrase && echo "Passphrase accepted" || echo "Invalid 
passphrase"
+    fi
+}
+
+cloneRepo(){
+    cd ${WORK_DIR}
+    rm -rf ./drill-release
+    git clone https://github.com/apache/drill.git drill-release  >& 
${DRILL_RELEASE_OUTFILE}
+    cd ${DRILL_SRC}
+    git checkout ${RELEASE_COMMIT_SHA}
+}
+
+###### BEGIN  #####
+# Location of checksum.sh
+export CHKSMDIR=`pwd`
+
+readInputAndSetup
+checkPassphraseNoSpace
+
+runCmd "Cloning the repo" cloneRepo
+
+runCmd "Checking the build" mvn install -DskipTests
+
+export MAVEN_OPTS=-Xmx2g
+runCmd "Clearing release history" mvn release:clean -Papache-release 
-DpushChanges=false -DskipTests
+
+export MAVEN_OPTS='-Xmx4g -XX:MaxPermSize=512m'
+runCmd "Preparing the release " mvn -X release:prepare -Papache-release 
-DpushChanges=false -DskipTests -Darguments="-Dgpg.passphrase=${GPG_PASSPHRASE} 
 -DskipTests=true -Dmaven.javadoc.skip=false" 
-DreleaseVersion=${DRILL_RELEASE_VERSION} 
-DdevelopmentVersion=${DRILL_DEV_VERSION} -Dtag=drill-${DRILL_RELEASE_VERSION}
+
+runCmd "Pushing to private repo ${MY_REPO}" git push ${MY_REPO} 
drill-${DRILL_RELEASE_VERSION}
+
+runCmd "Performing the release to ${MY_REPO}" mvn release:perform 
-DconnectionUrl=scm:git:${MY_REPO} -DskipTests 
-Darguments="-Dgpg.passphrase=${GPG_PASSPHRASE} -DskipTests=true 
-DconnectionUrl=scm:git:${MY_REPO}"
+
+runCmd "Checking out release commit" git checkout 
drill-${DRILL_RELEASE_VERSION}
+
+# Remove surrounding quotes
+tempGPG_PASSPHRASE="${GPG_PASSPHRASE%\"}"
+tempGPG_PASSPHRASE="${tempGPG_PASSPHRASE#\"}"
+runCmd "Deploying ..." mvn deploy -Papache-release -DskipTests 
-Dgpg.passphrase="${tempGPG_PASSPHRASE}"
+
+runCmd "Copying" copyFiles
+
+runCmd "Verifying artifacts are signed correctly" ${CHKSMDIR}/checksum.sh 
${DRILL_SRC}/distribution/target/apache-drill-${DRILL_RELEASE_VERSION}.tar.gz
+pause
+
+runCmd "Copy release files to home.apache.org" sftp 
${APACHE_LOGIN}@home.apache.org <<EOF
+  mkdir public_html
+  cd public_html
+  mkdir drill
+  cd drill
+  mkdir releases
+  cd releases
+  mkdir ${DRILL_RELEASE_VERSION}
+  cd ${DRILL_RELEASE_VERSION}
+  mkdir rc${RELEASE_ATTEMPT}
+  cd rc${RELEASE_ATTEMPT}
+  put ${LOCAL_RELEASE_STAGING_DIR}/${DRILL_RELEASE_VERSION}/* .
+  bye
+EOF
+
+echo "Go to the Apache maven staging repo and close the new jar release"
+pause
+
+echo "Start the vote \(good luck\)\n"
diff --git a/tools/verify_release.sh b/tools/verify_release.sh
deleted file mode 100755
index 11f76ff..0000000
--- a/tools/verify_release.sh
+++ /dev/null
@@ -1,173 +0,0 @@
-#!/bin/bash
-#
-# 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.
-#
-
-DRILL_CHECKUM_ALOGRITHMS="sha1 md5"
-DRILL_SIGNATURE_EXTENSION=asc
-DRILL_DOWNLOAD_EXTENSIONS="tar.gz,zip,xml,asc,jar,md5,pom,sha1"
-DRILL_ARTIFACTS="*.tar.gz *.zip *.pom *.jar"
-DRILL_ARTIFACT_DIR=.
-
-TERSE=false
-CMD_REDIRECT="/dev/stdout"
-DOWNLOAD_URL=
-ARTIFACT_COUNT=0
-
-ERROR='\e[0;31m'
-SUCCESS='\e[0;32m'
-DEBUG='\e[1;30m'
-INFO='\e[0;33m'
-RESET='\e[0m'
-
-#
-# Helper methods
-#
-info_msg()   { echo -e $INFO$@$RESET; }
-debug_msg()  { if [ "$TERSE" == "false" ]; then echo -e $DEBUG$@$RESET; fi }
-error_msg()  { echo -e $ERROR$@$RESET; }
-error_exit() { echo -e $ERROR$@$RESET; popd &> /dev/null; exit 1; }
-
-header_msg() {
-  MSG=$@
-  info_msg ${MSG}
-  if [ "$TERSE" == "false" ]; then
-    info_msg $(eval printf "=%.0s" {1..${#MSG}});
-  fi
-}
-
-test_dir()   {
-  if [ ! -e $1 ]; then
-    mkdir -p $1
-  elif [ ! -d $1 ]; then
-    error_msg "The specified path '$1' is not a directory."
-    usage
-  fi
-}
-
-usage() {
-  echo -e "Usage:\n `basename $0` <path_of_drill_artifacts>\n `basename $0` 
<url_of_drill_artifacts> [path_of_download_directory]"
-  exit 1
-}
-
-download_files() {
-  if [[ $# == 2 ]]; then
-    test_dir $2
-    DRILL_ARTIFACT_DIR=$2
-  else
-    DRILL_ARTIFACT_DIR=`mktemp -d`
-  fi
-
-  info_msg "Downloading files from '$1' into '$DRILL_ARTIFACT_DIR'"
-  pushd ${DRILL_ARTIFACT_DIR} &> /dev/null
-  wget $1 -r -np -A ${DRILL_DOWNLOAD_EXTENSIONS} -l0 -e robots=off -nH -nv &> 
$CMD_REDIRECT
-  popd &> /dev/null
-}
-
-verify_directory() {
-  pushd $1 &> /dev/null
-
-  for ARTIFACT in ${DRILL_ARTIFACTS}; do
-    ARTIFACT_COUNT=$(($ARTIFACT_COUNT+1))
-    header_msg "Verifying artifact #$ARTIFACT_COUNT '$ARTIFACT' in $PWD"
-
-    debug_msg "Verifying signature..."
-    SIGNATURE_FILE=${ARTIFACT}.${DRILL_SIGNATURE_EXTENSION}
-    if ! [ -f ${SIGNATURE_FILE} ]; then error_exit "Signature file 
'${SIGNATURE_FILE}' was not found"; fi
-    if gpg --verify ${SIGNATURE_FILE} &> $CMD_REDIRECT; then
-      debug_msg "Signature verified (${SIGNATURE_FILE})."
-    else
-      error_exit "Signature verification failed for '${ARTIFACT}'!"
-    fi
-    debug_msg ""
-
-    debug_msg Verifying checksums...
-    for ALGO in $DRILL_CHECKUM_ALOGRITHMS; do
-      CHECKSUM_FILE=${ARTIFACT}.${ALGO}
-      if ! [ -f ${CHECKSUM_FILE} ]; then error_exit "Checksum file 
'${CHECKSUM_FILE}' was not found"; fi
-      COMPUTED_SUM=`${ALGO}sum ${ARTIFACT} | awk '{print $1}'`
-      FILE_SUM=`cat ${CHECKSUM_FILE}`
-      if [ "${FILE_SUM}" == "${COMPUTED_SUM}" ]; then
-        debug_msg "Verified ${ALGO} checksum (${CHECKSUM_FILE})."
-      else
-        error_exit "Computed ${ALGO} checksum did not match the one in 
'${CHECKSUM_FILE}'"
-      fi
-    done
-    debug_msg "Checksums verified.\n"
-  done
-  
-  # recurse through the sub-directories
-  for SUB_DIR in *; do
-    if [ -d ${SUB_DIR} ]; then
-      verify_directory ${SUB_DIR}
-    fi
-  done
-
-  popd &> /dev/null
-}
-
-#
-# Parse the command line arguments
-#
-if [ $# -eq 0 ]; then
-  usage
-fi
-while [ $# -gt 0 ]; do
-  case "$1" in
-  -nv)
-    TERSE=true
-    CMD_REDIRECT="/dev/null"
-  ;;
-  -*)
-    echo "Unknown option '$1'."
-    usage
-  ;;
-  *)
-    if [[ $1 == https://* ]] || [[ $1 == http://* ]] || [[ $1 == ftp://* ]]; 
then
-      DOWNLOAD_URL=$1
-    else
-      test_dir $1; DRILL_ARTIFACT_DIR=$1
-    fi
-  ;;
-  esac
-  shift
-done
-
-#
-# Download files if requested
-#
-if [ "$DOWNLOAD_URL" != "" ]; then
-  download_files ${DOWNLOAD_URL} ${DRILL_ARTIFACT_DIR}
-fi
-
-#
-# Begin validation
-#
-shopt -s nullglob
-verify_directory ${DRILL_ARTIFACT_DIR}
-info_msg ""
-
-# All GOOD
-if [ "$DOWNLOAD_URL" != "" ]; then
-  info_msg "Files downloaded to '${DRILL_ARTIFACT_DIR}'"
-fi
-
-if [ "$ARTIFACT_COUNT" == "0" ]; then
-  error_exit "No artifact found in '$DRILL_ARTIFACT_DIR'"
-else
-  echo -e $SUCCESS"All verifications passed on ${ARTIFACT_COUNT} 
artifacts."$RESET
-fi

Reply via email to