.github/workflows/ci_cd.yml

Summary

Maintainability
Test Coverage
name: "CI/CD"

on:
  pull_request:
  push:
    branches:
      - master


concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  # Don't continue building images for a PR if the PR is updated quickly
  # For other workflows, allow them to complete and just block on them. This
  # ensures deployments in particular to happen in series rather than parallel.
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
  lint:
    name: lint
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.12'
          cache: 'pip'

      - name: Install hatch
        run: pipx install hatch

      - name: Lint
        run: hatch run lint:run

  build:
    name: build
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.12'
          cache: 'pip'

      - name: Install hatch
        run: pipx install hatch

      - name: Install twine
        run: pipx install twine

      - name: Build distribution
        run: hatch build

      - name: Check build
        run: twine check --strict dist/*

  test:
    name: test on ${{ matrix.py }}
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        py:
          - 'pypy3.10'
          - '3.12'
          - '3.11'
          - '3.10'
          - '3.9'
          - '3.8'

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Setup Python for test ${{ matrix.py }}
        uses: actions/setup-python@v4
        with:
          python-version: ${{ matrix.py }}
          cache: pip

      - name: Install hatch
        run: pipx install hatch

      - name: Run test suite
        run: hatch run test.${{ !startsWith(matrix.py, 'pypy') && 'py' || '' }}${{ matrix.py }}:test