summaryrefslogtreecommitdiffstats
path: root/.github/workflows/ci.yml
diff options
context:
space:
mode:
Diffstat (limited to '.github/workflows/ci.yml')
-rw-r--r--.github/workflows/ci.yml142
1 files changed, 142 insertions, 0 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..403dcc4
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,142 @@
+name: Tests and Checks
+
+# Only run CI on pushes to main and pull requests
+# We don't run CI on other branches, but those should be merged into main via a PR anyways which will trigger CI before the merge.
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ branches:
+ - main
+
+concurrency:
+ group: ci-${{ github.ref }}-1
+ cancel-in-progress: true
+
+jobs:
+ checks:
+ runs-on: "ubuntu-latest"
+ strategy:
+ matrix:
+ python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", pypy-3.9]
+ os: ["macos-latest", "ubuntu-latest", "windows-latest"]
+ steps:
+ - uses: actions/checkout@v3.3.0
+ with:
+ ref: ${{ github.event.pull_request.head.sha }} # Checkout pull request HEAD commit instead of merge commit
+ fetch-depth: 0 # checkout all history, needed for hatch versioning
+
+ - name: Setup python
+ uses: actions/setup-python@v4.5.0
+ with:
+ python-version: ${{ matrix.python-version }}
+
+ - name: Install pypa/build
+ run: python -m pip install build==0.10.0
+
+ - name: Install Hatch
+ run: python -m pip install hatch==1.6.3
+
+ - name: Unit Tests
+ run: hatch run test:unit-tests
+
+ - name: Code formatting (black)
+ run: hatch run test:format
+
+ - name: Code linting (ruff)
+ run: hatch run test:lint
+
+ - name: Install local gitlint for integration tests
+ run: |
+ hatch run qa:install-local
+
+ - name: Integration tests (default -> GITLINT_USE_SH_LIB=1)
+ run: |
+ hatch run qa:integration-tests
+ if: matrix.os != 'windows-latest'
+
+ - name: Integration tests (GITLINT_USE_SH_LIB=1)
+ run: |
+ hatch run qa:integration-tests
+ env:
+ GITLINT_USE_SH_LIB: 1
+ if: matrix.os != 'windows-latest'
+
+ - name: Integration tests (GITLINT_QA_USE_SH_LIB=0)
+ run: |
+ hatch run qa:integration-tests -k "not(test_commit_hook_continue or test_commit_hook_abort or test_commit_hook_edit)" qa
+ env:
+ GITLINT_QA_USE_SH_LIB: 0
+ if: matrix.os != 'windows-latest'
+
+ - name: Integration tests (Windows)
+ run: |
+ hatch run qa:integration-tests -k "not (test_commit_hook_continue or test_commit_hook_abort or test_commit_hook_edit or test_lint_staged_stdin or test_stdin_file or test_stdin_pipe_empty)" qa
+ if: matrix.os == 'windows-latest'
+
+ - name: Build test (gitlint)
+ run: |
+ python -m build
+ hatch clean
+
+ - name: Build test (gitlint-core)
+ run: |
+ python -m build
+ hatch clean
+ working-directory: ./gitlint-core
+
+ - name: Docs build (mkdocs)
+ run: hatch run docs:build
+
+ # Run gitlint. Skip during PR runs, since PR commit messages are transient and usually full of gitlint violations.
+ # PRs get squashed and get a proper commit message during merge.
+ - name: gitlint --debug
+ run: hatch run dev:gitlint --debug
+ continue-on-error: ${{ github.event_name == 'pull_request' }} # Don't enforce gitlint in PRs
+
+ - name: Code Coverage (coveralls)
+ uses: coverallsapp/github-action@master
+ with:
+ path-to-lcov: ".coverage.lcov"
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ git-commit: ${{ github.event.pull_request.head.sha }}
+ flag-name: gitlint-${{ matrix.os }}-${{ matrix.python-version }}
+ parallel: true
+
+ upload_coveralls:
+ needs: checks
+ runs-on: ubuntu-latest
+ steps:
+ - name: Upload coverage to coveralls
+ uses: coverallsapp/github-action@master
+ with:
+ path-to-lcov: ".coverage.lcov"
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ parallel-finished: true
+
+ check: # This job does nothing and is only used for the branch protection
+ if: always() # Ref: https://github.com/marketplace/actions/alls-green#why
+
+ needs:
+ - upload_coveralls
+ - checks
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Decide whether the needed jobs succeeded or failed
+ uses: re-actors/alls-green@release/v1
+ with:
+ jobs: ${{ toJSON(needs) }}
+
+ # When on main, auto publish dev build
+ auto-publish-dev:
+ needs:
+ - check
+ if: github.ref == 'refs/heads/main'
+ uses: ./.github/workflows/publish-release.yml
+ secrets: inherit # pass all secrets (required to access secrets in a called workflow)
+ with:
+ pypi_target: "pypi.org"
+ repo_release_ref: "main"