| name: Tests | |
| on: | |
| workflow_dispatch: | |
| push: | |
| branches: | |
| - 'main' | |
| - '3.*' | |
| pull_request: | |
| branches: | |
| - 'main' | |
| - '3.*' | |
| permissions: | |
| contents: read | |
| concurrency: | |
| # https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#concurrency | |
| # 'group' must be a key uniquely representing a PR or push event. | |
| # github.workflow is the workflow name | |
| # github.actor is the user invoking the workflow | |
| # github.head_ref is the source branch of the PR or otherwise blank | |
| # github.run_id is a unique number for the current run | |
| group: ${{ github.workflow }}-${{ github.actor }}-${{ github.head_ref || github.run_id }} | |
| cancel-in-progress: true | |
| env: | |
| FORCE_COLOR: 1 | |
| jobs: | |
| build-context: | |
| name: Change detection | |
| # To use boolean outputs from this job, parse them as JSON. | |
| # Here's some examples: | |
| # | |
| # if: fromJSON(needs.build-context.outputs.run-docs) | |
| # | |
| # ${{ | |
| # fromJSON(needs.build-context.outputs.run-tests) | |
| # && 'truthy-branch' | |
| # || 'falsy-branch' | |
| # }} | |
| # | |
| uses: ./.github/workflows/reusable-context.yml | |
| check-docs: | |
| name: Docs | |
| needs: build-context | |
| if: fromJSON(needs.build-context.outputs.run-docs) | |
| uses: ./.github/workflows/reusable-docs.yml | |
| check-autoconf-regen: | |
| name: 'Check if Autoconf files are up to date' | |
| # Don't use ubuntu-latest but a specific version to make the job | |
| # reproducible: to get the same tools versions (autoconf, aclocal, ...) | |
| runs-on: ubuntu-26.04 | |
| container: | |
| image: ghcr.io/python/autoconf:2025.01.02.12581854023 | |
| timeout-minutes: 60 | |
| needs: build-context | |
| if: needs.build-context.outputs.run-tests == 'true' | |
| steps: | |
| - name: Install Git | |
| run: | | |
| apt update && apt install git -yq | |
| git config --global --add safe.directory "$GITHUB_WORKSPACE" | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| fetch-depth: 1 | |
| persist-credentials: false | |
| - name: Check Autoconf and aclocal versions | |
| run: | | |
| grep "Generated by GNU Autoconf 2.72" configure | |
| grep "aclocal 1.16.5" aclocal.m4 | |
| grep -q "runstatedir" configure | |
| grep -q "PKG_PROG_PKG_CONFIG" aclocal.m4 | |
| - name: Regenerate autoconf files | |
| # Same command used by Tools/build/regen-configure.sh ($AUTORECONF) | |
| run: autoreconf -ivf -Werror | |
| - 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-configure ;)" | |
| echo "configure files must be regenerated with a specific version of autoconf." | |
| echo "$changes" | |
| echo "" | |
| git diff --staged || true | |
| exit 1 | |
| fi | |
| check-generated-files: | |
| name: 'Check if generated files are up to date' | |
| # Don't use ubuntu-latest but a specific version to make the job | |
| # reproducible: to get the same tools versions (autoconf, aclocal, ...) | |
| runs-on: ubuntu-26.04 | |
| timeout-minutes: 60 | |
| needs: build-context | |
| if: needs.build-context.outputs.run-tests == 'true' | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 | |
| with: | |
| python-version: '3.x' | |
| - name: Runner image version | |
| run: echo "IMAGE_OS_VERSION=${ImageOS}-${ImageVersion}" >> "$GITHUB_ENV" | |
| - name: Install dependencies | |
| run: sudo ./.github/workflows/posix-deps-apt.sh | |
| - name: Configure CPython | |
| run: | | |
| # Build Python with the libpython dynamic library | |
| ./configure --config-cache --with-pydebug --enable-shared | |
| - name: Build CPython | |
| run: | | |
| make -j4 regen-all | |
| make regen-stdlib-module-names regen-sbom | |
| - 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 version of autoconf." | |
| echo "$changes" | |
| echo "" | |
| git diff --staged || true | |
| exit 1 | |
| fi | |
| - name: Check exported libpython symbols | |
| run: make smelly | |
| - name: Check limited ABI symbols | |
| run: make check-limited-abi | |
| - name: Check for unsupported C global variables | |
| if: github.event_name == 'pull_request' # $GITHUB_EVENT_NAME | |
| run: make check-c-globals | |
| check-c-api-docs: | |
| name: C API Docs | |
| needs: build-context | |
| if: >- | |
| needs.build-context.outputs.run-tests == 'true' | |
| || needs.build-context.outputs.run-docs == 'true' | |
| uses: ./.github/workflows/reusable-check-c-api-docs.yml | |
| build-windows: | |
| name: >- | |
| Windows | |
| ${{ fromJSON(matrix.free-threading) && '(free-threading)' || '' }} | |
| needs: build-context | |
| if: fromJSON(needs.build-context.outputs.run-windows-tests) | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| arch: | |
| - x64 | |
| - Win32 | |
| - arm64 | |
| free-threading: | |
| - false | |
| - true | |
| interpreter: | |
| - switch-case | |
| exclude: | |
| # Skip Win32 on free-threaded builds | |
| - { arch: Win32, free-threading: true } | |
| include: | |
| # msvc::musttail is currently only supported on x64, | |
| # and only supported on 3.15+. | |
| - { arch: x64, free-threading: false, interpreter: tail-call } | |
| - { arch: x64, free-threading: true, interpreter: tail-call } | |
| uses: ./.github/workflows/reusable-windows.yml | |
| with: | |
| arch: ${{ matrix.arch }} | |
| free-threading: ${{ matrix.free-threading }} | |
| interpreter: ${{ matrix.interpreter }} | |
| build-macos: | |
| name: >- | |
| macOS | |
| ${{ fromJSON(matrix.free-threading) && '(free-threading)' || '' }} | |
| needs: build-context | |
| if: needs.build-context.outputs.run-macos == 'true' | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| # macos-26 is Apple Silicon, macos-26-intel is Intel. | |
| # macos-26-intel only runs tests against the GIL-enabled CPython. | |
| os: | |
| - macos-26 | |
| - macos-26-intel | |
| free-threading: | |
| - false | |
| - true | |
| exclude: | |
| - os: macos-26-intel | |
| free-threading: true | |
| uses: ./.github/workflows/reusable-macos.yml | |
| with: | |
| free-threading: ${{ matrix.free-threading }} | |
| os: ${{ matrix.os }} | |
| build-ubuntu: | |
| name: >- | |
| Ubuntu | |
| ${{ fromJSON(matrix.free-threading) && '(free-threading)' || '' }} | |
| ${{ fromJSON(matrix.bolt) && '(bolt)' || '' }} | |
| needs: build-context | |
| if: needs.build-context.outputs.run-ubuntu == 'true' | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| bolt: | |
| - false | |
| - true | |
| free-threading: | |
| - false | |
| - true | |
| os: | |
| - ubuntu-26.04 | |
| - ubuntu-26.04-arm | |
| exclude: | |
| # Do not test BOLT with free-threading, to conserve resources | |
| - bolt: true | |
| free-threading: true | |
| # BOLT currently crashes during instrumentation on aarch64 | |
| - os: ubuntu-26.04-arm | |
| bolt: true | |
| include: | |
| # Enable CPU-intensive tests on ARM (default build only) | |
| - os: ubuntu-26.04-arm | |
| bolt: false | |
| free-threading: false | |
| test-opts: '-u cpu' | |
| uses: ./.github/workflows/reusable-ubuntu.yml | |
| with: | |
| bolt-optimizations: ${{ matrix.bolt }} | |
| free-threading: ${{ matrix.free-threading }} | |
| os: ${{ matrix.os }} | |
| test-opts: ${{ matrix.test-opts || '' }} | |
| build-ubuntu-installed: | |
| name: 'Ubuntu (installed)' | |
| needs: build-context | |
| if: needs.build-context.outputs.run-ubuntu == 'true' | |
| uses: ./.github/workflows/reusable-install.yml | |
| build-ubuntu-ssltests: | |
| name: 'Ubuntu SSL tests' | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: 60 | |
| needs: build-context | |
| if: needs.build-context.outputs.run-ubuntu == 'true' | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-26.04] | |
| ssllib: | |
| # See Tools/ssl/make_ssl_data.py for notes on adding a new version | |
| ## OpenSSL | |
| # Keep 1.1.1w in our list despite it being upstream EOL and otherwise | |
| # unsupported as it most resembles other 1.1.1-work-a-like ssl APIs | |
| # supported by important vendors such as AWS-LC. | |
| - { name: openssl, version: 1.1.1w } | |
| - { name: openssl, version: 3.4.8 } | |
| - { name: openssl, version: 3.5.9 } | |
| - { name: openssl, version: 3.6.5 } | |
| - { name: openssl, version: 4.0.3 } | |
| ## AWS-LC | |
| - { name: aws-lc, version: 5.10.0 } | |
| env: | |
| SSLLIB_VER: ${{ matrix.ssllib.version }} | |
| MULTISSL_DIR: ${{ github.workspace }}/multissl | |
| SSLLIB_DIR: ${{ github.workspace }}/multissl/${{ matrix.ssllib.name }}/${{ matrix.ssllib.version }} | |
| LD_LIBRARY_PATH: ${{ github.workspace }}/multissl/${{ matrix.ssllib.name }}/${{ matrix.ssllib.version }}/lib | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Runner image version | |
| run: echo "IMAGE_OS_VERSION=${ImageOS}-${ImageVersion}" >> "$GITHUB_ENV" | |
| - 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: 'Restore SSL library build' | |
| id: cache-ssl-lib | |
| uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | |
| with: | |
| path: ./multissl/${{ matrix.ssllib.name }}/${{ matrix.ssllib.version }} | |
| key: ${{ matrix.os }}-multissl-${{ matrix.ssllib.name }}-${{ matrix.ssllib.version }} | |
| - name: Install SSL Library | |
| if: steps.cache-ssl-lib.outputs.cache-hit != 'true' | |
| run: | | |
| python3 Tools/ssl/multissltests.py \ | |
| --steps=library \ | |
| --base-directory "$MULTISSL_DIR" \ | |
| '--${{ matrix.ssllib.name }}' '${{ matrix.ssllib.version }}' \ | |
| --system Linux | |
| - name: Configure CPython | |
| run: | | |
| ./configure CFLAGS="-fdiagnostics-format=json" \ | |
| --config-cache \ | |
| --enable-slower-safety \ | |
| --with-pydebug \ | |
| --with-openssl="$SSLLIB_DIR" \ | |
| --with-builtin-hashlib-hashes=blake2 \ | |
| --with-ssl-default-suites=openssl | |
| - name: Build CPython | |
| run: make -j4 | |
| - name: Display build info | |
| run: make pythoninfo | |
| - name: Verify python is linked to the right lib | |
| run: | | |
| ./python -c 'import ssl; print(ssl.OPENSSL_VERSION)' \ | |
| | grep -iE '${{ matrix.ssllib.name }}.*${{ matrix.ssllib.version }}' | |
| - name: SSL tests | |
| run: ./python Lib/test/ssltests.py | |
| build-android: | |
| name: Android (${{ matrix.arch }}) | |
| needs: build-context | |
| if: needs.build-context.outputs.run-android == 'true' | |
| timeout-minutes: 60 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - arch: aarch64 | |
| runs-on: macos-26 | |
| - arch: x86_64 | |
| runs-on: ubuntu-26.04 | |
| runs-on: ${{ matrix.runs-on }} | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Build and test | |
| run: python3 Platforms/Android ci --fast-ci ${{ matrix.arch }}-linux-android | |
| build-ios: | |
| name: >- | |
| iOS | |
| ${{ fromJSON(matrix.free-threading) && '(free-threading)' || '' }} | |
| needs: build-context | |
| if: needs.build-context.outputs.run-ios == 'true' | |
| timeout-minutes: 60 | |
| runs-on: macos-26 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| free-threading: | |
| - false | |
| - true | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Build and test | |
| run: >- | |
| python3 Platforms/Apple ci iOS --fast-ci | |
| ${{ fromJSON(matrix.free-threading) && '--abiflags t' || '' }} | |
| build-emscripten: | |
| name: 'Emscripten' | |
| needs: build-context | |
| if: needs.build-context.outputs.run-emscripten == 'true' | |
| uses: ./.github/workflows/reusable-emscripten.yml | |
| build-wasi: | |
| name: 'WASI' | |
| needs: build-context | |
| if: needs.build-context.outputs.run-wasi == 'true' | |
| uses: ./.github/workflows/reusable-wasi.yml | |
| test-hypothesis: | |
| name: "Hypothesis tests on Ubuntu" | |
| runs-on: ubuntu-26.04 | |
| timeout-minutes: 60 | |
| needs: build-context | |
| if: needs.build-context.outputs.run-ubuntu == 'true' | |
| env: | |
| OPENSSL_VER: 3.5.9 | |
| PYTHONSTRICTEXTENSIONBUILD: 1 | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - 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@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | |
| 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: 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: Runner image version | |
| run: echo "IMAGE_OS_VERSION=${ImageOS}-${ImageVersion}" >> "$GITHUB_ENV" | |
| - name: Configure CPython out-of-tree | |
| working-directory: ${{ env.CPYTHON_BUILDDIR }} | |
| run: | | |
| ../cpython-ro-srcdir/configure \ | |
| --config-cache \ | |
| --with-pydebug \ | |
| --enable-slower-safety \ | |
| --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: Setup directory envs for out-of-tree builds | |
| run: | | |
| echo "CPYTHON_BUILDDIR=$(realpath -m "${GITHUB_WORKSPACE}"/../cpython-builddir)" >> "$GITHUB_ENV" | |
| - name: "Create hypothesis venv" | |
| working-directory: ${{ env.CPYTHON_BUILDDIR }} | |
| run: | | |
| VENV_LOC=$(realpath -m .)/hypovenv | |
| VENV_PYTHON=$VENV_LOC/bin/python | |
| echo "HYPOVENV=${VENV_LOC}" >> "$GITHUB_ENV" | |
| echo "VENV_PYTHON=${VENV_PYTHON}" >> "$GITHUB_ENV" | |
| ./python -m venv "$VENV_LOC" && "$VENV_PYTHON" -m pip install -r "${GITHUB_WORKSPACE}/Tools/requirements-hypothesis.txt" | |
| - name: 'Restore Hypothesis database' | |
| id: cache-hypothesis-database | |
| uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | |
| with: | |
| path: ${{ env.CPYTHON_BUILDDIR }}/.hypothesis/ | |
| key: hypothesis-database-${{ github.head_ref || github.run_id }} | |
| restore-keys: | | |
| hypothesis-database- | |
| - name: "Run tests" | |
| working-directory: ${{ env.CPYTHON_BUILDDIR }} | |
| run: | | |
| # Most of the excluded tests are slow test suites with no property tests | |
| # | |
| # (GH-104097) test_sysconfig is skipped because it has tests that are | |
| # failing when executed from inside a virtual environment. | |
| "${VENV_PYTHON}" -m test \ | |
| -W \ | |
| --slowest \ | |
| -j4 \ | |
| --timeout 900 \ | |
| -x test_asyncio \ | |
| -x test_multiprocessing_fork \ | |
| -x test_multiprocessing_forkserver \ | |
| -x test_multiprocessing_spawn \ | |
| -x test_concurrent_futures \ | |
| -x test_socket \ | |
| -x test_subprocess \ | |
| -x test_signal \ | |
| -x test_sysconfig | |
| - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| if: always() | |
| with: | |
| name: hypothesis-example-db | |
| path: ${{ env.CPYTHON_BUILDDIR }}/.hypothesis/examples/ | |
| test-lazy-imports-all: | |
| name: 'Lazy imports enabled' | |
| needs: build-context | |
| if: fromJSON(needs.build-context.outputs.run-tests) | |
| uses: ./.github/workflows/reusable-test-lazy-imports-all.yml | |
| build-san: | |
| # ${{ '' } is a hack to nest jobs under the same sidebar category. | |
| name: Sanitizers${{ '' }} # zizmor: ignore[obfuscation] | |
| needs: build-context | |
| if: needs.build-context.outputs.run-ubuntu == 'true' | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| check-name: | |
| - Thread | |
| free-threading: | |
| - false | |
| - true | |
| sanitizer: | |
| - TSan | |
| include: | |
| - check-name: Address | |
| sanitizer: ASan | |
| free-threading: false | |
| - check-name: Undefined behavior | |
| sanitizer: UBSan | |
| free-threading: false | |
| - check-name: Memory | |
| sanitizer: MSan | |
| free-threading: false | |
| uses: ./.github/workflows/reusable-san.yml | |
| with: | |
| sanitizer: ${{ matrix.sanitizer }} | |
| free-threading: ${{ matrix.free-threading }} | |
| cross-build-linux: | |
| name: Cross build Linux | |
| runs-on: ubuntu-26.04 | |
| timeout-minutes: 60 | |
| needs: build-context | |
| if: needs.build-context.outputs.run-ubuntu == 'true' | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Runner image version | |
| run: echo "IMAGE_OS_VERSION=${ImageOS}-${ImageVersion}" >> "$GITHUB_ENV" | |
| - name: Register gcc problem matcher | |
| run: echo "::add-matcher::.github/problem-matchers/gcc.json" | |
| - name: Set build dir | |
| run: | |
| # an absolute path outside of the working directoy | |
| echo "BUILD_DIR=$(realpath ${{ github.workspace }}/../build)" >> "$GITHUB_ENV" | |
| - name: Install dependencies | |
| run: sudo ./.github/workflows/posix-deps-apt.sh | |
| - name: Configure host build | |
| run: ./configure --prefix="$BUILD_DIR/host-python" | |
| - name: Install host Python | |
| run: make -j8 install | |
| - name: Run test subset with host build | |
| run: | | |
| "$BUILD_DIR/host-python/bin/python3" -m test test_sysconfig test_site test_embed | |
| - name: Configure cross build | |
| run: ./configure --prefix="$BUILD_DIR/cross-python" --with-build-python="$BUILD_DIR/host-python/bin/python3" | |
| - name: Install cross Python | |
| run: make -j8 install | |
| - name: Display build info | |
| run: | | |
| "$BUILD_DIR/cross-python/bin/python3" -m test.pythoninfo | |
| - name: Run test subset with cross build | |
| run: | | |
| "$BUILD_DIR/cross-python/bin/python3" -m test test_sysconfig test_site test_embed | |
| cifuzz: | |
| # ${{ '' } is a hack to nest jobs under the same sidebar category. | |
| name: CIFuzz${{ '' }} # zizmor: ignore[obfuscation] | |
| needs: build-context | |
| if: >- | |
| needs.build-context.outputs.run-ci-fuzz == 'true' | |
| || needs.build-context.outputs.run-ci-fuzz-stdlib == 'true' | |
| permissions: | |
| contents: read | |
| security-events: write | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| sanitizer: | |
| - address | |
| oss-fuzz-project-name: | |
| - cpython3 | |
| - python3-libraries | |
| include: | |
| - sanitizer: undefined | |
| oss-fuzz-project-name: cpython3 | |
| - sanitizer: memory | |
| oss-fuzz-project-name: cpython3 | |
| exclude: | |
| # Note that the 'no-exclude' sentinel below is to prevent | |
| # an empty string value from excluding all jobs and causing | |
| # GHA to create a 'default' matrix entry with all empty values. | |
| - oss-fuzz-project-name: >- | |
| ${{ | |
| needs.build-context.outputs.run-ci-fuzz == 'true' | |
| && 'no-exclude' | |
| || 'cpython3' | |
| }} | |
| - oss-fuzz-project-name: >- | |
| ${{ | |
| needs.build-context.outputs.run-ci-fuzz-stdlib == 'true' | |
| && 'no-exclude' | |
| || 'python3-libraries' | |
| }} | |
| uses: ./.github/workflows/reusable-cifuzz.yml | |
| with: | |
| oss-fuzz-project-name: ${{ matrix.oss-fuzz-project-name }} | |
| sanitizer: ${{ matrix.sanitizer }} | |
| all-required-green: # This job does nothing and is only used for the branch protection | |
| name: All required checks pass | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 5 | |
| needs: | |
| - build-context # Transitive dependency, needed to access `run-tests` value | |
| - check-docs | |
| - check-autoconf-regen | |
| - check-generated-files | |
| - check-c-api-docs | |
| - build-windows | |
| - build-macos | |
| - build-ubuntu | |
| - build-ubuntu-installed | |
| - build-ubuntu-ssltests | |
| - build-ios | |
| - build-emscripten | |
| - build-wasi | |
| - test-hypothesis | |
| - test-lazy-imports-all | |
| - build-san | |
| - cross-build-linux | |
| - cifuzz | |
| if: always() | |
| steps: | |
| - name: Check whether the needed jobs succeeded or failed | |
| uses: re-actors/alls-green@b5b5b37504aa4183270bd3d855c52a67f212be35 | |
| with: | |
| allowed-failures: >- | |
| build-android, | |
| build-emscripten, | |
| build-ubuntu-ssltests, | |
| test-hypothesis, | |
| cifuzz, | |
| allowed-skips: >- | |
| ${{ !fromJSON(needs.build-context.outputs.run-docs) && 'check-docs,' || '' }} | |
| ${{ | |
| needs.build-context.outputs.run-tests != 'true' | |
| && ' | |
| check-autoconf-regen, | |
| check-generated-files, | |
| ' | |
| || '' | |
| }} | |
| ${{ | |
| !fromJSON(needs.build-context.outputs.run-tests) | |
| && !fromJSON(needs.build-context.outputs.run-docs) | |
| && 'check-c-api-docs,' | |
| || '' | |
| }} | |
| ${{ !fromJSON(needs.build-context.outputs.run-windows-tests) && 'build-windows,' || '' }} | |
| ${{ | |
| !fromJSON(needs.build-context.outputs.run-ci-fuzz) | |
| && !fromJSON(needs.build-context.outputs.run-ci-fuzz-stdlib) | |
| && 'cifuzz,' || | |
| '' | |
| }} | |
| ${{ !fromJSON(needs.build-context.outputs.run-macos) && 'build-macos,' || '' }} | |
| ${{ | |
| !fromJSON(needs.build-context.outputs.run-ubuntu) | |
| && ' | |
| build-ubuntu, | |
| build-ubuntu-installed, | |
| build-ubuntu-ssltests, | |
| test-hypothesis, | |
| build-san, | |
| cross-build-linux, | |
| ' | |
| || '' | |
| }} | |
| ${{ !fromJSON(needs.build-context.outputs.run-android) && 'build-android,' || '' }} | |
| ${{ !fromJSON(needs.build-context.outputs.run-ios) && 'build-ios,' || '' }} | |
| ${{ !fromJSON(needs.build-context.outputs.run-emscripten) && 'build-emscripten,' || '' }} | |
| ${{ !fromJSON(needs.build-context.outputs.run-wasi) && 'build-wasi,' || '' }} | |
| ${{ !fromJSON(needs.build-context.outputs.run-tests) && 'test-lazy-imports-all,' || '' }} | |
| jobs: ${{ toJSON(needs) }} |