| #!/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 .. |
| export BASE_DIR=`pwd` |
| |
| # 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=$VERSION-$CANDIDATE |
| git tag -a $GIT_TAG -m 'release candidate $VERSION' |
| git archive --format "tar" --prefix=$PROJECT_NAME-$VERSION/ -o $PROJECT_NAME-$VERSION.tar $GIT_TAG |
| git submodule foreach --recursive 'git archive --verbose --prefix=$PROJECT_NAME-$VERSION/$path/ --format tar master --output $BASE_DIR/submodule-$sha1.tar' |
| if [[ $(ls | grep 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_USERNAME@apache.org --armor --output $PROJECT_NAME-$VERSION.tar.gz.asc --detach-sign $PROJECT_NAME-$VERSION.tar.gz |
| # Make hashes |
| for algo in 256 512; do |
| shasum -a $algo $PROJECT_NAME-$VERSION.tar.gz > $PROJECT_NAME-$VERSION.tar.gz.sha$algo |
| done |
| md5sum $PROJECT_NAME-$VERSION.tar.gz > $PROJECT_NAME-$VERSION.tar.gz.md5 |
| |
| # Make sure these three artifacts are good |
| gpg --verify $PROJECT_NAME-$VERSION.tar.gz.asc |
| md5sum --check $PROJECT_NAME-$VERSION.tar.gz.md5 |
| |
| 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 |
| } |
| |
| release_audit() { |
| # Downloads/runs the apache Release Audit Tool on the base folder, excluding this |
| # release directory |
| # |
| if [ ! -d apache-rat-0.12 ] ; then |
| curl http://apache.spinellicreations.com//creadur/apache-rat-0.12/apache-rat-0.12-bin.tar.bz2 > rat.tar.bz2 |
| tar -xzf rat.tar.bz2 |
| rm rat.tar.bz2 |
| fi |
| java -jar apache-rat-0.12/apache-rat-0.12.jar -e release -e build -e cmake* -d .. > rat-report.txt |
| if [ $? == 0 ] ; then |
| echo "created rat-report.txt" |
| else |
| echo "error running rat" |
| fi |
| } |
| |
| 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|audit|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 [ "audit" == "$1" ] ; then |
| echo "running release audit..." |
| release_audit |
| elif [ "test" == "$1" ] ; then |
| echo "testing candidate artifacts ..." |
| test_candidate |
| else |
| usage 0 |
| fi |