0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-11-22 04:59:34 +01:00
mongodb/evergreen/functions/venv_setup.sh
Daniel Moody 1fd642bbc1 SERVER-93897 poetry cache clear needs yes input (#26430)
GitOrigin-RevId: ceeb2f15b777f70dbad67b75c63d9ca3ca4aa6bf
2024-08-22 19:38:34 +00:00

154 lines
4.8 KiB
Bash

# exit immediately if virtualenv is not found
set -o errexit
evergreen_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" > /dev/null 2>&1 && pwd)/.."
. "$evergreen_dir/prelude_workdir.sh"
. "$evergreen_dir/prelude_python.sh"
python_loc=$(which ${python})
echo "python_loc set to $python_loc"
venv_dir="${workdir}/venv"
if [ -d "$venv_dir" ]; then
exit 0
fi
# We create a venv for poetry
# We cannot install poetry into the same virtual enviorment as the rest of our tools
# If there is a conflict between poetry and our other deps windows fails to upgrade the package
# See issue SERVER-80781
POETRY_VENV="${workdir}/poetry_venv"
if [ "Windows_NT" = "$OS" ]; then
POETRY_VENV_PYTHON="$POETRY_VENV/Scripts/python.exe"
else
POETRY_VENV_PYTHON="$POETRY_VENV/bin/python3"
fi
"$python_loc" -m venv "$POETRY_VENV"
# Loop 5 times to retry the poetry install
# We have seen weird network errors that can sometimes mess up the pip install
# By retrying we would like to only see errors that happen consistently
if uname -a | grep -q 's390x\|ppc64le'; then
# s390x and ppc64le both require these old versions for some reason
# They are pinned deps as well
EXTRA_IBM_ARGS="cryptography==2.3 pyOpenSSL==19.0.0"
fi
poetry_dir="${workdir}/poetry_dir"
mkdir -p $poetry_dir
export POETRY_CONFIG_DIR="$poetry_dir/config"
export POETRY_DATA_DIR="$poetry_dir/data"
export POETRY_CACHE_DIR="$poetry_dir/cache"
export PIP_CACHE_DIR="$poetry_dir/pip_cache"
for i in {1..5}; do
$POETRY_VENV_PYTHON -m pip install "poetry==1.8.3" ${EXTRA_IBM_ARGS} && RET=0 && break || RET=$? && sleep 1
echo "Python failed to install poetry, retrying..."
done
if [ $RET -ne 0 ]; then
echo "Pip install error for poetry"
exit $RET
fi
"$python_loc" -m venv "$venv_dir"
# Adding README file for using this venv locally
cat << EOF >> venv_readme.txt
This is an archive of the Python venv generated by this Evergreen build.
You can use it locally to avoid needing to manually set up the Python environment.
Before activating it you should adjust it for your local environment.
Run the following commands to do that:
echo "Updating virtual env directory in activate script"
pushd venv; venv_dir=\$(pwd); popd
EOF
if [ "Windows_NT" = "$OS" ]; then
cat << EOF >> venv_readme.txt
sed -i -e "s:VIRTUAL_ENV=\".*\":VIRTUAL_ENV=\"\$venv_dir\":" "\$venv_dir/Scripts/activate"
EOF
else
cat << EOF >> venv_readme.txt
sed -i -e "s:VIRTUAL_ENV=\".*\":VIRTUAL_ENV=\"\$venv_dir\":" "\$venv_dir/bin/activate"
echo "Adding back python symlinks"
pushd venv/bin
rm python python3
ln -s "$python_loc" python3
ln -s python3 python
python3_dot_locs=\$(ls python3.*)
for p in \$python3_dot_locs; do
rm "\$p"
ln -s python3 "\$p"
done
popd
EOF
fi # End of README file
# venv creates its Scripts/activate file with CLRF endings, which
# cygwin bash does not like. dos2unix it
# (See https://bugs.python.org/issue32451)
if [ "Windows_NT" = "$OS" ]; then
dos2unix "${workdir}/venv/Scripts/activate"
fi
export VIRTUAL_ENV_DISABLE_PROMPT=yes
# the whole prelude cannot be imported because it requires pyyaml to be
# installed, which happens just below.
. "$evergreen_dir/prelude_venv.sh"
activate_venv
echo "Upgrading pip to 21.0.1"
# Loop 5 times to retry the pip install
# We have seen weird network errors that can sometimes mess up the pip install
# By retrying we would like to only see errors that happen consistently
for i in {1..5}; do
python -m pip --disable-pip-version-check install "pip==21.0.1" "wheel==0.37.0" && RET=0 && break || RET=$? && sleep 1
echo "Python failed to install pip and wheel, retrying..."
done
if [ $RET -ne 0 ]; then
echo "Pip install error for wheel and pip version"
exit $RET
fi
cd src
# Loop 5 times to retry full venv install
# We have seen weird network errors that can sometimes mess up the pip install
# By retrying we would like to only see errors that happen consistently
count=0
for i in {1..5}; do
yes | $POETRY_VENV_PYTHON -m poetry cache clear . --all
rm -rf $poetry_dir/*
$POETRY_VENV_PYTHON -m poetry install --no-root --sync && RET=0 && break || RET=$? && sleep 1
echo "Python failed install required deps with poetry, retrying..."
sleep $((count * count * 20))
count=$((count + 1))
done
if [ $RET -ne 0 ]; then
echo "Poetry install error for full venv"
exit $RET
fi
# poetry will install cryptography in an isolated build environment
# to conform to pep517, however this doesn't work for the old cryptography
# version on these platforms, and ends up not building required shared libraries.
# Here we go behing poetry's back and install with pip
if uname -a | grep -q 's390x\|ppc64le'; then
for i in {1..5}; do
python -m pip uninstall -y cryptography==2.3 || true
python -m pip install cryptography==2.3 && RET=0 && break || RET=$? && sleep 1
done
if [ $RET -ne 0 ]; then
echo "cryptography install error for full venv"
exit $RET
fi
fi
cd ..
python -m pip freeze > pip-requirements.txt