Init release scripts Includes: Script to do common release tasks - subcommand to create artifacts - subcommand to publish release candidates - subcommand to test a release candidate
All commands are parameterized by the .profile file Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/6a240fcd Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/6a240fcd Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/6a240fcd Branch: refs/heads/dist-patch Commit: 6a240fcd1452abb7870a9e8ec82ed8f60f75e9c4 Parents: e896b61 Author: cramja <marc.spehlm...@gmail.com> Authored: Tue Feb 28 11:13:30 2017 -0600 Committer: cramja <marc.spehlm...@gmail.com> Committed: Wed Mar 1 16:07:58 2017 -0600 ---------------------------------------------------------------------- .gitattributes | 1 + release/.gitignore | 3 + release/README.md | 34 +++++++ release/release_cmds.sh | 172 +++++++++++++++++++++++++++++++++++ release/release_manager.profile | 29 ++++++ 5 files changed, 239 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/6a240fcd/.gitattributes ---------------------------------------------------------------------- diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..c0aaef0 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +release export-ignore http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/6a240fcd/release/.gitignore ---------------------------------------------------------------------- diff --git a/release/.gitignore b/release/.gitignore new file mode 100644 index 0000000..0716d9f --- /dev/null +++ b/release/.gitignore @@ -0,0 +1,3 @@ +.release_manager.profile +svn-* +apache-* http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/6a240fcd/release/README.md ---------------------------------------------------------------------- diff --git a/release/README.md b/release/README.md new file mode 100644 index 0000000..5776e09 --- /dev/null +++ b/release/README.md @@ -0,0 +1,34 @@ +## Scripts to help release Quickstep + +### Preqs + +You must fill out `release_manager.profile` first. + +You'll need: + * md5sum + * shasum + * svn + * gpg + * tar + * gzip + +This is of course in addition to the regular build tools. + +### Usage Overview + +``` +# Test a candidate +./release_cmds.sh test + +# Create candidate artifacts +./release_cmds.sh create + +# Publish candidate artifacts (after you've created them) +./release_cmds.sh publish +``` + +* A full guide to releases can be found on [confluence][cwiki-howto]. +* PGP key generation is discussed [here][pgp-keys] + +[cwiki-howto]: https://cwiki.apache.org/confluence/display/QUICKSTEP/How+To+Release +[pgp-keys]: http://quickstep.apache.org/release-signing/ \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/6a240fcd/release/release_cmds.sh ---------------------------------------------------------------------- diff --git a/release/release_cmds.sh b/release/release_cmds.sh new file mode 100755 index 0000000..d23b4ef --- /dev/null +++ b/release/release_cmds.sh @@ -0,0 +1,172 @@ +#!/usr/bin/env bash + +# Functions for Releasing Quickstep +# Usage: Fill out your details in release_manager.profile. +# ./release_cmds [create|publish|test] +# +# Note: This script is a scratch pad with most of the relevent commands. Modify +# it to see fit. We'll finalize it when we understand the process better. +# +# Everything in this script assumes that you are running in the release/ +# folder of your quickstep directory. +# +# PREREQS: +# - full details on how to do a release is in a confluence article: How to Release +# - You must have previously created a pgp key using your apache username +# and uploaded it to a keyserver [http://quickstep.apache.org/release-signing/] +# + +### Helper functions + +create_artifacts() { + # Updates submodules, archives everything, signs it using your key (requires + # user input), makes checksums, moves artifacts to release/ folder + # + + export RELEASE_DIR=`pwd` + cd .. + + # need the submodules to be included for the compile to work. + # likely, this will be a no-op + git submodule init + git submodule update + + # you'll need to push this if you want the tag to be visible to committers + # the tag is necesary for the archiving to work correctly + git tag -a rc-$VERSION -m 'release candidate $VERSION' + git archive --format "tar" --prefix=$PROJECT_NAME-$VERSION/ -o $PROJECT_NAME-$VERSION.tar rc-$VERSION + git submodule foreach --recursive 'git archive --verbose --prefix=$PROJECT_NAME-$VERSION/$path/ --format tar master --output $RELEASE_DIR/submodule-$sha1.tar' + if [[ $(ls submodule-*.tar | wc -l) != 0 ]]; then + # combine all archives into one tar + tar --concatenate --file $PROJECT_NAME-$VERSION.tar submodule-*.tar + # remove sub tars + rm -rf submodule-*.tar + fi + + # gzip final tar + gzip --force --verbose $PROJECT_NAME-$VERSION.tar + + # Make the signature. This requires human input + gpg -u $apache_usern...@apache.org --armor --output $PROJECT_NAME-$VERSION.tar.gz.asc --detach-sign $PROJECT_NAME-$VERSION.tar.gz + # Make hashes + md5sum $PROJECT_NAME-$VERSION.tar.gz > $PROJECT_NAME-$VERSION.tar.gz.md5 + sha1sum $PROJECT_NAME-$VERSION.tar.gz > $PROJECT_NAME-$VERSION.tar.gz.sha + + + # Make sure these three artifacts are good + gpg --verify $PROJECT_NAME-$VERSION.tar.gz.asc + md5sum --check $PROJECT_NAME-$VERSION.tar.gz.md5 + sha1sum --check $PROJECT_NAME-$VERSION.tar.gz.sha + + mv $PROJECT_NAME-$VERSION.tar.gz* $RELEASE_DIR + + cd $RELEASE_DIR +} + +publish_candidate() { + # push a RC to subversion. We use SVN sparse directories so as not to pull + # every artifact ever. Assumes that you have already created the artifacts + # and they reside in the release/ folder. + # directory layout is x.y.z/RCw, where w is the release candidate number + # + + if [ ! -d "$SVN_DEV" ]; then + svn checkout --depth immediates $SVN_DEV_URL $SVN_DEV + fi + + BASE_DIR=`pwd` + cd $SVN_DEV + + if [ ! -d "$VERSION" ]; then + mkdir $VERSION + cd $VERSION + else + cd $VERSION + svn update --set-depth immediates . + fi + + # now in $VERSION folder + + RCFOLDER=RC$CANDIDATE + mkdir $RCFOLDER + cd $RCFOLDER + cp $BASE_DIR/$PROJECT_NAME-$VERSION.tar.gz* ./ + cd .. + + svn add $VERSION/$RCFOLDER + svn commit --username=$APACHE_USERNAME -m "Quickstep-$VERSION RC$CANDIDATE" + + cd $BASE_DIR +} + +test_candidate() { + # This is best run in /tmp + # tries checking out a release candidate and building + # + + svn checkout --depth immediates $SVN_DEV_URL $SVN_DEV + cd $SVN_DEV + + # add the KEYS file from quickstep to your gpg key ring + gpg --import KEYS + + cd $VERSION + svn update --set-depth infinity RC$CANDIDATE + cd RC$CANDIDATE + + tar -xzf $PROJECT_NAME-$VERSION.tar.gz + + # verify artifacts + gpg --verify $PROJECT_NAME-$VERSION.tar.gz.asc + md5sum --check $PROJECT_NAME-$VERSION.tar.gz.md5 + sha1sum --check $PROJECT_NAME-$VERSION.tar.gz.sha + + # now build the release artifacts + cd $PROJECT_NAME-$VERSION + + # first download third_party, then do your normal build + cd third_party/ + ./download_and_patch_prerequisites.sh + cd .. + cd build + cmake .. + make +} + +usage() { + echo "usage: $0 [create|publish|test]" + exit $1 +} + +### main + +source release_manager.profile +if [ -z $APACHE_USERNAME ] || [ -z $VERSION ] || [ -z $CANDIDATE ]; then + echo "please set release_manager.profile" + exit 1 +fi + +alias svn="svn --non-interactive" + +set -e + +if [ -z $1 ] ; then + usage 0 +fi + +echo "user: $APACHE_USERNAME" +echo "version: $VERSION" +echo "candidate: $CANDIDATE" + +if [ "create" == "$1" ] ; then + echo "creating artifacts ..." + create_artifacts +elif [ "publish" == "$1" ] ; then + echo "publishing candidate artifacts ..." + publish_candidate +elif [ "test" == "$1" ] ; then + echo "testing candidate artifacts ..." + test_candidate +else + usage 0 +fi http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/6a240fcd/release/release_manager.profile ---------------------------------------------------------------------- diff --git a/release/release_manager.profile b/release/release_manager.profile new file mode 100644 index 0000000..6b51003 --- /dev/null +++ b/release/release_manager.profile @@ -0,0 +1,29 @@ +# Profile for Releasing Quickstep +# +# This script is for release managers. It is to be used in conjunction with +# the release_cmds script. +# +# Usage: Fill out this file with your apache details. Then source this file. +# Sourcing the release_cmds file will automatically source this. +# + +# you must be registered with apache +export APACHE_USERNAME= + +# quickstep version, Major.Minor.Increment +export VERSION= + +# release candidate number. For a new version, this starts at 0 +export CANDIDATE= + +# folders corresponding to SVN repos where we keep our release artifacts +export SVN_DEV=svn-quickstep-dev +export SVN_REL=svn-quickstep-rel + +# you probably will not need to change things below this line +export PROJECT_NAME=apache-quickstep-incubating + +# path to apache repo with quickstep releases + +export SVN_DEV_URL=https://dist.apache.org/repos/dist/dev/incubator/quickstep +export SVN_REL_URL=https://dist.apache.org/repos/dist/rel/incubator/quickstep \ No newline at end of file