Try to prevent interference with setup-python #969
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: tests | |
on: | |
merge_group: | |
push: | |
branches-ignore: | |
# temporary GH branches relating to merge queues (jaraco/skeleton#93) | |
- gh-readonly-queue/** | |
tags: | |
# required if branches-ignore is supplied (jaraco/skeleton#103) | |
- '**' | |
pull_request: | |
workflow_dispatch: | |
concurrency: | |
group: >- | |
${{ github.workflow }}- | |
${{ github.ref_type }}- | |
${{ github.event.pull_request.number || github.sha }} | |
cancel-in-progress: true | |
permissions: | |
contents: read | |
env: | |
# Environment variable to support color support (jaraco/skeleton#66) | |
FORCE_COLOR: 1 | |
# Suppress noisy pip warnings | |
PIP_DISABLE_PIP_VERSION_CHECK: 'true' | |
PIP_NO_PYTHON_VERSION_WARNING: 'true' | |
PIP_NO_WARN_SCRIPT_LOCATION: 'true' | |
# Ensure tests can sense settings about the environment | |
TOX_OVERRIDE: >- | |
testenv.pass_env+=GITHUB_*,FORCE_COLOR | |
jobs: | |
test: | |
strategy: | |
# https://blog.jaraco.com/efficient-use-of-ci-resources/ | |
matrix: | |
python: | |
- "3.8" | |
- "3.12" | |
platform: | |
- ubuntu-latest | |
- macos-latest | |
- windows-latest | |
include: | |
- python: "3.9" | |
platform: ubuntu-latest | |
- python: "3.10" | |
platform: ubuntu-latest | |
- python: "3.11" | |
platform: ubuntu-latest | |
- python: pypy3.10 | |
platform: ubuntu-latest | |
distutils: stdlib | |
- platform: ubuntu-latest | |
python: "3.10" | |
distutils: stdlib | |
runs-on: ${{ matrix.platform }} | |
continue-on-error: ${{ matrix.python == '3.13' }} | |
env: | |
SETUPTOOLS_USE_DISTUTILS: ${{ matrix.distutils || 'local' }} | |
timeout-minutes: 75 | |
steps: | |
- name: Setup Python | |
id: python-install | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python }} | |
allow-prereleases: true | |
- uses: actions/checkout@v4 | |
- uses: actions/cache@v4 | |
id: cache | |
with: | |
path: setuptools/tests/config/downloads/*.cfg | |
key: >- | |
${{ hashFiles('setuptools/tests/config/setupcfg_examples.txt') }}- | |
${{ hashFiles('setuptools/tests/config/downloads/*.py') }} | |
- name: Populate download cache | |
if: steps.cache.outputs.cache-hit != 'true' | |
working-directory: setuptools/tests/config | |
run: python -m downloads.preload setupcfg_examples.txt | |
- name: Pre-build distributions for test | |
shell: bash | |
run: | | |
rm -rf dist | |
# workaround for pypa/setuptools#4333 | |
pipx run --pip-args 'pyproject-hooks!=1.1' build | |
echo "PRE_BUILT_SETUPTOOLS_SDIST=$(ls dist/*.tar.gz)" >> $GITHUB_ENV | |
echo "PRE_BUILT_SETUPTOOLS_WHEEL=$(ls dist/*.whl)" >> $GITHUB_ENV | |
rm -rf setuptools.egg-info # Avoid interfering with the other tests | |
- name: Workaround for unreleased PyNaCl (pyca/pynacl#805) | |
if: contains(matrix.python, 'pypy') | |
run: echo "SETUPTOOLS_ENFORCE_DEPRECATION=0" >> $GITHUB_ENV | |
- name: Install tox | |
run: python -m pip install tox | |
- name: Run | |
run: tox | |
- name: Create coverage report | |
if: hashFiles('.coverage') != '' # Rudimentary `file.exists()` | |
run: pipx run coverage xml --ignore-errors | |
- name: Publish coverage | |
if: hashFiles('coverage.xml') != '' # Rudimentary `file.exists()` | |
uses: codecov/codecov-action@v4 | |
with: | |
flags: >- # Mark which lines are covered by which envs | |
CI-GHA, | |
${{ github.job }}, | |
OS-${{ runner.os }}, | |
VM-${{ matrix.platform }}, | |
Py-${{ steps.python-install.outputs.python-version }} | |
token: ${{ secrets.CODECOV_TOKEN }} | |
collateral: | |
strategy: | |
fail-fast: false | |
matrix: | |
job: | |
- diffcov | |
- docs | |
- check-extern | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: 3.x | |
- name: Install tox | |
run: python -m pip install tox | |
- name: Eval ${{ matrix.job }} | |
run: tox -e ${{ matrix.job }} | |
check: # This job does nothing and is only used for the branch protection | |
if: always() | |
needs: | |
- integration-test | |
- test | |
- collateral | |
- test_cygwin | |
runs-on: ubuntu-latest | |
steps: | |
- name: Decide whether the needed jobs succeeded or failed | |
uses: re-actors/alls-green@release/v1 | |
with: | |
allowed-skips: integration-test | |
jobs: ${{ toJSON(needs) }} | |
test_cygwin: | |
strategy: | |
matrix: | |
python: | |
- 39 | |
platform: | |
- windows-latest | |
runs-on: ${{ matrix.platform }} | |
timeout-minutes: 75 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install Cygwin with Python | |
uses: cygwin/cygwin-install-action@v4 | |
with: | |
platform: x86_64 | |
packages: >- | |
python${{ matrix.python }}, | |
python${{ matrix.python }}-devel, | |
python${{ matrix.python }}-tox, | |
gcc-core, | |
git, | |
- name: Record the currently selected Python version | |
id: python-install | |
# NOTE: This roughly emulates what `actions/setup-python` provides | |
# NOTE: except the action gets the version from the installation path | |
# NOTE: on disk and we get it from runtime. | |
run: | | |
python -c 'import platform; print("python-version=" + platform.python_version())' >> ${GITHUB_OUTPUT} | |
shell: C:\cygwin\bin\env.exe CYGWIN_NOWINPATH=1 CHERE_INVOKING=1 C:\cygwin\bin\bash.exe -leo pipefail -o igncr {0} | |
- name: Run tests | |
shell: C:\cygwin\bin\env.exe CYGWIN_NOWINPATH=1 CHERE_INVOKING=1 C:\cygwin\bin\bash.exe -leo pipefail -o igncr {0} | |
run: | | |
git config --global --add safe.directory "$(cygpath -u "$GITHUB_WORKSPACE")" # workaround for #3408 | |
tox | |
- name: Create coverage report | |
if: hashFiles('.coverage') != '' # Rudimentary `file.exists()` | |
run: | | |
python -m pip install coverage | |
python -m coverage xml --ignore-errors | |
shell: C:\cygwin\bin\env.exe CYGWIN_NOWINPATH=1 CHERE_INVOKING=1 C:\cygwin\bin\bash.exe -leo pipefail -o igncr {0} | |
- name: Publish coverage | |
if: hashFiles('coverage.xml') != '' # Rudimentary `file.exists()` | |
uses: codecov/codecov-action@v4 | |
with: | |
files: >- | |
${{ github.workspace }}\coverage.xml | |
flags: >- # Mark which lines are covered by which envs | |
CI-GHA, | |
${{ github.job }}, | |
OS-${{ runner.os }}, | |
VM-${{ matrix.platform }}, | |
Py-${{ steps.python-install.outputs.python-version }} | |
token: ${{ secrets.CODECOV_TOKEN }} | |
integration-test: | |
needs: test | |
if: github.event_name == 'workflow_dispatch' || (github.event_name == 'push' && contains(github.ref, 'refs/tags/')) | |
# To avoid long times and high resource usage, we assume that: | |
# 1. The setuptools APIs used by packages don't vary too much with OS or | |
# Python implementation | |
# 2. Any circumstance for which the previous assumption is not valid is | |
# already tested via unit tests (or other tests not classified here as | |
# "integration") | |
# With that in mind, the integration tests can run for a single setup | |
runs-on: ubuntu-latest | |
timeout-minutes: 75 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install OS-level dependencies | |
run: | | |
sudo apt-get update | |
sudo apt-get install build-essential gfortran libopenblas-dev libyaml-dev | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
# Use a release that is not very new but still have a long life: | |
python-version: "3.10" | |
- name: Install tox | |
run: | | |
python -m pip install tox | |
- name: Run integration tests | |
run: tox -e integration | |
release: | |
permissions: | |
contents: write | |
needs: | |
- check | |
if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') | |
runs-on: ubuntu-latest | |
timeout-minutes: 75 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: 3.x | |
- name: Install tox | |
run: python -m pip install tox | |
- name: Run | |
run: tox -e release | |
env: | |
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |