From 6b05898a5b7de92bf54240ef4f45934827a71424 Mon Sep 17 00:00:00 2001 From: Martin Fitzner Date: Tue, 28 Nov 2023 11:19:59 +0100 Subject: [PATCH] Add CI pipeline --- .github/workflows/ci.yml | 150 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..8cb7e63098 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,150 @@ +# NOTES: +# - The map syntax used for matrix is flagged red but actually works +# - This runs everything in Python 3.11, except the fulltest which is also run in 3.8 +# - Only coretest and fulltest environments are cached due to space limit + +name: Continuous Integration +on: + push: + branches: main + tags: '*' + pull_request: + branches: main + workflow_dispatch: + +env: + COVERAGE_OVERALL_THRESH: 70 # threshold for overall coverage check + COVERAGE_INDIVIDUAL_THRESH: 45 # threshold for individual coverage check + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + changelog: + name: "Changelog" + runs-on: ubuntu-latest + if: ${{ github.event_name == 'pull_request' }} + steps: + - uses: actions/checkout@v3 + - name: Assert Changelog Edit + run: | + git fetch origin main:main + NUM_ADDED=`git diff --numstat main HEAD CHANGELOG.md | cut -d$'\t' -f1` + echo "Changelog differences: $NUM_ADDED" + if [ "$NUM_ADDED" -gt "0" ]; then + echo "SUCCESS" + exit 0 + else + echo "ERROR - Nothing has been added to CHANGELOG.md" + exit 1 + fi + + lint: + strategy: + matrix: + py-version: [ {semantic: '3.11', tox: 'py311'} ] + name: Lint ${{ matrix.py-version.semantic }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + id: setup-python + with: + python-version: ${{ matrix.py-version.semantic }} + - name: Run linting + run: | + pip install tox + tox -e lint-${{ matrix.py-version.tox }} + + typecheck: + needs: [changelog, lint] + strategy: + matrix: + py-version: [ {semantic: '3.11', tox: 'py311'} ] + name: Type Check ${{ matrix.py-version.semantic }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + id: setup-python + with: + python-version: ${{ matrix.py-version.semantic }} + - name: Run type check + run: | + pip install tox + tox -e mypy-${{ matrix.py-version.tox }} + + audit: + needs: [changelog, lint] + strategy: + matrix: + py-version: [ {semantic: '3.11', tox: 'py311'} ] + name: Audit ${{ matrix.py-version.semantic }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + id: setup-python + with: + python-version: ${{ matrix.py-version.semantic }} + - name: Run pip-audit + run: | + pip install tox + tox -e audit-${{ matrix.py-version.tox }} + + coretest: + needs: [typecheck, audit] + strategy: + matrix: + py-version: [ {semantic: '3.8', tox: 'py38'} ] + name: Core Tests ${{ matrix.py-version.semantic }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + id: setup-python + with: + python-version: ${{ matrix.py-version.semantic }} + - uses: actions/cache@v3 + with: + path: .tox/coretest-${{ matrix.py-version.tox }} + key: coretest-${{ matrix.py-version.tox }}-${{ hashFiles('pyproject.toml') }}-${{ hashFiles('tox.ini') }} + - name: Run core tests + run: | + pip install tox + tox -e coretest-${{ matrix.py-version.tox }} + + fulltest: + needs: [typecheck, audit] + strategy: + matrix: + py-version: [ {semantic: '3.8', tox: 'py38'}, {semantic: '3.11', tox: 'py311'} ] + name: Full Tests ${{ matrix.py-version.semantic }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + id: setup-python + with: + python-version: ${{ matrix.py-version.semantic }} + - uses: actions/cache@v3 + with: + path: .tox/fulltest-${{ matrix.py-version.tox }} + key: fulltest-${{ matrix.py-version.tox }}-${{ hashFiles('pyproject.toml') }}-${{ hashFiles('tox.ini') }} + - name: Run full tests + run: | + pip install tox + tox -e fulltest-${{ matrix.py-version.tox }} -- --cov-report=xml + - name: "Assert Overall Coverage" + run: | + pip install coverage + coverage report --fail-under=${{ env.COVERAGE_OVERALL_THRESH }} + - name: "Assert Individual Coverage" + shell: bash + run: | + coverage report | + grep -E -o '[0-9]+%' | + tr -d '%' | + sed '$d' | + awk '{if ( $1<${{ env.COVERAGE_INDIVIDUAL_THRESH }} ) exit 1 }' \ No newline at end of file