name: Suites on every OS # The three suites (backend pytest, frontend, electron) used to run only on one developer's Mac; # CI ran a hermetic subset on Ubuntu. Users run a 2017 iMac, Intel Macs and Windows laptops, so the # full suites run on the three hosted OSes. fail-fast is off and every suite runs even after a red # one, so one run reports all nine verdicts. on: workflow_dispatch: push: branches: [eric/dev, main] concurrency: group: suites-matrix-${{ github.ref }} # A run in flight keeps its verdicts; a push mid-run queues behind it instead of cancelling the Mac legs. cancel-in-progress: false permissions: contents: read jobs: suites: strategy: fail-fast: false matrix: os: [macos-latest, macos-15-intel, windows-latest] runs-on: ${{ matrix.os }} timeout-minutes: 60 env: OSW_NEVER_KILL_ROUTER: '1' OSW_DISABLE_AUTO_RESUME: '1' # The packaged app spawns its backend with PYTHONUTF8=1 (electron/main.js); the suite runs the way the product runs, or Windows' cp1252 default fails collection on the first source read. PYTHONUTF8: '1' CSC_IDENTITY_AUTO_DISCOVERY: 'false' steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.13' cache: pip cache-dependency-path: backend/requirements.lock - name: Backend dependencies (the locked set users get, plus the test runner) run: | pip install -r backend/requirements.lock pip install -r backend/requirements-dev.txt - name: Backend suite shell: bash # A test that hangs fails by NAME after ten minutes and the leg goes on; without this the first macOS run sat at 97% for 54 minutes and was cancelled nameless. run: python -m pytest backend/tests -q -p no:cacheprovider --timeout 600 - uses: actions/setup-node@v4 if: always() with: node-version: '22' cache: npm cache-dependency-path: | frontend/package-lock.json electron/package-lock.json - name: Frontend suite if: always() shell: bash working-directory: frontend run: npm ci && npm test - name: Electron suite if: always() shell: bash working-directory: electron run: npm ci && npm test