mirror of
https://github.com/python/cpython.git
synced 2026-01-06 15:32:22 +00:00
Check that users don't push changes with outdated or patched autoconf. The presence of runstatedir option and aclocal 1.16.3 are good markers. Use my container image to regenerate autoconf files. "Check for changes" will fail later when any file is regenerated. Use ccache in check_generated_files to speed up testing.
305 lines
12 KiB
YAML
305 lines
12 KiB
YAML
name: Tests
|
|
|
|
# bpo-40548: "paths-ignore" is not used to skip documentation-only PRs, because
|
|
# it prevents to mark a job as mandatory. A PR cannot be merged if a job is
|
|
# mandatory but not scheduled because of "paths-ignore".
|
|
on:
|
|
workflow_dispatch:
|
|
push:
|
|
branches:
|
|
- 'main'
|
|
- '3.10'
|
|
- '3.9'
|
|
- '3.8'
|
|
- '3.7'
|
|
pull_request:
|
|
branches:
|
|
- 'main'
|
|
- '3.10'
|
|
- '3.9'
|
|
- '3.8'
|
|
- '3.7'
|
|
|
|
jobs:
|
|
check_source:
|
|
name: 'Check for source changes'
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
run_tests: ${{ steps.check.outputs.run_tests }}
|
|
run_ssl_tests: ${{ steps.check.outputs.run_ssl_tests }}
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Check for source changes
|
|
id: check
|
|
run: |
|
|
if [ -z "$GITHUB_BASE_REF" ]; then
|
|
echo '::set-output name=run_tests::true'
|
|
echo '::set-output name=run_ssl_tests::true'
|
|
else
|
|
git fetch origin $GITHUB_BASE_REF --depth=1
|
|
# git diff "origin/$GITHUB_BASE_REF..." (3 dots) may be more
|
|
# reliable than git diff "origin/$GITHUB_BASE_REF.." (2 dots),
|
|
# but it requires to download more commits (this job uses
|
|
# "git fetch --depth=1").
|
|
#
|
|
# git diff "origin/$GITHUB_BASE_REF..." (3 dots) works with Git
|
|
# 2.26, but Git 2.28 is stricter and fails with "no merge base".
|
|
#
|
|
# git diff "origin/$GITHUB_BASE_REF.." (2 dots) should be enough on
|
|
# GitHub, since GitHub starts by merging origin/$GITHUB_BASE_REF
|
|
# into the PR branch anyway.
|
|
#
|
|
# https://github.com/python/core-workflow/issues/373
|
|
git diff --name-only origin/$GITHUB_BASE_REF.. | grep -qvE '(\.rst$|^Doc|^Misc)' && echo '::set-output name=run_tests::true' || true
|
|
git diff --name-only origin/$GITHUB_BASE_REF.. | grep -qE '(ssl|hashlib|hmac|^.github)' && echo '::set-output name=run_ssl_tests::true' || true
|
|
fi
|
|
|
|
check_generated_files:
|
|
name: 'Check if generated files are up to date'
|
|
runs-on: ubuntu-latest
|
|
needs: check_source
|
|
if: needs.check_source.outputs.run_tests == 'true'
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- uses: actions/setup-python@v2
|
|
- name: Install Dependencies
|
|
run: sudo ./.github/workflows/posix-deps-apt.sh
|
|
- name: Add ccache to PATH
|
|
run: echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV
|
|
- name: Configure ccache action
|
|
uses: hendrikmuhs/ccache-action@v1
|
|
- name: Check Autoconf version 2.69 and aclocal 1.16.3
|
|
run: |
|
|
grep "Generated by GNU Autoconf 2.69" configure
|
|
grep "aclocal 1.16.3" aclocal.m4
|
|
grep -q "runstatedir" configure
|
|
grep -q "PKG_PROG_PKG_CONFIG" aclocal.m4
|
|
- name: Regenerate autoconf files
|
|
run: docker run --rm -v $(pwd):/src quay.io/tiran/cpython_autoconf:269
|
|
- name: Build CPython
|
|
run: |
|
|
# Build Python with the libpython dynamic library
|
|
./configure --with-pydebug --enable-shared
|
|
make -j4 regen-all
|
|
make regen-stdlib-module-names
|
|
- name: Check for changes
|
|
run: |
|
|
git add -u
|
|
changes=$(git status --porcelain)
|
|
# Check for changes in regenerated files
|
|
if test -n "$changes"; then
|
|
echo "Generated files not up to date."
|
|
echo "Perhaps you forgot to run make regen-all or build.bat --regen. ;)"
|
|
echo "configure files must be regenerated with a specific, unpatched version of autoconf."
|
|
echo "$changes"
|
|
exit 1
|
|
fi
|
|
- name: Check exported libpython symbols
|
|
run: make smelly
|
|
- name: Check limited ABI symbols
|
|
run: make check-limited-abi
|
|
|
|
build_win32:
|
|
name: 'Windows (x86)'
|
|
runs-on: windows-latest
|
|
needs: check_source
|
|
if: needs.check_source.outputs.run_tests == 'true'
|
|
env:
|
|
IncludeUwp: 'true'
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Build CPython
|
|
run: .\PCbuild\build.bat -e -p Win32
|
|
- name: Display build info
|
|
run: .\python.bat -m test.pythoninfo
|
|
- name: Tests
|
|
run: .\PCbuild\rt.bat -p Win32 -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0
|
|
|
|
build_win_amd64:
|
|
name: 'Windows (x64)'
|
|
runs-on: windows-latest
|
|
needs: check_source
|
|
if: needs.check_source.outputs.run_tests == 'true'
|
|
env:
|
|
IncludeUwp: 'true'
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Register MSVC problem matcher
|
|
run: echo "::add-matcher::.github/problem-matchers/msvc.json"
|
|
- name: Build CPython
|
|
run: .\PCbuild\build.bat -e -p x64
|
|
- name: Display build info
|
|
run: .\python.bat -m test.pythoninfo
|
|
- name: Tests
|
|
run: .\PCbuild\rt.bat -p x64 -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0
|
|
|
|
build_macos:
|
|
name: 'macOS'
|
|
runs-on: macos-latest
|
|
needs: check_source
|
|
if: needs.check_source.outputs.run_tests == 'true'
|
|
env:
|
|
PYTHONSTRICTEXTENSIONBUILD: 1
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Prepare homebrew environment variables
|
|
run: |
|
|
echo "LDFLAGS=-L$(brew --prefix tcl-tk)/lib" >> $GITHUB_ENV
|
|
echo "PKG_CONFIG_PATH=$(brew --prefix openssl@1.1)/lib/pkgconfig:$(brew --prefix tcl-tk)/lib/pkgconfig" >> $GITHUB_ENV
|
|
- name: Configure CPython
|
|
run: ./configure --with-pydebug --prefix=/opt/python-dev
|
|
- name: Build CPython
|
|
run: make -j4
|
|
- name: Display build info
|
|
run: make pythoninfo
|
|
- name: Tests
|
|
run: make buildbottest TESTOPTS="-j4 -uall,-cpu"
|
|
|
|
build_ubuntu:
|
|
name: 'Ubuntu'
|
|
runs-on: ubuntu-20.04
|
|
needs: check_source
|
|
if: needs.check_source.outputs.run_tests == 'true'
|
|
env:
|
|
OPENSSL_VER: 1.1.1l
|
|
PYTHONSTRICTEXTENSIONBUILD: 1
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Register gcc problem matcher
|
|
run: echo "::add-matcher::.github/problem-matchers/gcc.json"
|
|
- name: Install Dependencies
|
|
run: sudo ./.github/workflows/posix-deps-apt.sh
|
|
- name: Configure OpenSSL env vars
|
|
run: |
|
|
echo "MULTISSL_DIR=${GITHUB_WORKSPACE}/multissl" >> $GITHUB_ENV
|
|
echo "OPENSSL_DIR=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}" >> $GITHUB_ENV
|
|
echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV
|
|
- name: 'Restore OpenSSL build'
|
|
id: cache-openssl
|
|
uses: actions/cache@v2.1.6
|
|
with:
|
|
path: ./multissl/openssl/${{ env.OPENSSL_VER }}
|
|
key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }}
|
|
- name: Install OpenSSL
|
|
if: steps.cache-openssl.outputs.cache-hit != 'true'
|
|
run: python3 Tools/ssl/multissltests.py --steps=library --base-directory $MULTISSL_DIR --openssl $OPENSSL_VER --system Linux
|
|
- name: Add ccache to PATH
|
|
run: |
|
|
echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV
|
|
- name: Configure ccache action
|
|
uses: hendrikmuhs/ccache-action@v1
|
|
- name: Setup directory envs for out-of-tree builds
|
|
run: |
|
|
echo "CPYTHON_RO_SRCDIR=$(realpath -m ${GITHUB_WORKSPACE}/../cpython-ro-srcdir)" >> $GITHUB_ENV
|
|
echo "CPYTHON_BUILDDIR=$(realpath -m ${GITHUB_WORKSPACE}/../cpython-builddir)" >> $GITHUB_ENV
|
|
- name: Create directories for read-only out-of-tree builds
|
|
run: mkdir -p $CPYTHON_RO_SRCDIR $CPYTHON_BUILDDIR
|
|
- name: Bind mount sources read-only
|
|
run: sudo mount --bind -o ro $GITHUB_WORKSPACE $CPYTHON_RO_SRCDIR
|
|
- name: Configure CPython out-of-tree
|
|
working-directory: ${{ env.CPYTHON_BUILDDIR }}
|
|
run: ../cpython-ro-srcdir/configure --with-pydebug --with-openssl=$OPENSSL_DIR
|
|
- name: Build CPython out-of-tree
|
|
working-directory: ${{ env.CPYTHON_BUILDDIR }}
|
|
run: make -j4
|
|
- name: Display build info
|
|
working-directory: ${{ env.CPYTHON_BUILDDIR }}
|
|
run: make pythoninfo
|
|
- name: Remount sources writable for tests
|
|
# some tests write to srcdir, lack of pyc files slows down testing
|
|
run: sudo mount $CPYTHON_RO_SRCDIR -oremount,rw
|
|
- name: Tests
|
|
working-directory: ${{ env.CPYTHON_BUILDDIR }}
|
|
run: xvfb-run make buildbottest TESTOPTS="-j4 -uall,-cpu"
|
|
|
|
build_ubuntu_ssltests:
|
|
name: 'Ubuntu SSL tests with OpenSSL'
|
|
runs-on: ubuntu-20.04
|
|
needs: check_source
|
|
if: needs.check_source.outputs.run_tests == 'true' && needs.check_source.outputs.run_ssl_tests == 'true'
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
openssl_ver: [1.1.1l, 3.0.0]
|
|
env:
|
|
OPENSSL_VER: ${{ matrix.openssl_ver }}
|
|
MULTISSL_DIR: ${{ github.workspace }}/multissl
|
|
OPENSSL_DIR: ${{ github.workspace }}/multissl/openssl/${{ matrix.openssl_ver }}
|
|
LD_LIBRARY_PATH: ${{ github.workspace }}/multissl/openssl/${{ matrix.openssl_ver }}/lib
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Register gcc problem matcher
|
|
run: echo "::add-matcher::.github/problem-matchers/gcc.json"
|
|
- name: Install Dependencies
|
|
run: sudo ./.github/workflows/posix-deps-apt.sh
|
|
- name: Configure OpenSSL env vars
|
|
run: |
|
|
echo "MULTISSL_DIR=${GITHUB_WORKSPACE}/multissl" >> $GITHUB_ENV
|
|
echo "OPENSSL_DIR=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}" >> $GITHUB_ENV
|
|
echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV
|
|
- name: 'Restore OpenSSL build'
|
|
id: cache-openssl
|
|
uses: actions/cache@v2.1.6
|
|
with:
|
|
path: ./multissl/openssl/${{ env.OPENSSL_VER }}
|
|
key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }}
|
|
- name: Install OpenSSL
|
|
if: steps.cache-openssl.outputs.cache-hit != 'true'
|
|
run: python3 Tools/ssl/multissltests.py --steps=library --base-directory $MULTISSL_DIR --openssl $OPENSSL_VER --system Linux
|
|
- name: Add ccache to PATH
|
|
run: |
|
|
echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV
|
|
- name: Configure ccache action
|
|
uses: hendrikmuhs/ccache-action@v1
|
|
- name: Configure CPython
|
|
run: ./configure --with-pydebug --with-openssl=$OPENSSL_DIR
|
|
- name: Build CPython
|
|
run: make -j4
|
|
- name: Display build info
|
|
run: make pythoninfo
|
|
- name: SSL tests
|
|
run: ./python Lib/test/ssltests.py
|
|
|
|
|
|
build_asan:
|
|
name: 'Address sanitizer'
|
|
runs-on: ubuntu-20.04
|
|
needs: check_source
|
|
if: needs.check_source.outputs.run_tests == 'true'
|
|
env:
|
|
OPENSSL_VER: 1.1.1l
|
|
PYTHONSTRICTEXTENSIONBUILD: 1
|
|
ASAN_OPTIONS: detect_leaks=0:allocator_may_return_null=1:handle_segv=0
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Register gcc problem matcher
|
|
run: echo "::add-matcher::.github/problem-matchers/gcc.json"
|
|
- name: Install Dependencies
|
|
run: sudo ./.github/workflows/posix-deps-apt.sh
|
|
- name: Configure OpenSSL env vars
|
|
run: |
|
|
echo "MULTISSL_DIR=${GITHUB_WORKSPACE}/multissl" >> $GITHUB_ENV
|
|
echo "OPENSSL_DIR=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}" >> $GITHUB_ENV
|
|
echo "LD_LIBRARY_PATH=${GITHUB_WORKSPACE}/multissl/openssl/${OPENSSL_VER}/lib" >> $GITHUB_ENV
|
|
- name: 'Restore OpenSSL build'
|
|
id: cache-openssl
|
|
uses: actions/cache@v2.1.6
|
|
with:
|
|
path: ./multissl/openssl/${{ env.OPENSSL_VER }}
|
|
key: ${{ runner.os }}-multissl-openssl-${{ env.OPENSSL_VER }}
|
|
- name: Install OpenSSL
|
|
if: steps.cache-openssl.outputs.cache-hit != 'true'
|
|
run: python3 Tools/ssl/multissltests.py --steps=library --base-directory $MULTISSL_DIR --openssl $OPENSSL_VER --system Linux
|
|
- name: Add ccache to PATH
|
|
run: |
|
|
echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV
|
|
- name: Configure ccache action
|
|
uses: hendrikmuhs/ccache-action@v1
|
|
- name: Configure CPython
|
|
run: ./configure --with-address-sanitizer --without-pymalloc
|
|
- name: Build CPython
|
|
run: make -j4
|
|
- name: Display build info
|
|
run: make pythoninfo
|
|
- name: Tests
|
|
run: xvfb-run make buildbottest TESTOPTS="-j4 -uall,-cpu -x test_ctypes test_crypt test_decimal test_faulthandler test_interpreters test___all__ test_idle test_tix test_tk test_ttk_guionly test_ttk_textonly test_multiprocessing_fork test_multiprocessing_forkserver test_multiprocessing_spawn"
|