Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files
ARIA-307 Automate release process
Created a bash script to help with the releaes process
  • Loading branch information
Ran Ziv committed Jul 11, 2017
1 parent 6c2f35e commit 4c789f9b166ba1dcf1f19adb4940040a6d985e55
Showing 2 changed files with 283 additions and 5 deletions.
@@ -58,11 +58,6 @@ test:
-e py$(PYTHON_VERSION)ssh \
-e docs

dist: docs
python ./setup.py sdist bdist_wheel
# pushing LICENSE and additional files into the binary distribution archive
-find "$(DIST)" -type f -name '*.whl' -exec zip -u {} LICENSE NOTICE DISCLAIMER \;

./requirements.txt: ./requirements.in
pip install --upgrade "pip-tools>=1.9.0"
pip-compile --output-file ./requirements.txt ./requirements.in
@@ -0,0 +1,283 @@
#!/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.


# This script is meant to help with the creation of Apache-compliant
# release candidates, as well as finalizing releases by using said candidates.
#
# Creation of a release candidate includes:
# 1) Creating a source package (a snapshot of the repository)
# 2) Creating a Pythonic sdist (generated docs, examples, etc., but no tests etc.)
# 3) Creating a Pythonic bdist (Wheel; binary distribution)
# 4) Publishing these packages on to https://dist.apache.org/repos/dist/dev/incubator/ariatosca/
# 5) Publishing the sdist and bdist packages on test-PyPI (https://test.pypi.org/)
#
# Finalization of a release includes:
# 1) Copying of the source, sdist and bdist packages from /dist/dev to /dist/release
# (i.e. from https://dist.apache.org/repos/dist/dev/incubator/ariatosca/
# to https://dist.apache.org/repos/dist/release/incubator/ariatosca/)
# 2) Publishing the sdist and bdist packages on PyPI (https://pypi.org)
# 3) Tagging the git repository for the release version
#
# Read more about Apache release rules and regulations at:
# 1) https://www.apache.org/dev/#releases
# 2) https://www.apache.org/legal/release-policy.html
# 3) https://www.apache.org/dev/release-distribution.html
# 4) https://www.apache.org/dev/release-publishing.html
# 5) https://www.apache.org/dev/release-signing.html
# 6) http://incubator.apache.org/incubation/Incubation_Policy.html#Releases
# 7) http://incubator.apache.org/guides/releasemanagement.html


set -e


function create_apache_release_candidate {
if [ "$#" -lt 1 ]; then
echo "Must provide git branch for release candidate" >&2
return 1
fi

local GIT_BRANCH=$1
local OPTIONAL_ARIATOSCA_DIST_DEV_PATH=$2

ARIA_DIR=$(_get_aria_dir)
pushd ${ARIA_DIR}

git checkout ${GIT_BRANCH}
local VERSION=$(cat VERSION)

echo "Creating Apache release candidate for version ${VERSION}..."

make clean
_create_source_package ${GIT_BRANCH} ${VERSION}
_create_sdist_and_bdist_packages
_publish_to_apache_dev ${VERSION} ${OPTIONAL_ARIATOSCA_DIST_DEV_PATH}
_publish_to_test_pypi
git checkout -
popd
}


function finalize_apache_release {
if [ "$#" -ne 1 ]; then
echo "Must provide git branch for release tagging" >&2
return 1
fi

local GIT_BRANCH=$1

ARIA_DIR=$(_get_aria_dir)
pushd ${ARIA_DIR}

git checkout ${GIT_BRANCH}
local VERSION=$(cat VERSION)

read -p "Enter 'Yes' to confirm release finalization for version ${VERSION}: " yn
case $yn in
Yes ) echo "Finalizing Apache release...";;
* ) git checkout -; return;;
esac

_publish_to_apache_release ${VERSION}
_publish_to_real_pypi
_create_git_tag ${VERSION}
git checkout -
popd
}


function _get_aria_dir {
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ARIA_DIR="$(dirname "${SCRIPT_DIR}")"
echo ${ARIA_DIR}
}


function _create_source_package {
local GIT_BRANCH=$1
local VERSION=$2
local INCUBATING_ARCHIVE_CONTENT_DIR=apache-ariatosca-${VERSION}-incubating # e.g. apache-ariatosca-0.1.0-incubating
local INCUBATING_ARCHIVE=${INCUBATING_ARCHIVE_CONTENT_DIR}.tar.gz # e.g. apache-ariatosca-0.1.0-incubating.tar.gz
local SOURCE_PACKAGE_DIR="source"

echo "Creating source package..."
mkdir -p dist/${SOURCE_PACKAGE_DIR}
pushd dist/${SOURCE_PACKAGE_DIR}
# re-cloning repository, to ensure repo snapshot is clean and not environment-dependent
wget https://github.com/apache/incubator-ariatosca/archive/${GIT_BRANCH}.zip
unzip ${GIT_BRANCH}.zip > /dev/null
mv incubator-ariatosca-${GIT_BRANCH} ${INCUBATING_ARCHIVE_CONTENT_DIR}
tar -czvf ${INCUBATING_ARCHIVE} ${INCUBATING_ARCHIVE_CONTENT_DIR} > /dev/null
rm -rf ${INCUBATING_ARCHIVE_CONTENT_DIR}
rm ${GIT_BRANCH}.zip

_sign_package ${INCUBATING_ARCHIVE}
popd
}

function _sign_package {
local ARCHIVE_NAME=$1

echo "Signing archive ${ARCHIVE_NAME}..."
gpg --armor --output ${ARCHIVE_NAME}.asc --detach-sig ${ARCHIVE_NAME}
gpg --print-md MD5 ${ARCHIVE_NAME} > ${ARCHIVE_NAME}.md5
gpg --print-md SHA512 ${ARCHIVE_NAME} > ${ARCHIVE_NAME}.sha
}


function _create_sdist_and_bdist_packages {
local SDIST_PACKAGE_DIR="sdist"
local BDIST_PACKAGE_DIR="bdist"

echo "Creating sdist and bdist packages..."
make docs
python setup.py sdist -d dist/${SDIST_PACKAGE_DIR} bdist_wheel -d dist/${BDIST_PACKAGE_DIR}

# pushing LICENSE and additional files into the binary distribution archive
find dist/${BDIST_PACKAGE_DIR} -type f -name '*.whl' -exec zip -u {} LICENSE NOTICE DISCLAIMER \;

pushd dist/${SDIST_PACKAGE_DIR}
local SDIST_ARCHIVE=$(find . -type f -name "*.tar.gz" -printf '%P\n')
_sign_package ${SDIST_ARCHIVE}
popd

pushd dist/${BDIST_PACKAGE_DIR}
local BDIST_ARCHIVE=$(find . -type f -name "*.whl" -printf '%P\n')
_sign_package ${BDIST_ARCHIVE}
popd
}


function _publish_to_test_pypi {
echo "Publishing to test PyPI..."
_publish_to_pypi https://test.pypi.org/legacy/
}


function _publish_to_apache_dev {
local VERSION=$1
local ARIATOSCA_DIST_DEV_PATH=$2

local DIST_DIR=$(pwd)/dist
local RELEASE_DIR=${VERSION}-incubating # e.g. 0.1.0-incubating

echo "Publishing to Apache dist dev..."
if [ -z "${ARIATOSCA_DIST_DEV_PATH}" ]; then
local TMP_DIR=$(mktemp -d)
echo "Checking out ARIA dist dev to ${TMP_DIR}"
pushd ${TMP_DIR}
svn co https://dist.apache.org/repos/dist/dev/incubator/ariatosca/
popd
pushd ${TMP_DIR}/ariatosca
else
pushd ${ARIATOSCA_DIST_DEV_PATH}
fi

svn up
cp -r ${DIST_DIR} .
mv dist/ ${RELEASE_DIR}/
svn add ${RELEASE_DIR}
svn commit -m "ARIA ${VERSION} release candidate"
popd
}


function _publish_to_real_pypi {
echo "Publishing to PyPI..."
_publish_to_pypi https://upload.pypi.org/legacy/
}


function _publish_to_pypi {
local REPOSITORY_URL=$1

pushd dist

pushd sdist
local SDIST_ARCHIVE=$(find . -type f -name "*.tar.gz" -printf '%P\n')
twine upload --repository-url ${REPOSITORY_URL} ${SDIST_ARCHIVE} ${SDIST_ARCHIVE}.asc
popd

pushd bdist
local BDIST_ARCHIVE=$(find . -type f -name "*.whl" -printf '%P\n')
twine upload --repository-url ${REPOSITORY_URL} ${BDIST_ARCHIVE} ${BDIST_ARCHIVE}.asc
popd

popd
}


function _publish_to_apache_release {
local VERSION=$1
local RELEASE_DIR=${VERSION}-incubating # e.g. 0.1.0-incubating

echo "Publishing to Apache dist..."

local TMP_DIR=$(mktemp -d)
echo "Checking out ARIA dist dev to ${TMP_DIR}"
pushd ${TMP_DIR}

svn co https://dist.apache.org/repos/dist/dev/incubator/ariatosca/ ariatosca-dev
svn co https://dist.apache.org/repos/dist/release/incubator/ariatosca/ ariatosca-release
cp -r ariatosca-dev/${RELEASE_DIR} ariatosca-release

pushd ariatosca-release
svn add ${RELEASE_DIR}
# TODO: remove older releases?
svn commit -m "ARIA ${VERSION} release"
popd
popd
}


function _create_git_tag {
local VERSION=$1

echo "Creating git tag ${VERSION}"
git tag -a ${VERSION} -m "ARIA ${VERSION}"
git push --tags origin
}


function pushd {
command pushd "$@" > /dev/null
}



function popd {
command popd "$@" > /dev/null
}



if [ "$#" -ne 2 ]; then
echo "Usage: $0 {candidate,package} <git-branch>" >&2
exit 1
fi

OPERATION=$1
GIT_BRANCH=$2

if [ "${OPERATION}" == "candidate" ]; then
create_apache_release_candidate ${GIT_BRANCH}
elif [ "${OPERATION}" == "package" ]; then
finalize_apache_release ${GIT_BRANCH}
else
echo "First parameter must be either 'candidate' or 'package'" >&2
exit 1
fi

0 comments on commit 4c789f9

Please sign in to comment.