# Runs python tests on a matrix of python versions and platforms. # # Checks for changes to python files before running the tests. # If always_run is true, always runs the tests. name: 'python tests' on: push: branches: - 'main' pull_request: types: - 'ready_for_review' - 'opened' - 'synchronize' merge_group: workflow_dispatch: inputs: always_run: description: 'Always run the tests' required: true type: boolean default: true workflow_call: inputs: always_run: description: 'Always run the tests' required: true type: boolean default: true concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true jobs: matrix: strategy: matrix: python-version: - '3.11' - '3.12' platform: - linux-cpu - macos-default - windows-cpu include: - platform: linux-cpu os: ubuntu-24.04 extra-index-url: 'https://download.pytorch.org/whl/cpu' github-env: $GITHUB_ENV - platform: macos-default os: macOS-14 github-env: $GITHUB_ENV - platform: windows-cpu os: windows-2022 github-env: $env:GITHUB_ENV name: 'py${{ matrix.python-version }}: ${{ matrix.platform }}' runs-on: ${{ matrix.os }} timeout-minutes: 15 # expected run time: 2-6 min, depending on platform env: PIP_USE_PEP517: '1' UV_SYSTEM_PYTHON: 1 steps: - name: checkout # https://github.com/nschloe/action-cached-lfs-checkout uses: nschloe/action-cached-lfs-checkout@f46300cd8952454b9f0a21a3d133d4bd5684cfc2 - name: check for changed python files if: ${{ inputs.always_run != true }} id: changed-files # Pinned to the _hash_ for v45.0.9 to prevent supply-chain attacks. # See: # - CVE-2025-30066 # - https://www.stepsecurity.io/blog/harden-runner-detection-tj-actions-changed-files-action-is-compromised # - https://github.com/tj-actions/changed-files/issues/2463 uses: tj-actions/changed-files@a284dc1814e3fd07f2e34267fc8f81227ed29fb8 with: files_yaml: | python: - 'pyproject.toml' - 'invokeai/**' - '!invokeai/frontend/web/**' - 'tests/**' - name: setup uv if: ${{ steps.changed-files.outputs.python_any_changed == 'true' || inputs.always_run == true }} uses: astral-sh/setup-uv@v5 with: version: '0.6.10' enable-cache: true python-version: ${{ matrix.python-version }} - name: setup python if: ${{ steps.changed-files.outputs.python_any_changed == 'true' || inputs.always_run == true }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: install dependencies if: ${{ steps.changed-files.outputs.python_any_changed == 'true' || inputs.always_run == true }} env: UV_INDEX: ${{ matrix.extra-index-url }} run: uv pip install --editable ".[test]" - name: run pytest if: ${{ steps.changed-files.outputs.python_any_changed == 'true' || inputs.always_run == true }} run: pytest