Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 104 additions & 0 deletions .github/workflows/relocatability.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
name: Relocatability

# Build CPython main and run `relocatable.py test` against it. Some checks
# fail until CPython is fixed, so failed checks don't fail the job; the
# results are in the job summary and the uploaded JSON. The job only fails
# if the build or the harness itself breaks.

on:
push:
branches: [main]
Comment on lines +9 to +10

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Allow forks to run CI on feature branches, so we can check results on our fork CI before opening a PR.

Suggested change
push:
branches: [main]
push:

pull_request:
schedule:
# Daily, to track changes in CPython main.
- cron: "17 6 * * *"
workflow_dispatch:

permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
test:
name: ${{ matrix.os }}
# Forks get the schedule too; only run it here.
if: github.event_name != 'schedule' || github.repository == 'python/prebuilt-cpython'

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same thing without hardcoding repo name, easier to copy to other repos:

Suggested change
if: github.event_name != 'schedule' || github.repository == 'python/prebuilt-cpython'
if: github.event_name != 'schedule' || github.event.repository.fork == false

runs-on: ${{ matrix.os }}
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@v5

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- uses: actions/checkout@v5
- uses: actions/checkout@v7

with:
path: prebuilt-cpython
persist-credentials: false
- uses: actions/checkout@v5

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- uses: actions/checkout@v5
- uses: actions/checkout@v7

with:
repository: python/cpython
path: cpython
persist-credentials: false
- uses: actions/setup-python@v6

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- uses: actions/setup-python@v6
- uses: actions/setup-python@v7

with:
python-version: "3.14"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we specifically need 3.14, or can we use 3.15?

Suggested change
python-version: "3.14"
python-version: "3.15"

Or whatever the latest stable is?

Suggested change
python-version: "3.14"
python-version: "3.x"


- name: Install build dependencies (Linux)
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y build-essential pkg-config patchelf \
libbz2-dev libffi-dev libgdbm-dev liblzma-dev libncurses-dev \
libreadline-dev libsqlite3-dev libssl-dev libzstd-dev uuid-dev \
zlib1g-dev
- name: Install build tools (macOS)
if: runner.os == 'macOS'
run: brew install pkg-config
- name: Build dependencies (macOS)
if: runner.os == 'macOS'
working-directory: cpython
run: python ../prebuilt-cpython/relocatable.py deps

- name: Record the CPython commit
working-directory: cpython
run: git log -1 --format='CPython main at %h (%cs)' | tee -a "$GITHUB_STEP_SUMMARY"
- name: Configure
working-directory: cpython
run: python ../prebuilt-cpython/relocatable.py configure ${{ runner.os == 'macOS' && '--deps-dir deps' || '' }}
- name: Build
working-directory: cpython
run: python ../prebuilt-cpython/relocatable.py make

- name: Test (patch)
working-directory: cpython
continue-on-error: true
run: python ../prebuilt-cpython/relocatable.py test --strategy patch --format json > ../results-patch.json
- name: Test (origin)
working-directory: cpython
continue-on-error: true
run: python ../prebuilt-cpython/relocatable.py test --strategy origin --format json > ../results-origin.json

- name: Summarize
shell: python
run: |
import json, os

lines = []
for strategy in ("patch", "origin"):
# Fails the job if the harness crashed instead of reporting.
with open(f"results-{strategy}.json") as file:
results = json.load(file)
lines += [f"### `--strategy {strategy}`", "", "| Check | Status | Summary |", "|---|---|---|"]
lines += [f"| `{r['name']}` | {r['status']} | {r['summary']} |" for r in results]
lines.append("")
with open(os.environ["GITHUB_STEP_SUMMARY"], "a") as summary:
summary.write("\n".join(lines) + "\n")
- uses: actions/upload-artifact@v4
if: ${{ !cancelled() }}
with:
name: relocatability-${{ matrix.os }}
path: results-*.json
if-no-files-found: ignore
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ Each check prints `PASS`, `FAIL`, or `SKIP` (in color on a terminal, unless `NO_

Use `--strategy origin` to gather with `--origin` (the default is `--patch`), `--full` to also run `python -m test --fast-ci`, `--work-dir DIR` to keep the temporary files (including `gather.log`, the `make install` output), and `--format json` for JSON output.

The Relocatability GitHub Actions workflow runs `test` with both strategies against CPython `main` on Linux and macOS, daily and for each pull request. Each run's summary lists the results, and the JSON is attached to the run.

If the build wasn't configured by `relocatable.py configure`, its `--prefix` is left alone and treated as the old location. If that directory still exists, the `distribution.isolation` check fails, because the moved build might be using files from it without anyone noticing.

## Project Representatives
Expand Down