# CI: lint, test, headless import smoke, plus a macOS PyInstaller build # that uploads the .zip the in-app updater would otherwise wait for the # operator to ship by hand. Runs on every PR and on push to main. # Read-only token by design. name: ci on: pull_request: push: branches: [main] concurrency: group: ci-${{ github.workflow }}-${{ github.ref }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} permissions: contents: read jobs: check: name: lint + tests runs-on: ubuntu-latest steps: - name: checkout uses: actions/checkout@v4 - name: setup-python uses: actions/setup-python@v5 with: python-version: "3.12" cache: pip - name: install # Pinned to the same versions pyproject.toml declares so a green # CI run says the same thing as a green local run. run: | python -m pip install --upgrade pip pip install "pygame==2.6.1" "ruff==0.15.14" "pytest==9.0.3" - name: ruff run: ruff check . - name: pytest env: SDL_VIDEODRIVER: dummy SDL_AUDIODRIVER: dummy run: pytest - name: import smoke # Belt-and-braces: pytest covers the testable subset; this also # exercises the menu/level/editor constructors that run at # ``import main``. The dummy SDL drivers are required — the # runner has no display and no audio device. env: SDL_VIDEODRIVER: dummy SDL_AUDIODRIVER: dummy run: python -c "import main" build: name: build (macOS) runs-on: macos-latest steps: - name: checkout uses: actions/checkout@v4 - name: setup-python uses: actions/setup-python@v5 with: python-version: "3.12" cache: pip - name: prepare .venv # build_mac.sh runs from .venv/bin/python — it explicitly forbids # system python3 (3.14 is incompatible with PyInstaller 6.20). # Pre-install pygame so the script's own --upgrade pyinstaller # is the only network hop it has to do. run: | python -m venv .venv .venv/bin/pip install --upgrade pip .venv/bin/pip install "pygame==2.6.1" - name: build .app + zip run: ./build_mac.sh - name: upload artifact uses: actions/upload-artifact@v4 with: name: TheWayOut-mac path: dist/TheWayOut-mac.zip if-no-files-found: error