From b13baccbd20e1f88e1765592c62218996562288f Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Wed, 26 Aug 2015 09:38:10 +0100 Subject: [PATCH] Introduce draft step The publish stage has been split into two pieces - a draft step that creates a draft version release in Github and a publish step that publishes the draft, updates `latest_release` and pushes images to DockerHub. It is also possible to specify `--pre-release` to draft. Once published such a release will be marked with a prominent warning in GitHub; additionally we do not update `latest_release` in GitHub nor push an update to the `latest` tag in DockerHub. --- bin/release | 169 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 119 insertions(+), 50 deletions(-) diff --git a/bin/release b/bin/release index 9cbae07c..e577468f 100755 --- a/bin/release +++ b/bin/release @@ -90,17 +90,24 @@ build() { echo '** Release artefacts in' $RELEASE_DIR } -publish() { +draft() { setup + + TYPE="release" + RELEASE_ARGS="--draft" + if [ $# -ne 0 ] ; then + if [ $# -eq 1 -a "$1" = "--pre-release" ] ; then + TYPE="pre-release" + RELEASE_ARGS="$RELEASE_ARGS --pre-release" + else + usage + fi + fi + cd $PWD/$RELEASE_DIR echo "== Sanity checks" - if ! [ $(git rev-list -1 $LATEST_TAG) == $(git rev-list -1 latest_release) ]; then - echo -e "\u2757 The tag latest_release does not point to the same commit as $LATEST_TAG" - exit 1 - fi - ## Check that the tag exists by looking at github if ! curl -sSf https://api.github.com/repos/$GITHUB_USER/weave/git/tags/$LATEST_TAG_SHA >/dev/null 2>&1; then echo -e "\u2757 Tag $LATEST_TAG is not on GitHub, or is not the same as the local tag" >&2 @@ -110,19 +117,9 @@ publish() { exit 1 fi - ## Check that the 'latest_release' tag exists by looking at github - if ! curl -sSf https://api.github.com/repos/$GITHUB_USER/weave/git/tags/$LATEST_RELEASE_SHA >/dev/null 2>&1; then - echo -e "\u2757 Tag latest_release is not on GitHub, or is not the same as the local tag" >&2 - echo -e "\thttps://github.com/$GITHUB_USER/weave/tags" >&2 - echo "You may need to" >&2 - echo -e "\tgit tag -af latest_release" - echo -e "\tgit push -f git@github.com:$GITHUB_USER/weave latest_release" - exit 1 - fi - echo -e "\u2713 Tag $LATEST_TAG exists in GitHub repo $GITHUB_USER/weave" - ## Check that the version doesn't already exist by looking at github + ## Check that the version does not already exist by looking at github ## releases if github-release info --user $GITHUB_USER --repo weave --tag $LATEST_TAG >/dev/null 2>&1; then echo -e "\u2757 Release $LATEST_TAG already exists on GitHub" >&2 @@ -132,13 +129,8 @@ publish() { echo '** Sanity checks OK for publishing tag' $LATEST_TAG as $DOCKERHUB_USER/weave:$VERSION - echo "== Tagging and publishing images on docker hub as user $DOCKERHUB_USER" - make SUDO=$SUDO WEAVE_VERSION=$VERSION DOCKERHUB_USER=$DOCKERHUB_USER publish - - echo "== Creating GitHub release $RELEASE_NAME $VERSION" - # This cannot be done as a draft because of a bug in - # github-release: https://github.com/aktau/github-release/issues/7 - github-release release \ + echo "== Creating draft GitHub $TYPE $RELEASE_NAME $VERSION" + github-release release $RELEASE_ARGS \ --user $GITHUB_USER \ --repo weave \ --tag $LATEST_TAG \ @@ -152,41 +144,111 @@ publish() { --name "weave" \ --file "./weave" - echo "** Published release $RELEASE_NAME $VERSION" + echo "** Draft $TYPE $RELEASE_NAME $VERSION created at" echo -e "\thttps://github.com/$GITHUB_USER/weave/releases/$LATEST_TAG" +} - if github-release info --user $GITHUB_USER --repo weave \ - --tag latest_release >/dev/null 2>&1; then - github-release delete \ - --user $GITHUB_USER \ - --repo weave \ - --tag latest_release +publish() { + setup + cd $PWD/$RELEASE_DIR + + echo "== Detecting draft type" + # Determine whether $LATEST_TAG version in GitHub is marked as pre-release + if ! INFO=$(github-release info --user $GITHUB_USER --repo weave --tag $LATEST_TAG) ; then + # github-release prints errors to stdout https://github.com/aktau/github-release/issues/32 + echo $info >&2 + exit 1 fi - github-release release \ - --user $GITHUB_USER \ - --repo weave \ - --tag latest_release \ - --name "$RELEASE_NAME latest ($VERSION)" \ - --description "$RELEASE_DESCRIPTION" + PRERELEASE= + TICK=$(echo -e '\u2714') + # Pre-releases are signified with a unicode $TICK character ಠ_ಠ + if echo "$INFO" | grep -q "prerelease: $TICK" ; then + PRERELEASE=1 + fi - github-release upload \ - --user $GITHUB_USER \ - --repo weave \ - --tag latest_release \ - --name "weave" \ - --file "./weave" + if [ -n "$PRERELEASE" ] ; then + echo "** Pre-release draft detected" + echo "== Tagging and pushing images on docker hub as user $DOCKERHUB_USER" + make UPDATE_LATEST=false SUDO=$SUDO WEAVE_VERSION=$VERSION DOCKERHUB_USER=$DOCKERHUB_USER publish + echo "** Docker images tagged and pushed" - echo "** Published $RELEASE_NAME as latest_release at" - echo -e "\thttps://github.com/$GITHUB_USER/weave/releases/latest_release" + echo "== Publishing pre-release on GitHub" + + github-release publish \ + --user $GITHUB_USER \ + --repo weave \ + --tag $LATEST_TAG + + echo "** Pre-release $RELEASE_NAME $VERSION published at" + echo -e "\thttps://github.com/$GITHUB_USER/weave/releases/$LATEST_TAG" + else + echo "** Release draft detected" + echo "== Sanity checks" + if ! [ $(git rev-list -1 $LATEST_TAG) == $(git rev-list -1 latest_release) ]; then + echo -e "\u2757 The tag latest_release does not point to the same commit as $LATEST_TAG" + exit 1 + fi + + ## Check that the 'latest_release' tag exists by looking at github + if ! curl -sSf https://api.github.com/repos/$GITHUB_USER/weave/git/tags/$LATEST_RELEASE_SHA >/dev/null 2>&1; then + echo -e "\u2757 Tag latest_release is not on GitHub, or is not the same as the local tag" >&2 + echo -e "\thttps://github.com/$GITHUB_USER/weave/tags" >&2 + echo "You may need to" >&2 + echo -e "\tgit tag -af latest_release" + echo -e "\tgit push -f git@github.com:$GITHUB_USER/weave latest_release" + exit 1 + fi + echo '** Sanity checks OK for publishing tag' $LATEST_TAG as $DOCKERHUB_USER/weave:$VERSION + + echo "== Tagging and pushing images on docker hub as user $DOCKERHUB_USER" + make SUDO=$SUDO WEAVE_VERSION=$VERSION DOCKERHUB_USER=$DOCKERHUB_USER publish + echo "** Docker images tagged and pushed" + + echo "== Publishing release on GitHub" + + github-release publish \ + --user $GITHUB_USER \ + --repo weave \ + --tag $LATEST_TAG + + if github-release info --user $GITHUB_USER --repo weave \ + --tag latest_release >/dev/null 2>&1; then + github-release delete \ + --user $GITHUB_USER \ + --repo weave \ + --tag latest_release + fi + + github-release release \ + --user $GITHUB_USER \ + --repo weave \ + --tag latest_release \ + --name "$RELEASE_NAME latest ($VERSION)" \ + --description "$RELEASE_DESCRIPTION" + + github-release upload \ + --user $GITHUB_USER \ + --repo weave \ + --tag latest_release \ + --name "weave" \ + --file "./weave" + + echo "** Release $RELEASE_NAME $VERSION published at" + echo -e "\thttps://github.com/$GITHUB_USER/weave/releases/$LATEST_TAG" + echo -e "\thttps://github.com/$GITHUB_USER/weave/releases/latest_release" + fi } usage() { echo "Usage:" echo -e "\t./bin/release build" echo "-- Build artefacts for the latest version tag" + echo -e "\t./bin/release draft [--pre-release]" + echo "-- Create draft release with artefacts in GitHub" echo -e "\t./bin/release publish" - echo "-- Publish the artefacts for the latest tag to GitHub and DockerHub" + echo "-- Publish the GitHub release and update DockerHub" + exit 1 } # Ensure required tooling is installed @@ -197,15 +259,22 @@ if ! which github-release >/dev/null; then exit 1 fi -case "$1" in +[ $# -eq 0 ] && usage +COMMAND=$1 +shift + +case "$COMMAND" in build) - build + build "$@" + ;; + draft) + draft "$@" ;; publish) - publish + publish "$@" ;; *) - echo "Unknown command \"$1\"" + echo "Unknown command \"$COMMAND\"" usage ;; esac