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"