1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
#!/bin/bash
set -ex
function get_source_version() {
grep "__version__ = '.*'" python/google/protobuf/__init__.py | sed -r "s/__version__ = '(.*)'/\1/"
}
function run_install_test() {
local VERSION=$1
local PYTHON=$2
local PYPI=$3
virtualenv -p `which $PYTHON` test-venv
# Intentionally put a broken protoc in the path to make sure installation
# doesn't require protoc installed.
touch test-venv/bin/protoc
chmod +x test-venv/bin/protoc
source test-venv/bin/activate
(pip install -i ${PYPI} protobuf==${VERSION} --no-cache-dir) || (retry_pip_install ${PYPI} ${VERSION})
deactivate
rm -fr test-venv
}
function retry_pip_install() {
local PYPI=$1
local VERSION=$2
read -p "pip install failed, possibly due to delay between upload and availability on pip. Retry? [y/n]" -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
(pip install -i ${PYPI} protobuf==${VERSION} --no-cache-dir) || (retry_pip_install ${PYPI} ${VERSION})
}
[ $# -lt 1 ] && {
echo "Usage: $0 VERSION ["
echo ""
echo "Examples:"
echo " Test 3.3.0 release using version number 3.3.0.dev1:"
echo " $0 3.0.0 dev1"
echo " Actually release 3.3.0 to PyPI:"
echo " $0 3.3.0"
exit 1
}
VERSION=$1
DEV=$2
# Make sure we are in a protobuf source tree.
[ -f "python/google/protobuf/__init__.py" ] || {
echo "This script must be ran under root of protobuf source tree."
exit 1
}
# Make sure all files are world-readable.
find python -type d -exec chmod a+r,a+x {} +
find python -type f -exec chmod a+r {} +
umask 0022
# Check that the supplied version number matches what's inside the source code.
SOURCE_VERSION=`get_source_version`
[ "${VERSION}" == "${SOURCE_VERSION}" -o "${VERSION}.${DEV}" == "${SOURCE_VERSION}" ] || {
echo "Version number specified on the command line ${VERSION} doesn't match"
echo "the actual version number in the source code: ${SOURCE_VERSION}"
exit 1
}
TESTING_ONLY=1
TESTING_VERSION=${VERSION}.${DEV}
if [ -z "${DEV}" ]; then
read -p "You are releasing ${VERSION} to PyPI. Are you sure? [y/n]" -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
TESTING_ONLY=0
TESTING_VERSION=${VERSION}
else
# Use dev version number for testing.
sed -i -r "s/__version__ = '.*'/__version__ = '${VERSION}.${DEV}'/" python/google/protobuf/__init__.py
fi
# Copy LICENSE
cp LICENSE python/LICENSE
cd python
# Run tests locally.
python3 setup.py build
python3 setup.py test
# Deploy source package to testing PyPI
python3 setup.py sdist
twine upload --skip-existing -r testpypi -u protobuf-wheel-test dist/*
# Sleep to allow time for distribution to be available on pip.
sleep 5m
# Test locally.
run_install_test ${TESTING_VERSION} python3 https://test.pypi.org/simple
# Deploy egg/wheel packages to testing PyPI and test again.
python3 setup.py clean build bdist_wheel
twine upload --skip-existing -r testpypi -u protobuf-wheel-test dist/*
sleep 5m
run_install_test ${TESTING_VERSION} python3 https://test.pypi.org/simple
echo "All install tests have passed using testing PyPI."
if [ $TESTING_ONLY -eq 0 ]; then
read -p "Publish to PyPI? [y/n]" -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
echo "Publishing to PyPI..."
# Be sure to run build before sdist, because otherwise sdist will not include
# well-known types.
python3 setup.py clean build sdist
twine upload --skip-existing -u protobuf-packages dist/*
# Be sure to run clean before bdist_xxx, because otherwise bdist_xxx will
# include files you may not want in the package. E.g., if you have built
# and tested with --cpp_implemenation, bdist_xxx will include the _message.so
# file even when you no longer pass the --cpp_implemenation flag. See:
# https://github.com/protocolbuffers/protobuf/issues/3042
python3 setup.py clean build bdist_wheel
twine upload --skip-existing -u protobuf-packages dist/*
else
# Set the version number back (i.e., remove dev suffix).
sed -i -r "s/__version__ = '.*'/__version__ = '${VERSION}'/" google/protobuf/__init__.py
fi
|