Continuous Integration #197
This file contains hidden or 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: "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 }} |