Add scripts for automating parts of the release.

Signed-off-by: Daniel Nephin <dnephin@docker.com>
This commit is contained in:
Daniel Nephin 2015-09-11 01:44:25 -04:00
commit da91b81bb8
6 changed files with 269 additions and 42 deletions

28
script/release/cherry-pick-pr Executable file
View file

@ -0,0 +1,28 @@
#!/bin/bash
#
# Cherry-pick a PR into the release branch
#
set -e
set -o pipefail
function usage() {
>&2 cat << EOM
Cherry-pick commits from a github pull request.
Usage:
$0 <github PR number>
EOM
exit 1
}
[ -n "$1" ] || usage
REPO=docker/compose
GITHUB=https://github.com/$REPO/pull
PR=$1
url="$GITHUB/$PR"
hub am -3 $url

96
script/release/make-branch Executable file
View file

@ -0,0 +1,96 @@
#!/bin/bash
#
# Prepare a new release branch
#
set -e
set -o pipefail
. script/release/utils.sh
REPO=git@github.com:docker/compose
function usage() {
>&2 cat << EOM
Create a new release branch `release-<version>`
Usage:
$0 <version> [<base_version>]
Options:
version version string for the release (ex: 1.6.0)
base_version branch or tag to start from. Defaults to master. For
bug-fix releases use the previous stage release tag.
EOM
exit 1
}
[ -n "$1" ] || usage
VERSION=$1
BRANCH=bump-$VERSION
if [ -z "$2" ]; then
BASE_VERSION="master"
else
BASE_VERSION=$2
fi
DEFAULT_REMOTE=release
REMOTE=$(find_remote $REPO)
# If we don't have a docker origin add one
if [ -z "$REMOTE" ]; then
echo "Creating $DEFAULT_REMOTE remote"
git remote add ${DEFAULT_REMOTE} ${REPO}
fi
# handle the difference between a branch and a tag
if [ -z "$(git name-rev $BASE_VERSION | grep tags)" ]; then
BASE_VERSION=$REMOTE/$BASE_VERSION
fi
echo "Creating a release branch $VERSION from $BASE_VERSION"
read -n1 -r -p "Continue? (ctrl+c to cancel)"
git fetch $REMOTE -p
git checkout -b $BRANCH $BASE_VERSION
# Store the release version for this branch in git, so that other release
# scripts can use it
git config "branch.${BRANCH}.release" $VERSION
echo "Update versions in docs/install.md and compose/__init__.py"
# TODO: automate this
$EDITOR docs/install.md
$EDITOR compose/__init__.py
echo "Write release notes in CHANGELOG.md"
browser "https://github.com/docker/compose/issues?q=milestone%3A$VERSION+is%3Aclosed"
$EDITOR CHANGELOG.md
echo "Verify changes before commit. Exit the shell to commit changes"
git diff
$SHELL
git commit -a -m "Bump $VERSION" --signoff
echo "Push branch to user remote"
GITHUB_USER=$USER
USER_REMOTE=$(find_remote $GITHUB_USER/compose)
if [ -z "$USER_REMOTE" ]; then
echo "No user remote found for $GITHUB_USER"
read -n1 -r -p "Enter the name of your github user: " GITHUB_USER
# assumes there is already a user remote somewhere
USER_REMOTE=$(find_remote $GITHUB_USER/compose)
fi
git push $USER_REMOTE
browser https://github.com/docker/compose/compare/docker:release...$GITHUB_USER:$BRANCH?expand=1

71
script/release/push-release Executable file
View file

@ -0,0 +1,71 @@
#!/bin/bash
#
# Create the official release
#
set -e
set -o pipefail
. script/release/utils.sh
function usage() {
>&2 cat << EOM
Publish a release by building all artifacts and pushing them.
This script requires that 'git config branch.${BRANCH}.release' is set to the
release version for the release branch.
EOM
exit 1
}
BRANCH="$(git rev-parse --abbrev-ref HEAD)"
VERSION="$(git config "branch.${BRANCH}.release")" || usage
API=https://api.github.com/repos
REPO=docker/compose
GITHUB_REPO=git@github.com:$REPO
# Check the build status is green
sha=$(git rev-parse HEAD)
url=$API/$REPO/statuses/$sha
build_status=$(curl -s $url | jq -r '.[0].state')
if [[ "$build_status" != "success" ]]; then
>&2 echo "Build status is $build_status, but it should be success."
exit -1
fi
# Build the binaries and sdists
script/build-linux
# TODO: build osx binary
# script/prepare-osx
# script/build-osx
python setup.py sdist --formats=gztar,zip
echo "Test those binaries! Exit the shell to continue."
$SHELL
echo "Tagging the release as $VERSION"
git tag $VERSION
git push $GITHUB_REPO $VERSION
echo "Create a github release"
# TODO: script more of this https://developer.github.com/v3/repos/releases/
browser https://github.com/$REPO/releases/new
echo "Uploading sdist to pypi"
python setup.py sdist upload
echo "Testing pip package"
virtualenv venv-test
source venv-test/bin/activate
pip install docker-compose==$VERSION
docker-compose version
deactivate
echo "Now publish the github release, and test the downloads."
echo "Email maintainers@dockerproject.org and engineering@docker.com about the new release.

View file

@ -0,0 +1,39 @@
#!/bin/bash
#
# Move the "bump to <version>" commit to the HEAD of the branch
#
set -e
function usage() {
>&2 cat << EOM
Move the "bump to <version>" commit to the HEAD of the branch
This script requires that 'git config branch.${BRANCH}.release' is set to the
release version for the release branch.
EOM
exit 1
}
BRANCH="$(git rev-parse --abbrev-ref HEAD)"
VERSION="$(git config "branch.${BRANCH}.release")" || usage
COMMIT_MSG="Bump $VERSION"
sha=$(git log --grep $COMMIT_MSG --format="%H")
if [ -z "$sha" ]; then
>&2 echo "No commit with message \"$COMMIT_MSG\""
exit 2
fi
if [[ "$sha" == "$(git rev-parse HEAD)" ]]; then
>&2 echo "Bump commit already at HEAD"
exit 0
fi
commits=$(git log --format="%H" HEAD..$sha | wc -l)
git rebase --onto $sha~1 HEAD~$commits $BRANCH
git cherry-pick $sha

20
script/release/utils.sh Normal file
View file

@ -0,0 +1,20 @@
#!/bin/bash
#
# Util functions for release scritps
#
set -e
function browser() {
local url=$1
xdg-open $url || open $url
}
function find_remote() {
local url=$1
for remote in $(git remote); do
git config --get remote.${remote}.url | grep $url > /dev/null && echo -n $remote
done
}