Files
pbr/tools/integration.sh
Stephen Finucane 3f9c3d4488 tests: Skip tests that break on newer setuptools
These are all broken on setuptools >= v80.0.0 due to the removal of
easy_install there. This solution is at most a stop-gap and we have a
bigger issue to resolve here - namely figuring out how to support these
once distros start packaging newer setuptools. However, it at least
unblocks the gate for us.

We also need to fix another issue, ensuring that we normalize
constraints as we do package names. This fixes issue with glance-store,
which is listed as 'glance_store' since [1].

[1] https://review.opendev.org/c/openstack/requirements/+/942508/

Change-Id: I599cb05706753c89f0ba74ee17446e62abd79b5d
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
2025-07-01 22:58:47 +01:00

242 lines
7.6 KiB
Bash

#!/bin/bash -xe
# Parameters:
# PBR_PIP_VERSION :- if not set, run pip's latest release, if set must be a
# valid reference file entry describing what pip to use.
# WHEELHOUSE :- if not set, use a temporary wheelhouse, set to a specific path
# to use an existing one.
# PIPFLAGS :- may be set to any pip global option for e.g. debugging.
# Bootstrappping the mkenv needs to install *a* pip
export PIPVERSION=pip
PIPFLAGS=${PIPFLAGS:-}
function mkvenv {
venv=$1
rm -rf $venv
virtualenv -p python3 $venv
$venv/bin/pip install $PIPFLAGS -U $PIPVERSION wheel
# If a change to PBR is being tested, preinstall the wheel for it
if [ -n "$PBR_CHANGE" ] ; then
$venv/bin/pip install $PIPFLAGS $pbrsdistdir/dist/pbr-*.whl
fi
}
# BASE should be a directory with a subdir called "openstack" and in that
# dir, there should be a git repository for every entry in PROJECTS
BASE=${BASE:-/home/zuul/src/opendev.org/}
REPODIR=${REPODIR:-$BASE/openstack}
# TODO: Figure out how to get this on to the box properly
sudo apt-get update
sudo apt-get install -y --force-yes libvirt-dev libxml2-dev libxslt-dev libmysqlclient-dev libpq-dev libnspr4-dev pkg-config libsqlite3-dev libffi-dev libldap2-dev libsasl2-dev ccache libkrb5-dev liberasurecode-dev libjpeg-dev libsystemd-dev libnss3-dev libssl-dev libpcre3-dev
# FOR pyyaml
sudo apt-get install -y --force-yes debhelper python3-all-dev python3-all-dbg libyaml-dev cython3 quilt
# And use ccache explitly
export PATH=/usr/lib/ccache:$PATH
tmpdir=$(mktemp -d)
# Set up a wheelhouse
export WHEELHOUSE=${WHEELHOUSE:-$tmpdir/.wheelhouse}
mkvenv $tmpdir/wheelhouse
# Specific PIP version - must succeed to be useful.
# - build/download a local wheel so we don't hit the network on each venv.
if [ -n "${PBR_PIP_VERSION:-}" ]; then
td=$(mktemp -d)
$tmpdir/wheelhouse/bin/pip wheel -w $td $PBR_PIP_VERSION
# This version will now be installed in every new venv.
export PIPVERSION="$td/$(ls $td)"
$tmpdir/wheelhouse/bin/pip install -U $PIPVERSION
# We have pip in global-requirements as open-ended requirements,
# but since we don't use -U in any other invocations, our version
# of pip should be sticky.
fi
# Build wheels for everything so we don't hit the network on each venv.
# Not all packages properly build wheels (httpretty for example).
# Do our best but ignore errors when making wheels.
set +e
$tmpdir/wheelhouse/bin/pip $PIPFLAGS wheel -w $WHEELHOUSE -f $WHEELHOUSE -r \
$REPODIR/requirements/global-requirements.txt
set -e
#BRANCH
BRANCH=${OVERRIDE_ZUUL_BRANCH=:-master}
# PROJECTS is a list of projects that we're testing
PROJECTS=$*
pbrsdistdir=$tmpdir/pbrsdist
git clone $REPODIR/pbr $pbrsdistdir
cd $pbrsdistdir
# Capture Zuul repo state info. Local master should be the current change.
# origin/master should refer to the parent of the current change. If they
# are the same then there is no change either from zuul or locally.
git --git-dir $REPODIR/pbr/.git show --format=oneline --no-patch master
git --git-dir $REPODIR/pbr/.git show --format=oneline --no-patch origin/master
# If there is no diff between the branches then there is no local change.
if ! git --git-dir $REPODIR/pbr/.git diff --quiet master..origin/master ; then
git show --format=oneline --no-patch HEAD
mkvenv wheel
# TODO(clarkb) switch to using build tool here
wheel/bin/pip install setuptools
wheel/bin/python setup.py bdist_wheel
PBR_CHANGE=1
fi
##### Test Project Installation #####
# Create a test project and install it multiple different ways
# using different tools to sanity check behavior is consistent
# with what expect and doesn't change.
# TODO(clarkb) Add test coverage for build and wheel tools too.
eptest=$tmpdir/eptest
mkdir $eptest
cd $eptest
cat <<EOF > setup.cfg
[metadata]
name = test_project
[entry_points]
console_scripts =
test_cmd = test_project:main
EOF
cat <<EOF > setup.py
import setuptools
setuptools.setup(
setup_requires=['pbr'],
pbr=True)
EOF
mkdir test_project
cat <<EOF > test_project/__init__.py
def main():
print("Test cmd")
EOF
eppbrdir=$tmpdir/eppbrdir
git clone $REPODIR/pbr $eppbrdir
function check_setuppy {
local checkname
checkname=$1
local epvenv
epvenv=$eptest/setuppyvenv_$checkname
mkvenv $epvenv
$epvenv/bin/pip $PIPFLAGS install -f $WHEELHOUSE -e $eppbrdir
# We install setuptools only in this venv to check setup.py
# behaviors.
$epvenv/bin/pip $PIPFLAGS install -f $WHEELHOUSE setuptools
# FIXME(stephenfin): This is broken with setuptools v80.0.0+ since that no
# longer invokes easy_install but rather defers to pip. In CI, we only see
# this failure on Noble or later, because Jammy's version of Python is too
# old for setuptools v80.0.0+
# First check develop
# PBR_VERSION=0.0 $epvenv/bin/python setup.py develop
# cat $epvenv/bin/test_cmd
# grep 'PBR Generated' $epvenv/bin/test_cmd
# $epvenv/bin/test_cmd | grep 'Test cmd'
# PBR_VERSION=0.0 $epvenv/bin/python setup.py develop --uninstall
# Now check install
PBR_VERSION=0.0 $epvenv/bin/python setup.py install
cat $epvenv/bin/test_cmd
grep 'PBR Generated' $epvenv/bin/test_cmd
$epvenv/bin/test_cmd | grep 'Test cmd'
}
function check_pip {
local checkname
checkname=$1
local epvenv
epvenv=$eptest/pipvenv_$checkname
mkvenv $epvenv
$epvenv/bin/pip $PIPFLAGS install -f $WHEELHOUSE -e $eppbrdir
# FIXME(stephenfin): This is broken with setuptools v80.0.0+ since that no
# longer invokes easy_install but rather defers to pip. In CI, we only see
# this failure on Noble or later, because Jammy's version of Python is too
# old for setuptools v80.0.0+
# First check develop
# PBR_VERSION=0.0 $epvenv/bin/pip install -e ./
# cat $epvenv/bin/test_cmd
# if [ -f ./pyproject.toml ] ; then
# # Pip dev installs with pyproject.toml build from editable wheels
# # which do not use PBR generated console scripts.
# grep 'from test_project import main' $epvenv/bin/test_cmd
# ! grep 'PBR Generated' $epvenv/bin/test_cmd
# else
# # Otherwise we should get the PBR generated script
# grep 'PBR Generated' $epvenv/bin/test_cmd
# fi
# $epvenv/bin/test_cmd | grep 'Test cmd'
# PBR_VERSION=0.0 $epvenv/bin/pip uninstall -y test-project
# Now check install
PBR_VERSION=0.0 $epvenv/bin/pip install ./
cat $epvenv/bin/test_cmd
# Pip installs install from wheel builds which do not use
# PBR generated console scripts.
grep 'from test_project import main' $epvenv/bin/test_cmd
! grep 'PBR Generated' $epvenv/bin/test_cmd
$epvenv/bin/test_cmd | grep 'Test cmd'
}
### No pyproject.toml ###
# Check setup.py behavior
check_setuppy nopyprojecttoml
# Check pip behavior
check_pip nopyprojecttoml
### pyproject.toml ###
# Now write a pyproject.toml and recheck the results.
# Note the pip install -e behavior differs.
cat <<EOF > pyproject.toml
[build-system]
requires = [
"pbr>=6.0.0",
"setuptools>=64.0.0",
]
build-backend = "pbr.build"
EOF
# Check setup.py behavior
check_setuppy pyprojecttoml
# Check pip behavior
check_pip pyprojecttoml
projectdir=$tmpdir/projects
mkdir -p $projectdir
sudo chown -R $USER $REPODIR
export PBR_INTEGRATION=1
export PIPFLAGS
export PIPVERSION
PBRVERSION=pbr
if [ -n "$PBR_CHANGE" ] ; then
PBRVERSION=$(ls $pbrsdistdir/dist/pbr-*.whl)
fi
export PBRVERSION
export PROJECTS
export REPODIR
export WHEELHOUSE
export OS_TEST_TIMEOUT=1200
cd $REPODIR/pbr
mkvenv .venv
source .venv/bin/activate
pip install -r test-requirements.txt
pip install ${REPODIR}/requirements
stestr run --suppress-attachments test_integration