Merge pull request #2048 from beeware/dependabot/github_actions/actio… #5041
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
name: CI | |
on: | |
pull_request: | |
push: | |
branches: | |
- main | |
workflow_call: | |
inputs: | |
attest-package: | |
description: "Create GitHub provenance attestation for the package." | |
default: "false" | |
type: string | |
outputs: | |
artifact-name: | |
description: "Name of the uploaded artifact; use for artifact retrieval." | |
value: ${{ jobs.package.outputs.artifact-name }} | |
# Cancel active CI runs for a PR before starting another run | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: true | |
defaults: | |
run: | |
shell: bash # https://github.com/beeware/briefcase/pull/912 | |
env: | |
FORCE_COLOR: "1" | |
jobs: | |
pre-commit: | |
name: Pre-commit checks | |
uses: beeware/.github/.github/workflows/pre-commit-run.yml@main | |
towncrier: | |
name: Check towncrier | |
uses: beeware/.github/.github/workflows/towncrier-run.yml@main | |
package: | |
name: Package Briefcase | |
permissions: | |
id-token: write | |
contents: read | |
attestations: write | |
uses: beeware/.github/.github/workflows/python-package-create.yml@main | |
with: | |
attest: ${{ inputs.attest-package }} | |
package-automation: | |
name: Package Automation | |
permissions: | |
id-token: write | |
contents: read | |
attestations: write | |
uses: beeware/.github/.github/workflows/python-package-create.yml@main | |
with: | |
build-subdirectory: "automation" | |
unit-tests: | |
name: Unit tests | |
needs: [ pre-commit, towncrier, package ] | |
runs-on: ${{ matrix.platform }} | |
continue-on-error: ${{ matrix.experimental || false }} | |
strategy: | |
fail-fast: false | |
matrix: | |
platform: [ "macos-13", "macos-latest", "windows-latest", "ubuntu-latest" ] | |
python-version: [ "3.9", "3.13" ] | |
include: | |
# Ensure the Python versions between min and max are tested | |
- platform: "ubuntu-latest" | |
python-version: "3.10" | |
- platform: "ubuntu-latest" | |
python-version: "3.11" | |
- platform: "ubuntu-latest" | |
python-version: "3.12" | |
# # Allow dev Python to fail without failing entire job | |
# - python-version: "3.14" | |
# experimental: true | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4.2.2 | |
with: | |
fetch-depth: 0 | |
- name: Set up Python | |
uses: actions/setup-python@v5.2.0 | |
with: | |
python-version: ${{ matrix.python-version }} | |
allow-prereleases: true | |
- name: Get Packages | |
uses: actions/download-artifact@v4.1.8 | |
with: | |
name: ${{ needs.package.outputs.artifact-name }} | |
path: dist | |
- name: Install Tox | |
uses: beeware/.github/.github/actions/install-requirement@main | |
with: | |
requirements: tox | |
extra: dev | |
- name: Test | |
id: test | |
run: | | |
RUNNER_OS=$(cut -d- -f1 <<< ${{ matrix.platform }}) | |
RUNNER_VERSION=$(cut -d- -f2 <<< ${{ matrix.platform }}) | |
COVERAGE_FILE=".coverage.${RUNNER_OS}.${RUNNER_VERSION}.${{ matrix.python-version }}" \ | |
tox -e py-cov --installpkg dist/briefcase-*.whl | |
- name: Store Coverage Data | |
if: always() && contains('success,failure', steps.test.outcome) | |
uses: actions/upload-artifact@v4.4.3 | |
with: | |
name: coverage-data-${{ matrix.platform }}-${{ matrix.python-version }} | |
path: ".coverage.*" | |
if-no-files-found: error | |
include-hidden-files: true | |
- name: Report Platform Coverage | |
id: coverage | |
if: always() && contains('success,failure', steps.test.outcome) | |
# coverage reporting must use the same Python version used to produce coverage | |
run: tox -qe coverage$(tr -dc "0-9" <<< "${{ matrix.python-version }}") | |
coverage: | |
name: Project coverage | |
runs-on: ubuntu-latest | |
needs: unit-tests | |
if: always() && contains('success,failure', needs.unit-tests.result) | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4.2.2 | |
with: | |
fetch-depth: 0 | |
- name: Setup Python | |
uses: actions/setup-python@v5.2.0 | |
with: | |
# Use minimum version of python for coverage to avoid phantom branches | |
# https://github.com/nedbat/coveragepy/issues/1572#issuecomment-1522546425 | |
python-version: "3.9" | |
- name: Install Tox | |
uses: beeware/.github/.github/actions/install-requirement@main | |
with: | |
requirements: tox | |
extra: dev | |
- name: Retrieve Coverage Data | |
uses: actions/download-artifact@v4.1.8 | |
with: | |
pattern: coverage-data-* | |
merge-multiple: true | |
- name: Platform Coverage Reports | |
id: platform-coverage | |
run: | | |
tox --parallel-no-spinner -qe \ | |
coverage-ci-platform-linux,coverage-ci-platform-macos,coverage-ci-platform-windows | |
- name: Project Coverage Report | |
id: project-coverage | |
if: always() || contains('success,failure', needs.platform-coverage.result) | |
run: tox -qe coverage-ci-project-html | |
- name: Upload Project Coverage HTML Report | |
if: always() && steps.project-coverage.outcome == 'failure' | |
uses: actions/upload-artifact@v4.4.3 | |
with: | |
name: html-coverage-report-project | |
path: htmlcov | |
verify-projects: | |
name: Verify project | |
needs: [ package, package-automation, unit-tests ] | |
uses: beeware/.github/.github/workflows/app-create-verify.yml@main | |
with: | |
runner-os: ${{ matrix.runner-os }} | |
framework: ${{ matrix.framework }} | |
strategy: | |
fail-fast: false | |
matrix: | |
framework: [ "toga", "pyside6", "pygame", "console" ] | |
runner-os: [ "macos-13", "macos-latest", "ubuntu-latest", "windows-latest" ] | |
verify-apps: | |
name: Build app | |
needs: [ package, package-automation, unit-tests ] | |
uses: beeware/.github/.github/workflows/app-build-verify.yml@main | |
with: | |
python-version: ${{ matrix.python-version }} | |
runner-os: ${{ matrix.runner-os }} | |
framework: ${{ matrix.framework }} | |
strategy: | |
fail-fast: false | |
matrix: | |
framework: [ "toga", "pyside6", "pygame", "console" ] | |
runner-os: [ "macos-13", "macos-latest", "ubuntu-latest", "windows-latest" ] | |
include: | |
# A version of Python that is supported by all the GUI toolkits. | |
- python-version: "3.12" | |
# Ubuntu must always use the system Python | |
- runner-os: ubuntu-latest | |
python-version: system |