Skip to content

Continuous Integration #197

Continuous Integration

Continuous Integration #197

Workflow file for this run

name: "Continuous Integration"
on:
push:
branches: [main]
pull_request:
schedule:
- cron: "0 2 * * *"
jobs:
tests:
name: python ${{ matrix.python-version }}, ${{ matrix.database }}, ${{ matrix.uv-resolution }} deps
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version:
- "3.9"
- "3.10"
- "3.11"
- "3.12"
- "3.13"
database:
- sqlite
uv-resolution:
- highest
include:
# Add lowest-direct resolution test for oldest and newest Python
- python-version: "3.9"
database: sqlite
uv-resolution: lowest-direct
- python-version: "3.13"
database: sqlite
uv-resolution: lowest-direct
# Also test against Postgres and MySQL for oldest and newest Python
- python-version: "3.9"
database: postgres
uv-resolution: highest
- python-version: "3.13"
database: postgres
uv-resolution: highest
- python-version: "3.9"
database: mysql
uv-resolution: highest
- python-version: "3.13"
database: mysql
uv-resolution: highest
services:
postgres:
# workaround for https://github.com/actions/runner/issues/822
image: ${{ matrix.database == 'postgres' && 'postgres:latest' || '' }}
env:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_DB: test_db
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
mysql:
# workaround for https://github.com/actions/runner/issues/822
image: ${{ matrix.database == 'mysql' && 'mysql:latest' || '' }}
env:
MYSQL_ROOT_PASSWORD: mysql
MYSQL_DATABASE: test_db
ports:
- 3306:3306
options: >-
--health-cmd "mysqladmin ping -h localhost"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- name: Install uv and set the python version
uses: astral-sh/setup-uv@v5
with:
python-version: ${{ matrix.python-version }}
cache-dependency-glob: "**/pyproject.toml"
cache-suffix: ${{ matrix.uv-resolution }}
- name: Install the project and dependencies
run: uv sync --dev --resolution ${{ matrix.uv-resolution }}
- name: Run tests
run: |
# Install software and run tests
if [ "${{ matrix.database }}" = "postgres" ]; then
export WITH='--with psycopg2-binary'
export DB_URL=postgresql://postgres:postgres@localhost:5432/test_db
elif [ "${{ matrix.database }}" = "mysql" ]; then
export WITH='--with mysqlclient'
# 127.0.0.1 is to persuade mysqlclient to use tcp rather than the domain socket :-/
export DB_URL=mysql://root:mysql@127.0.0.1:3306/test_db
fi
uv run --no-sync $WITH --resolution ${{ matrix.uv-resolution }} -m coverage run -m pytest --sqlalchemy-connect-url=$DB_URL
- name: Upload coverage data
uses: actions/upload-artifact@v4
with:
name: coverage-data-${{ matrix.python-version }}-${{ matrix.uv-resolution }}-${{ matrix.database }}
path: .coverage.*
include-hidden-files: true
if-no-files-found: ignore
coverage:
needs: tests
runs-on: ubuntu-latest
steps:
- uses: cjw296/python-action/check-coverage@v1
typing:
name: python ${{ matrix.python-version }} type checking
runs-on: ubuntu-latest
strategy:
matrix:
python-version:
- "3.9"
- "3.13"
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v5
with:
python-version: ${{ matrix.python-version }}
cache-dependency-glob: "**/pyproject.toml"
- name: Install the project
run: uv sync --dev
- name: Run tests
run: uv run mypy src tests
formatting:
runs-on: ubuntu-latest
steps:
- uses: cjw296/python-action/check-formatting@v1
build-and-inspect-package:
needs:
- tests
- coverage
- typing
- formatting
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: hynek/build-and-inspect-python-package@v2
check-package:
needs:
- build-and-inspect-package
runs-on: ubuntu-latest
strategy:
matrix:
python-version:
- "3.9"
- "3.13"
steps:
- uses: cjw296/python-action/check-distributions@v1
with:
package: pytest_sqlalchemy
python-version: ${{ matrix.python-version }}