forked from python/cpython
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Convert main branch GitHub Action for OpenSUSE 3.6 builds.
- Loading branch information
Showing
4 changed files
with
298 additions
and
77 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,298 @@ | ||
name: Tests | ||
|
||
# gh-84728: "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: | ||
- 'opensuse*' | ||
pull_request: | ||
branches: | ||
- 'opensuse*' | ||
|
||
permissions: | ||
contents: read | ||
|
||
jobs: | ||
check_source: | ||
name: 'Check for source changes' | ||
runs-on: ubuntu-latest | ||
container: opensuse/leap:latest | ||
outputs: | ||
run-docs: ${{ steps.docs-changes.outputs.run-docs || false }} | ||
run_tests: ${{ steps.check.outputs.run_tests }} | ||
run_hypothesis: ${{ steps.check.outputs.run_hypothesis }} | ||
run_cifuzz: ${{ steps.check.outputs.run_cifuzz }} | ||
config_hash: ${{ steps.config_hash.outputs.hash }} | ||
steps: | ||
- uses: actions/checkout@v4 | ||
- name: Check for source changes | ||
id: check | ||
run: | | ||
if [ -z "$GITHUB_BASE_REF" ]; then | ||
echo "run_tests=true" >> $GITHUB_OUTPUT | ||
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|^\.pre-commit-config\.yaml$|\.ruff\.toml$)' && echo "run_tests=true" >> $GITHUB_OUTPUT || true | ||
fi | ||
# Check if we should run hypothesis tests | ||
GIT_BRANCH=${GITHUB_BASE_REF:-${GITHUB_REF#refs/heads/}} | ||
echo $GIT_BRANCH | ||
if $(echo "$GIT_BRANCH" | grep -q -w '3\.\(8\|9\|10\|11\)'); then | ||
echo "Branch too old for hypothesis tests" | ||
echo "run_hypothesis=false" >> $GITHUB_OUTPUT | ||
else | ||
echo "Run hypothesis tests" | ||
echo "run_hypothesis=true" >> $GITHUB_OUTPUT | ||
fi | ||
# oss-fuzz maintains a configuration for fuzzing the main branch of | ||
# CPython, so CIFuzz should be run only for code that is likely to be | ||
# merged into the main branch; compatibility with older branches may | ||
# be broken. | ||
FUZZ_RELEVANT_FILES='(\.c$|\.h$|\.cpp$|^configure$|^\.github/workflows/build\.yml$|^Modules/_xxtestfuzz)' | ||
if [ "$GITHUB_BASE_REF" = "main" ] && [ "$(git diff --name-only origin/$GITHUB_BASE_REF.. | grep -qE $FUZZ_RELEVANT_FILES; echo $?)" -eq 0 ]; then | ||
# The tests are pretty slow so they are executed only for PRs | ||
# changing relevant files. | ||
echo "Run CIFuzz tests" | ||
echo "run_cifuzz=true" >> $GITHUB_OUTPUT | ||
else | ||
echo "Branch too old for CIFuzz tests; or no C files were changed" | ||
echo "run_cifuzz=false" >> $GITHUB_OUTPUT | ||
fi | ||
- name: Compute hash for config cache key | ||
id: config_hash | ||
run: | | ||
echo "hash=${{ hashFiles('configure', 'configure.ac', '.github/workflows/build.yml') }}" >> $GITHUB_OUTPUT | ||
- name: Get a list of the changed documentation-related files | ||
if: github.event_name == 'pull_request' | ||
id: changed-docs-files | ||
uses: Ana06/get-changed-files@v2.3.0 | ||
with: | ||
filter: | | ||
Doc/** | ||
Misc/** | ||
.github/workflows/reusable-docs.yml | ||
format: csv # works for paths with spaces | ||
- name: Check for docs changes | ||
if: >- | ||
github.event_name == 'pull_request' | ||
&& steps.changed-docs-files.outputs.added_modified_renamed != '' | ||
id: docs-changes | ||
run: | | ||
echo "run-docs=true" >> "${GITHUB_OUTPUT}" | ||
check-docs: | ||
name: Docs | ||
needs: check_source | ||
if: fromJSON(needs.check_source.outputs.run-docs) | ||
uses: ./.github/workflows/reusable-docs.yml | ||
|
||
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-22.04 | ||
timeout-minutes: 60 | ||
needs: check_source | ||
if: needs.check_source.outputs.run_tests == 'true' | ||
steps: | ||
- uses: actions/checkout@v4 | ||
- uses: actions/setup-python@v5 | ||
with: | ||
python-version: '3.x' | ||
- name: Runner image version | ||
run: echo "IMAGE_VERSION=${ImageVersion}" >> $GITHUB_ENV | ||
- name: Restore config.cache | ||
uses: actions/cache@v4 | ||
with: | ||
path: config.cache | ||
# Include env.pythonLocation in key to avoid changes in environment when setup-python updates Python | ||
key: ${{ github.job }}-${{ runner.os }}-${{ env.IMAGE_VERSION }}-${{ needs.check_source.outputs.config_hash }}-${{ env.pythonLocation }} | ||
- 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.2 | ||
with: | ||
save: false | ||
- name: Check Autoconf and aclocal versions | ||
run: | | ||
grep "Generated by GNU Autoconf 2.71" configure | ||
grep "aclocal 1.16.5" aclocal.m4 | ||
grep -q "runstatedir" configure | ||
grep -q "PKG_PROG_PKG_CONFIG" aclocal.m4 | ||
- name: Configure CPython | ||
run: | | ||
# Build Python with the libpython dynamic library | ||
./configure --config-cache --with-pydebug --enable-shared | ||
- name: Regenerate leap files | ||
# Same command used by Tools/build/regen-configure.sh ($AUTORECONF) | ||
run: autoreconf -ivf -Werror | ||
- 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 | ||
|
||
build_opensuse: | ||
name: 'OpenSUSE' | ||
needs: check_source | ||
if: needs.check_source.outputs.run_tests == 'true' | ||
uses: ./.github/workflows/reusable-ubuntu.yml | ||
with: | ||
config_hash: ${{ needs.check_source.outputs.config_hash }} | ||
options: | | ||
../cpython-ro-srcdir/configure \ | ||
--config-cache \ | ||
--with-pydebug \ | ||
--with-openssl=$OPENSSL_DIR | ||
build_opensuse_ssltests: | ||
name: 'OpenSUSE SSL tests with OpenSSL' | ||
runs-on: ubuntu-22.04 | ||
timeout-minutes: 60 | ||
needs: check_source | ||
if: needs.check_source.outputs.run_tests == 'true' | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
openssl_ver: [1.1.1w, 3.0.13, 3.1.5, 3.2.1] | ||
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@v4 | ||
- name: Runner image version | ||
run: echo "IMAGE_VERSION=${ImageVersion}" >> $GITHUB_ENV | ||
- name: Restore config.cache | ||
uses: actions/cache@v4 | ||
with: | ||
path: config.cache | ||
key: ${{ github.job }}-${{ runner.os }}-${{ env.IMAGE_VERSION }}-${{ needs.check_source.outputs.config_hash }} | ||
- 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@v4 | ||
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.2 | ||
with: | ||
save: false | ||
- name: Configure CPython | ||
run: ./configure --config-cache --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 | ||
|
||
all-required-green: # This job does nothing and is only used for the branch protection | ||
name: All required checks pass | ||
if: always() | ||
|
||
needs: | ||
- check_source # Transitive dependency, needed to access `run_tests` value | ||
- check-docs | ||
- check_generated_files | ||
- build_opensuse | ||
- build_opensuse_free_threading | ||
- build_opensuse_ssltests | ||
|
||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- name: Check whether the needed jobs succeeded or failed | ||
uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe | ||
with: | ||
allowed-failures: >- | ||
build_opensuse_ssltests, | ||
allowed-skips: >- | ||
${{ | ||
!fromJSON(needs.check_source.outputs.run-docs) | ||
&& ' | ||
check-docs, | ||
' | ||
|| '' | ||
}} | ||
${{ | ||
needs.check_source.outputs.run_tests != 'true' | ||
&& ' | ||
check_generated_files, | ||
build_opensuse, | ||
build_opensuse_free_threading, | ||
build_opensuse_ssltests, | ||
' | ||
|| '' | ||
}} | ||
${{ | ||
!fromJSON(needs.check_source.outputs.run_cifuzz) | ||
&& ' | ||
cifuzz, | ||
' | ||
|| '' | ||
}} | ||
${{ | ||
!fromJSON(needs.check_source.outputs.run_hypothesis) | ||
&& ' | ||
test_hypothesis, | ||
' | ||
|| '' | ||
}} | ||
jobs: ${{ toJSON(needs) }} |