I like using GitLab because it has so much of the everyday developer tooling integrated right into the product. Nowadays GitHub Actions are powerful enough to do many of the same things, including code coverage.
Most projects on GitHub use external services like Codecov for code coverage reporting. I don’t have the budget for these external services and I’m not interested in setting up and maintaining different solutions based on the publicity or the organization of the project so I decided to write a native solution using Github Actions instead.

Setting Up Github Actions
There are a few different solutions for doing this. I found irongut/CodeCoverageSummary action to be most suited for my needs. It consumes standard Cobertura coverage reports and outputs a summary either as text or markdown.
To make the summary visible on a pull request I used marocchino/sticky-pull-request-comment action.
The whole configuration looks like this:
coverage:runs-on: ubuntu-lateststeps: - uses: actions/checkout@v3 - name: Setup Python uses: actions/setup-python@v3
- name: Install dependencies run: pip install -r requirements.txt
- name: Coverage run: pytest --cov=src/playlistparser --cov-report xml
- name: Coverage Summary Report uses: irongut/CodeCoverageSummary@v1.2.0 with: filename: coverage.xml badge: true format: 'markdown' output: 'both'
- name: Add Coverage PR Comment uses: marocchino/sticky-pull-request-comment@v2.2.0 if: github.event_name == 'pull_request' with: recreate: true path: code-coverage-results.mdAbove configuration is for a dedicated job which is useful is the tests run as a matrix. If you only run one set of tests it’s easier and faster to just pop the coverage step after the tests.
Here’s an example of this in action.