Skip to content

Reworks workflows to integrate release creation and trusted publishing in addition to testing and linting #3

Reworks workflows to integrate release creation and trusted publishing in addition to testing and linting

Reworks workflows to integrate release creation and trusted publishing in addition to testing and linting #3

Workflow file for this run

name: Continuous Integration
on:
push:
pull_request:
branches:
- main
concurrency:
group: ci-${{ github.ref_name }}
cancel-in-progress: true
jobs:
code-lint:
name: Code Linting
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.x
uses: actions/setup-python@v5
with:
python-version: '3.x'
cache: 'pip'
- name: Install Hatch
run: |
pip3 --quiet install --upgrade hatch uv
hatch --version
uv --version
- name: Lint project
# TODO: This cannot run as the project doesn't pass yet
if: false
run: |
hatch fmt --check
- name: Check files with pre-commit
# TODO: This cannot run as the project doesn't pass yet
if: false
uses: pre-commit/[email protected]
docs-lint:
name: Documentation Linting
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: 3.x
cache: pip
- name: Install dependecies
run: |
pip install --upgrade hatch uv
- name: Check documentation links
run: |
hatch run docs:linkcheck
- name: Check docs build
run: |
hatch run docs:build
tests:
name: Python ${{ matrix.python-version }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
needs:
- code-lint
strategy:
matrix:
os:
- ubuntu-latest
- windows-latest
python-version:
- "3.9"
- "3.10"
- "3.11"
- "3.12"
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
cache: pip
- name: Install dependencies
run: |
python -m pip install --upgrade pip hatch uv
- name: Show environment
run: |
hatch test --show --python ${{ matrix.python-version }}
- name: Run tests
run: |
hatch test --cover --python ${{ matrix.python-version }}
mv .coverage ".coverage.py${{ matrix.python-version }}"
- name: Upload coverage data
if: matrix.os != 'windows-latest'
uses: actions/upload-artifact@v4
with:
name: "coverage-data-py${{ matrix.python-version }}"
path: ".coverage.py${{ matrix.python-version }}"
if-no-files-found: error
include-hidden-files: true
build:
name: Build Distributions
runs-on: ubuntu-latest
permissions:
contents: read
needs:
- code-lint
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.x
uses: actions/setup-python@v5
with:
python-version: '3.x'
cache: 'pip'
- name: Install Hatch
run: |
pip3 --quiet install --upgrade hatch uv
hatch --version
uv --version
- name: Build release files
run: |
hatch build --clean
- uses: actions/upload-artifact@v4
with:
name: artifacts
path: dist/*
if-no-files-found: error
retention-days: 7
coverage:
name: Coverage
runs-on: ubuntu-latest
needs:
- tests
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.11"
cache: pip
- name: Install dependencies
run: python -m pip install --upgrade coverage[toml]
- name: Download data
uses: actions/download-artifact@v4
with:
merge-multiple: true
- name: Combine coverage and fail if it's <95%
run: |
python -m coverage combine
python -m coverage html --skip-covered --skip-empty
python -m coverage report --fail-under=95
- name: Upload HTML report
if: ${{ failure() }}
uses: actions/upload-artifact@v4
with:
name: html-report
path: htmlcov
docs-deploy:
name: Deploy Documentation
runs-on: ubuntu-latest
needs:
- docs-lint
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: 3.x
cache: pip
- name: Install dependecies
run: |
pip install --upgrade hatch uv
- name: Configure Git
run: |
git config user.name github-actions
git config user.email [email protected]
- name: Publish Develop Docs
if: github.ref_name == 'main'
run: |
hatch run docs:deploy_develop
- name: Publish Develop Docs
if: startsWith(github.ref, 'refs/tags/')
run: |
hatch run docs:deploy_latest ${{ github.ref_name }}
create-release:
name: Create Release
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
permissions:
contents: write
needs:
- build
- tests
- docs-deploy
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/download-artifact@v4
with:
name: artifacts
path: dist
- name: Get latest release info
id: query-release-info
uses: release-flow/keep-a-changelog-action@v3
with:
command: query
version: ${{ github.ref_name }}
- name: Display release info
run: |
echo "Version: ${{ steps.query-release-info.outputs.version }}"
echo "Date: ${{ steps.query-release-info.outputs.release-date }}"
echo "${{ steps.query-release-info.outputs.release-notes }}"
- uses: ncipollo/release-action@v1
with:
artifacts: "dist/*.tar.gz,dist/*.whl"
body: ${{ steps.query-release-info.outputs.release-notes }}
pypi-publish:
name: Publish to PyPi
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
permissions:
id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
needs:
- build
- tests
- docs-deploy
steps:
- uses: actions/download-artifact@v4
with:
name: artifacts
path: dist
- name: Publish build to PyPI
uses: pypa/[email protected]