blob: 3ec2dd92d01584cf69ac8c376a0995ddeebe3a59 [file] [log] [blame]
#!/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.
#
#
# Generate a release-candidate and a text file containing the release
# announcement email.
#
set -e
usage () {
echo "usage: $0 [-k <key_id>] [-g <git_remote>] -v <version_num> -r <rc_num>"
echo " -v Version number of release"
echo " -r Release candidate number"
echo " -k Specify signing key. Defaults to \"GPG default key\""
echo " -g Specify Git remote name. Defaults to \"apache\""
echo " -d Turn on DEBUG output"
exit 1
}
# Default repository remote name
remote="apache"
while getopts "v:r:k:g:d" opt; do
case "${opt}" in
v)
version="${OPTARG}"
;;
r)
rc="${OPTARG}"
;;
k)
keyid="${OPTARG}"
;;
g)
remote="${OPTARG}"
;;
d)
set -x
;;
*)
usage
;;
esac
done
shift $((OPTIND-1))
if [ -z "$version" ] || [ -z "$rc" ]; then
echo "You must specify the version and RC numbers using the -v and -r switches"
usage
fi
if ! git ls-remote --exit-code "$remote" >/dev/null 2>&1 ; then
echo "The target remote git repository, ${remote}, is not configured in git. Please pass a valid value for the remote git repository to target via the -g switch"
usage
fi
scriptdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
projectdir="$(dirname "$scriptdir")"
tmpdir=$projectdir/tmp
if [ -d $tmpdir ]; then
echo "Cannot run: $tmpdir already exists"
exit 1
fi
tag="apache-iceberg-$version"
tagrc="${tag}-rc${rc}"
echo "Preparing source for $tagrc"
echo "Creating release candidate tag: $tagrc..."
set_version_hash=`git rev-list HEAD 2> /dev/null | head -n 1 `
git tag -am "Apache Iceberg $version" $tagrc $set_version_hash
echo "Pushing $tagrc to $remote..."
git push $remote $tagrc
release_hash=`git rev-list $tagrc 2> /dev/null | head -n 1 `
if [ -z "$release_hash" ]; then
echo "Cannot continue: unknown Git tag: $tag"
exit
fi
echo "Generating version.txt and iceberg-build.properties..."
echo $version > $projectdir/version.txt
./gradlew generateGitProperties
cp $projectdir/build/iceberg-build.properties $projectdir/iceberg-build.properties
# be conservative and use the release hash, even though git produces the same
# archive (identical hashes) using the scm tag
echo "Creating tarball ${tarball} using commit $release_hash"
tarball=$tag.tar.gz
git archive $release_hash --worktree-attributes --prefix $tag/ --add-file $projectdir/version.txt --add-file $projectdir/iceberg-build.properties -o $projectdir/$tarball
# remove the uncommitted build files so they don't affect the current working copy
rm $projectdir/version.txt
rm $projectdir/iceberg-build.properties
echo "Signing the tarball..."
[[ -n "$keyid" ]] && keyopt="-u $keyid"
gpg $keyopt --armor --output ${projectdir}/${tarball}.asc --detach-sig ${projectdir}/$tarball
shasum -a 512 $tarball > ${projectdir}/${tarball}.sha512
echo "Checking out Iceberg RC subversion repo..."
svn co --depth=empty https://dist.apache.org/repos/dist/dev/iceberg $tmpdir
echo "Adding tarball to the Iceberg distribution Subversion repo..."
mkdir -p $tmpdir/$tagrc
cp $projectdir/${tarball}* $tmpdir/$tagrc
svn add $tmpdir/$tagrc
svn ci -m "Apache Iceberg $version RC${rc}" $tmpdir/$tagrc
echo "Creating release-announcement-email.txt..."
cat << EOF > $projectdir/release-announcement-email.txt
To: dev@iceberg.apache.org
Subject: [VOTE] Release Apache Iceberg ${version} RC${rc}
Hi Everyone,
I propose that we release the following RC as the official Apache Iceberg ${version} release.
The commit ID is ${release_hash}
* This corresponds to the tag: apache-iceberg-${version}-rc${rc}
* https://github.com/apache/iceberg/commits/apache-iceberg-${version}-rc${rc}
* https://github.com/apache/iceberg/tree/${release_hash}
The release tarball, signature, and checksums are here:
* https://dist.apache.org/repos/dist/dev/iceberg/apache-iceberg-${version}-rc${rc}
You can find the KEYS file here:
* https://dist.apache.org/repos/dist/dev/iceberg/KEYS
Convenience binary artifacts are staged on Nexus. The Maven repository URL is:
* https://repository.apache.org/content/repositories/orgapacheiceberg-<ID>/
Please download, verify, and test.
Please vote in the next 72 hours.
[ ] +1 Release this as Apache Iceberg <VERSION>
[ ] +0
[ ] -1 Do not release this because...
EOF
echo "Success! The release candidate is available here:"
echo " https://dist.apache.org/repos/dist/dev/iceberg/$tagrc"
echo ""
echo "Commit SHA1: $release_hash"
echo ""
echo "We have generated a release announcement email for you here:"
echo "$projectdir/release-announcement-email.txt"
echo ""
echo "Please note that you must update the Nexus repository URL"
echo "contained in the mail before sending it out."
rm -rf $tmpdir