123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- #!/usr/bin/env 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.
- #
- function exit_with_usage {
- cat << EOF
- usage: release-build.sh <package|publish-release>
- Creates build deliverables from a Livy commit.
- Top level targets are
- package: Create binary packages and copy them to home.apache
- publish-release: Publish a release to Apache release repo
- All other inputs are environment variables
- GIT_REF - Release tag or commit to build from
- LIVY_VERSION - Release identifier used when Publishing
- RELEASE_RC - Release RC identifier used when Publishing
- ASF_USERNAME - Username of ASF committer account
- ASF_PASSWORD - Password of ASF committer account
- GPG_PASSPHRASE - Passphrase for GPG key
- EOF
- exit 1
- }
- set -e
- if [ $# -eq 0 ]; then
- exit_with_usage
- fi
- if [[ $@ == *"help"* ]]; then
- exit_with_usage
- fi
- # Explicitly set locale in order to make `sort` output consistent across machines.
- # See https://stackoverflow.com/questions/28881 for more details.
- export LC_ALL=C
- # Setup env
- # Commit ref to checkout when building
- if [ -z "$GIT_REF" ]; then
- read -p "Choose git branch/tag [master]: " GIT_REF
- GIT_REF=${GIT_REF:-master}
- echo $GIT_REF
- fi
- # Set RELEASE_RC
- if [ -z "$RELEASE_RC" ]; then
- read -p "Choose RC [rc1]: " RELEASE_RC
- RELEASE_RC=${RELEASE_RC:-rc1}
- echo $RELEASE_RC
- fi
- # Get ASF Login
- if [ -z "$ASF_USERNAME" ]; then
- read -p "ASF username: " ASF_USERNAME
- echo $ASF_USERNAME
- fi
- if [ -z "$ASF_PASSWORD" ]; then
- read -s -p "ASF password: " ASF_PASSWORD
- echo
- fi
- # Destination directory on remote server
- RELEASE_STAGING_LOCATION="https://dist.apache.org/repos/dist/dev/incubator/livy"
- LIVY_REPO=${LIVY_REPO:-https://gitbox.apache.org/repos/asf/incubator-livy.git}
- GPG="gpg --no-tty --batch"
- NEXUS_ROOT=https://repository.apache.org/service/local/staging
- NEXUS_PROFILE=91529f2f65d84e # Profile for Livy staging uploads
- BASE_DIR=$(pwd)
- MVN="mvn"
- # Use temp staging dir for release process
- rm -rf release-staging
- mkdir release-staging
- cd release-staging
- git clone $LIVY_REPO incubator-livy
- cd incubator-livy
- git checkout $GIT_REF
- git_hash=`git rev-parse --short HEAD`
- echo "Checked out Livy git hash $git_hash"
- if [ -z "$LIVY_VERSION" ]; then
- LIVY_VERSION=$($MVN help:evaluate -Dexpression=project.version \
- | grep -v INFO | grep -v WARNING | grep -v Download)
- fi
- git clean -d -f -x
- rm .gitignore
- rm -rf .git
- cd ..
- ARCHIVE_NAME_PREFIX="apache-livy-$LIVY_VERSION"
- SRC_ARCHIVE="$ARCHIVE_NAME_PREFIX-src.zip"
- BIN_ARCHIVE="$ARCHIVE_NAME_PREFIX-bin.zip"
- if [[ "$1" == "package" ]]; then
- # Source and binary tarballs
- echo "Packaging release tarballs"
- cp -r incubator-livy $ARCHIVE_NAME_PREFIX
- zip -r $SRC_ARCHIVE $ARCHIVE_NAME_PREFIX
- echo "" | $GPG --passphrase-fd 0 --armour --output $SRC_ARCHIVE.asc --detach-sig $SRC_ARCHIVE
- echo "" | $GPG --passphrase-fd 0 --print-md SHA512 $SRC_ARCHIVE > $SRC_ARCHIVE.sha512
- rm -rf $ARCHIVE_NAME_PREFIX
- # Updated for binary build
- make_binary_release() {
- cp -r incubator-livy $ARCHIVE_NAME_PREFIX-bin
- cd $ARCHIVE_NAME_PREFIX-bin
- $MVN clean package -DskipTests -Dgenerate-third-party
- echo "Copying and signing regular binary distribution"
- cp assembly/target/$BIN_ARCHIVE .
- echo "" | $GPG --passphrase-fd 0 --armour --output $BIN_ARCHIVE.asc --detach-sig $BIN_ARCHIVE
- echo "" | $GPG --passphrase-fd 0 --print-md SHA512 $BIN_ARCHIVE > $BIN_ARCHIVE.sha512
- cp $BIN_ARCHIVE* ../
- cd ..
- }
- make_binary_release
- svn co --depth=empty $RELEASE_STAGING_LOCATION svn-livy
- mkdir -p svn-livy/$LIVY_VERSION-$RELEASE_RC
- echo "Copying release tarballs to local svn directory"
- cp ./$SRC_ARCHIVE* svn-livy/$LIVY_VERSION-$RELEASE_RC/
- cp ./$BIN_ARCHIVE* svn-livy/$LIVY_VERSION-$RELEASE_RC/
- cd svn-livy
- svn add $LIVY_VERSION-$RELEASE_RC
- svn ci -m "Apache Livy $LIVY_VERSION-$RELEASE_RC"
- exit 0
- fi
- if [[ "$1" == "publish-release" ]]; then
- tmp_dir=$(mktemp -d livy-repo-XXXXX)
- # the following recreates `readlink -f "$tmp_dir"` since readlink -f is unsupported on MacOS
- cd $tmp_dir
- tmp_repo=$(pwd)
- cd ..
- cd incubator-livy
- # Publish Livy to Maven release repo
- echo "Publishing Livy checkout at '$GIT_REF' ($git_hash)"
- echo "Publish version is $LIVY_VERSION"
- # Coerce the requested version
- $MVN versions:set -DnewVersion=$LIVY_VERSION
- # Using Nexus API documented here:
- # https://support.sonatype.com/entries/39720203-Uploading-to-a-Staging-Repository-via-REST-API
- echo "Creating Nexus staging repository"
- repo_request="<promoteRequest><data><description>Apache Livy $LIVY_VERSION (commit $git_hash)</description></data></promoteRequest>"
- out=$(curl -X POST -d "$repo_request" -u $ASF_USERNAME:$ASF_PASSWORD \
- -H "Content-Type:application/xml" -v \
- $NEXUS_ROOT/profiles/$NEXUS_PROFILE/start)
- staged_repo_id=$(echo $out | sed -e "s/.*\(orgapachelivy-[0-9]\{4\}\).*/\1/")
- echo "Created Nexus staging repository: $staged_repo_id"
- $MVN -Dmaven.repo.local=$tmp_repo -DskipTests -DskipITs clean install
- pushd $tmp_repo/org/apache/livy
- # Remove any extra files generated during install
- find . -type f |grep -v \.jar |grep -v \.pom | xargs rm
- echo "Creating hash and signature files"
- for file in $(find . -type f)
- do
- echo "" | $GPG --passphrase-fd 0 --output $file.asc \
- --detach-sig --armour $file;
- if [ $(command -v md5) ]; then
- # Available on OS X; -q to keep only hash
- md5 -q $file > $file.md5
- else
- # Available on Linux; cut to keep only hash
- md5sum $file | cut -f1 -d' ' > $file.md5
- fi
- sha1sum $file | cut -f1 -d' ' > $file.sha1
- done
- nexus_upload=$NEXUS_ROOT/deployByRepositoryId/$staged_repo_id
- echo "Uploading files to $nexus_upload"
- for file in $(find . -type f)
- do
- # strip leading ./
- file_short=$(echo $file | sed -e "s/\.\///")
- dest_url="$nexus_upload/org/apache/livy/$file_short"
- echo " Uploading $file_short"
- curl -u $ASF_USERNAME:$ASF_PASSWORD --upload-file $file_short $dest_url
- done
- echo "Closing nexus staging repository"
- repo_request="<promoteRequest><data><stagedRepositoryId>$staged_repo_id</stagedRepositoryId><description>Apache Livy$LIVY_VERSION (commit $git_hash)</description></data></promoteRequest>"
- out=$(curl -X POST -d "$repo_request" -u $ASF_USERNAME:$ASF_PASSWORD \
- -H "Content-Type:application/xml" -v \
- $NEXUS_ROOT/profiles/$NEXUS_PROFILE/finish)
- echo "Closed Nexus staging repository: $staged_repo_id"
- popd
- rm -rf $tmp_repo
- cd ..
- exit 0
- fi
- cd ..
- rm -rf release-staging
- echo "ERROR: expects to be called with 'package', 'publish-release'"
|