install-deps: use system pip and bindep for installing dependencies

Updating pip was required long ago to work around Ubuntu and CentOS 7
problems. Now even CentOS 8 has pip 9.0 which should be enough for us.

Also moving binary dependencies to bindep and install them before
we try to install Python dependencies (to be able to compile them).

Workarounds is needed for segfault on Ubuntu because of cryptography:
remove python3-cryptography package and avoid --ignore-installed.

This change makes install-deps work on openSUSE again.

Change-Id: Ib9b81075f35068c046880de46b20f98ef71a8d8e
This commit is contained in:
Dmitry Tantsur 2020-05-25 14:01:27 +02:00
parent 8b7a41e247
commit a381b0f9c0
3 changed files with 28 additions and 76 deletions

View File

@ -15,10 +15,14 @@ mariadb [platform:suse]
mariadb-server [platform:redhat platform:dpkg] mariadb-server [platform:redhat platform:dpkg]
net-tools net-tools
python3 [platform:rpm] python3 [platform:rpm]
python3-apt [platform:dpkg]
python3-minimal [platform:dpkg] python3-minimal [platform:dpkg]
python3-devel [platform:rpm] python3-devel [platform:rpm]
python3-dev [platform:dpkg] python3-dev [platform:dpkg]
python3-dnf [platform:fedora]
python3-venv [platform:dpkg] python3-venv [platform:dpkg]
python3-xml [platform:suse]
redhat-rpm-config [platform:fedora]
wget wget
sudo sudo
ebtables ebtables

View File

@ -11,7 +11,7 @@ ANSIBLE_PIP_VERSION=${ANSIBLE_PIP_VERSION:-${DEFAULT_PIP_ANSIBLE}}
ANSIBLE_SOURCE_PATH=${ANSIBLE_SOURCE_PATH:-ansible${ANSIBLE_PIP_VERSION}} ANSIBLE_SOURCE_PATH=${ANSIBLE_SOURCE_PATH:-ansible${ANSIBLE_PIP_VERSION}}
if [ -n "${VENV-}" ]; then if [ -n "${VENV-}" ]; then
sudo ${PIP} install --ignore-installed "${ANSIBLE_SOURCE_PATH}" sudo -H -E ${PIP} install "${ANSIBLE_SOURCE_PATH}"
ANSIBLE=${VENV}/bin/ansible ANSIBLE=${VENV}/bin/ansible
else else
${PIP} install --user --upgrade "${ANSIBLE_SOURCE_PATH}" ${PIP} install --user --upgrade "${ANSIBLE_SOURCE_PATH}"

View File

@ -7,15 +7,9 @@ declare -A PKG_MAP
export LANG=c export LANG=c
CHECK_CMD_PKGS=( CHECK_CMD_PKGS=(
gcc
libffi
libopenssl
lsb-release
make
net-tools
python3-devel python3-devel
python3 python3
wget python3-pip
) )
source /etc/os-release || source /usr/lib/os-release source /etc/os-release || source /usr/lib/os-release
@ -25,17 +19,11 @@ case ${ID,,} in
INSTALLER_CMD="sudo -H -E zypper install -y --no-recommends" INSTALLER_CMD="sudo -H -E zypper install -y --no-recommends"
CHECK_CMD="zypper search --match-exact --installed" CHECK_CMD="zypper search --match-exact --installed"
PKG_MAP=( PKG_MAP=(
[gcc]=gcc [python3]=python3
[libffi]=libffi-devel [python3-devel]=python3-devel
[libopenssl]=libopenssl-devel [python3-pip]=python3-pip
[lsb-release]=lsb-release
[make]=make
[net-tools]=net-tools
[python]=python
[python-devel]=python-devel
[wget]=wget
) )
EXTRA_PKG_DEPS=( python-xml ) EXTRA_PKG_DEPS=()
# netstat moved to net-tools-deprecated in Leap 15 # netstat moved to net-tools-deprecated in Leap 15
[[ ${VERSION%%.*} -lt 42 ]] && EXTRA_PKG_DEPS+=( net-tools-deprecated ) [[ ${VERSION%%.*} -lt 42 ]] && EXTRA_PKG_DEPS+=( net-tools-deprecated )
sudo zypper -n ref sudo zypper -n ref
@ -52,19 +40,17 @@ case ${ID,,} in
INSTALLER_CMD="sudo -H -E apt-get -y install" INSTALLER_CMD="sudo -H -E apt-get -y install"
CHECK_CMD="dpkg -l" CHECK_CMD="dpkg -l"
PKG_MAP=( PKG_MAP=(
[gcc]=gcc
[libffi]=libffi-dev
[libopenssl]=libssl-dev
[lsb-release]=lsb-release
[make]=make
[net-tools]=net-tools
[python3]=python3-minimal [python3]=python3-minimal
[python3-devel]=libpython3-dev [python3-devel]=libpython3-dev
[wget]=wget [python3-pip]=python3-pip
[venv]=python3-venv
) )
EXTRA_PKG_DEPS=( python3-apt python3-pip ) EXTRA_PKG_DEPS=( python3-venv )
sudo apt-get update sudo apt-get update
# NOTE(dtantsur): workaround for segfault when installing cryptography:
# https://github.com/pyca/cryptography/issues/3815
if $(${CHECK_CMD} python3-cryptography &> /dev/null); then
sudo -E apt-get remove -y python3-cryptography
fi
;; ;;
rhel|fedora|centos) rhel|fedora|centos)
@ -73,21 +59,12 @@ case ${ID,,} in
INSTALLER_CMD="sudo -H -E ${PKG_MANAGER} -y install" INSTALLER_CMD="sudo -H -E ${PKG_MANAGER} -y install"
CHECK_CMD="rpm -q" CHECK_CMD="rpm -q"
PKG_MAP=( PKG_MAP=(
[gcc]=gcc
[libffi]=libffi-devel
[libopenssl]=openssl-devel
[lsb-release]=redhat-lsb
[make]=make
[net-tools]=net-tools
[python3]=python3 [python3]=python3
[python3-devel]=python3-devel [python3-devel]=python3-devel
[wget]=wget [python3-pip]=python3-pip
) )
EXTRA_PKG_DEPS=() EXTRA_PKG_DEPS=()
sudo -E ${PKG_MANAGER} updateinfo sudo -E ${PKG_MANAGER} updateinfo
if $(grep -q Fedora /etc/redhat-release); then
EXTRA_PKG_DEPS="python3-dnf redhat-rpm-config"
fi
;; ;;
*) echo "ERROR: Supported package manager not found. Supported: apt, dnf, yum, zypper"; exit 1;; *) echo "ERROR: Supported package manager not found. Supported: apt, dnf, yum, zypper"; exit 1;;
@ -102,19 +79,6 @@ if env | grep -q ^ZUUL; then
fi fi
fi fi
if ! $(python3 --version &>/dev/null); then
${INSTALLER_CMD} ${PKG_MAP[python3]}
fi
if ! $(gcc -v &>/dev/null); then
${INSTALLER_CMD} ${PKG_MAP[gcc]}
fi
if ! $(wget --version &>/dev/null); then
${INSTALLER_CMD} ${PKG_MAP[wget]}
fi
if [ -n "${VENV-}" -a "${OS_FAMILY}" == "Debian" ]; then
${INSTALLER_CMD} ${PKG_MAP[venv]}
fi
for pkg in ${CHECK_CMD_PKGS[@]}; do for pkg in ${CHECK_CMD_PKGS[@]}; do
if ! $(${CHECK_CMD} ${PKG_MAP[$pkg]} &>/dev/null); then if ! $(${CHECK_CMD} ${PKG_MAP[$pkg]} &>/dev/null); then
${INSTALLER_CMD} ${PKG_MAP[$pkg]} ${INSTALLER_CMD} ${PKG_MAP[$pkg]}
@ -149,28 +113,14 @@ fi
# keeping the path even with -E. # keeping the path even with -E.
PYTHON=$(which python3) PYTHON=$(which python3)
# To install python packages, we need pip.
#
# We can't use the apt packaged version of pip since
# older versions of pip are incompatible with
# requests, one of our indirect dependencies (bug 1459947).
#
ls $PYTHON ls $PYTHON
$PYTHON << EOF
import pip
version = tuple(map(int, pip.__version__.split('.')))
assert version >= (7, 1)
EOF
# workaround for PEP517 issue export PIP_OPTS="--upgrade-strategy only-if-needed"
PYTHON_VER=$($PYTHON -V)
if [[ $PYTHON_VER == "Python 3.6.8" ]]; then
sudo -H -E $PYTHON -m pip install pip==19.0
export PIP_OPTS=""
else
sudo -H -E $PYTHON -m pip install -U pip --ignore-installed
export PIP_OPTS="--upgrade-strategy only-if-needed"
fi
if [ "$?" != "0" ]; then
wget -O /tmp/get-pip.py https://bootstrap.pypa.io/3.4/get-pip.py
sudo -H -E ${PYTHON} /tmp/get-pip.py
fi
if [ -n "${VENV-}" ]; then if [ -n "${VENV-}" ]; then
ls -la ${VENV}/bin ls -la ${VENV}/bin
@ -178,16 +128,14 @@ fi
PIP=$(echo $PYTHON | sed 's/python/pip/') PIP=$(echo $PYTHON | sed 's/python/pip/')
if [ "$OS_FAMILY" == "RedHat" ]; then
sudo -H -E ${PIP} freeze
sudo -H -E ${PIP} install --ignore-installed pyparsing ipaddress
fi
sudo -H -E ${PIP} install -r "$(dirname $0)/../requirements.txt"
# Install the rest of required packages using bindep # Install the rest of required packages using bindep
sudo -H -E ${PIP} install bindep sudo -H -E ${PIP} install bindep
echo "Using Bindep to install binary dependencies..." echo "Using Bindep to install binary dependencies..."
# bindep returns 1 if packages are missing # bindep returns 1 if packages are missing
bindep -b &> /dev/null || ${INSTALLER_CMD} $(bindep -b) bindep -b &> /dev/null || ${INSTALLER_CMD} $(bindep -b)
echo "Installing Python requirements"
sudo -H -E ${PIP} install -r "$(dirname $0)/../requirements.txt"
echo "Completed installation of basic dependencies." echo "Completed installation of basic dependencies."