1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
name: CI
on:
push:
branches:
- main
- next
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
env:
VENV: .venv
permissions:
contents: read
checks: write
jobs:
analysis:
name: Code Analysis
runs-on: ubuntu-latest
if: (!contains(github.event.head_commit.message, '[skip ci]'))
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Setup Environment
uses: ./.github/actions/setup-env
- name: Install project dependencies
run: . script/bootstrap
- name: Lint
run: |
poetry run invoke lint
tests:
name: Tests
runs-on: ${{ matrix.os }}
if: (!contains(github.event.head_commit.message, '[skip ci]'))
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
python-version: ['3.10', '3.11', '3.12', '3.13', '3.14-dev']
fail-fast: ${{ !contains(github.event.pull_request.labels.*.name, 'ci/run-all-tests') }}
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Setup Environment
uses: ./.github/actions/setup-env
with:
python-version: ${{ matrix.python-version }}
- name: Install project dependencies
run: . script/bootstrap
shell: bash
- name: Run Tests (with coverage)
id: tests-with-coverage
if: matrix.python-version == '3.14-dev' && matrix.os == 'ubuntu-latest'
shell: bash
run: poetry run invoke test --coverage
- name: Run Tests
if: steps.tests-with-coverage.outcome == 'skipped'
shell: bash
run: poetry run invoke test
- name: Upload Coverage
if: steps.tests-with-coverage.conclusion == 'success'
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
with:
token: ${{ secrets.CODECOV_TOKEN }}
# # TODO: How to do this with poetry?
# version_checks:
# name: Dependency Version Constraint Checks
# runs-on: ubuntu-latest
# if: "!contains(github.event.head_commit.message, '[skip ci]')"
# env:
# SKIP_DEPS: 1
# steps:
# - uses: actions/checkout@v3.1.0
# - name: Setup Environment
# uses: ./.github/actions/setup-env
# with:
# python-version: 3.7 # it's min, so we'll use an older version of python
# - name: Install project dependencies
# run: |
# . script/bootstrap
# poetry install --with=test
# - name: Test
# env:
# CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
# run: |
# . $VENV/bin/activate
# poetry run invoke test --coverage
benchmark:
name: Benchmark
runs-on: ubuntu-latest
if: github.event_name == 'pull_request' && !contains(github.event.head_commit.message, '[skip ci]')
needs: [tests]
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Setup Environment
uses: ./.github/actions/setup-env
- name: Install project dependencies
run: . script/bootstrap
- name: Benchmark
run: poetry run invoke benchmark
- name: Publish Benchmark Results
uses: benchmark-action/github-action-benchmark@4bdcce38c94cec68da58d012ac24b7b1155efe8b # v1.20.7
with:
tool: 'pytest'
output-file-path: benchmarks.json
github-token: ${{ github.token }}
auto-push: false
alert-threshold: '200%'
comment-on-alert: true
fail-on-alert: false
comment-always: true
required_checks:
name: Required Checks
needs:
- analysis
- tests
- benchmark
runs-on: ubuntu-latest
if: always()
steps:
- name: Fail on error
if: contains(needs.*.result, 'failure') || cancelled()
run: exit 1
|