Skip to content

Run GCOVR CI

Run GCOVR CI #43

Workflow file for this run

# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
name: Run GCOVR CI
on:
workflow_dispatch: # For manual triggering
push:
branches:
- main
pull_request:
types: [opened, synchronize, reopened, edited]
jobs:
changelog-check:
runs-on: ubuntu-22.04
env:
PR_BODY: "${{ github.event.pull_request.body }}"
CHANGELOG_ISSUE: ":issue:`${{ github.event.pull_request.number }}`"
steps:
- uses: actions/checkout@v4
- name: Check if PR is mentioned in changelog
if: ${{ always() }}
run: |
if [ -z "${{ github.event.pull_request.number }}" ]; then
echo 'No PR defined'
else
if grep -qE '^\[no changelog\]' <<<"$PR_BODY"; then
echo 'Marker "[no changelog]" found in PR body'
if [ "$(grep -F "$CHANGELOG_ISSUE" CHANGELOG.rst)" != "" ]; then
echo "ERROR: $CHANGELOG_ISSUE found in CHANGELOG.rst."
exit 1
else
echo "OK: $CHANGELOG_ISSUE not found in CHANGELOG.rst"
fi
else
echo 'Marker "[no changelog]" not found in PR body'
if [ "$(grep -F "$CHANGELOG_ISSUE" CHANGELOG.rst)" == "" ]; then
echo "ERROR: $CHANGELOG_ISSUE not found in CHANGELOG.rst."
exit 1
else
echo "OK: $CHANGELOG_ISSUE found in CHANGELOG.rst"
fi
fi
fi
exit 0
spell-check:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Install spellchecker
run:
npm install -g cspell@latest
- name: Run spellchecker
run: |
cspell
upload-lcov:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Upload LCOV coverage
if: ${{ env.USE_COVERAGE == 'true' }}
uses: actions/upload-artifact@v4
with:
name: "coverage-lcov"
path: ./tests/nested/reference/**/coverage.lcov
host:
needs: [changelog-check, spell-check, upload-lcov]
uses: ./.github/workflows/gcovr-ci-job.yml
with:
os: ${{ matrix.os }}
gcc: ${{ matrix.gcc }}
python-version: ${{ matrix.python-version }}
upload-dist: ${{ matrix.upload-dist || false }} # Explicit set to false if not set
upload-app: ${{ matrix.upload-app || false }} # Explicit set to false if not set
upload-release-notes: ${{ matrix.upload-release-notes || false }} # Explicit set to false if not set
secrets: inherit
# Testing strategy
# ----------------
#
# We have different axes of the testing matrix:
#
# OS: Linux, Windows
# Compiler: GCC-5 to GCC-14, Clang-10 to CLANG-15
# Python: 3.8 -- 3.12, pypy3
#
# Instead of testing all combinations, we try to achieve full coverage
# across each axis. The main test matrix just represents the Python axis on
# Linux. The OS=Windows and Compiler axis are added manually.
#
# Some cases (Clang compiler) are handled via the Docker-tests.
strategy:
fail-fast: false
matrix:
os: [ubuntu-20.04]
gcc: [gcc-8]
python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', 'pypy-3.8']
include:
# Test additional compilers with Linux.
# Note that all compiler versions are also handled via Docker.
- os: ubuntu-20.04
gcc: gcc-9
python-version: '3.9'
- os: ubuntu-22.04
gcc: gcc-11
python-version: '3.12'
upload-dist: true
upload-app: true
upload-release-notes: true
# Test minimum and maximum Python version on Windows.
- os: windows-2019
gcc: gcc
python-version: '3.8'
- os: windows-2019
gcc: gcc
python-version: '3.12'
upload-app: true
# Test minimum and maximum Python version on Mac OS.
- os: macos-13
gcc: gcc
python-version: '3.12'
upload-app: true
- os: macos-14
gcc: gcc
python-version: '3.9'
- os: macos-14
gcc: gcc-13
python-version: '3.12'
upload-app: true
docker:
needs: [changelog-check, spell-check, upload-lcov]
uses: ./.github/workflows/gcovr-ci-job.yml
with:
container: true
gcc: ${{ matrix.gcc }}
secrets: inherit
strategy:
fail-fast: false
matrix:
gcc: [gcc-5, gcc-6, gcc-8, gcc-9, gcc-10, gcc-11, gcc-12, gcc-13, gcc-14, clang-10, clang-13, clang-14, clang-15]
deployment:
needs: [host, docker]
runs-on: ubuntu-22.04
permissions:
contents: write
env:
FORCE_COLOR: "1"
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: "./.github/actions/setup-python"
with:
os: ubuntu-22.04
python-version: 3.12
- name: Install dependencies
run: |
python3 -m pip install --upgrade pip
python3 -m pip install nox requests
# Need to prevent creation of an existing tag
- name: Fetch all tags
run: |
git fetch --force --tags --depth=1
- name: Create new tag
run: |
# Create the new tag and check if it needs to be pushed
# Get the version
GcovrVersion="$(sed -n 's/__version__.*"\(.*\)"/\1/ p' gcovr/version.py)"
echo "GCOVR_VERSION=$GcovrVersion" >> $GITHUB_ENV
# Set git user info
git config --global user.email "[email protected]"
git config --global user.name "gcovr authors"
# Try to create the tag and print the output. It's only pushed if it's a real release
git tag -a "$GcovrVersion" -m "$GcovrVersion ($(date -I))"
git tag --list -n "$GcovrVersion"
# Check if it is a new release
VersionPostfix="$(echo "$GcovrVersion" | sed -n 's/^[0-9]*\.[0-9]*// p')"
if [ -z "$VersionPostfix" ]; then
echo "TAG_NEEDS_TO_BE_PUSHED=true" >> $GITHUB_ENV
else
echo "TAG_NEEDS_TO_BE_PUSHED=false" >> $GITHUB_ENV
fi
- name: For a dry run, don't verify tags and documentation
if: ${{ env.TAG_NEEDS_TO_BE_PUSHED == 'false' }}
run: |
echo "EXTRA_CHECKLIST_ARGS=--no-verify-tags --no-verify-docs-next-version" >> $GITHUB_ENV
- name: Run release checklist
run: |
admin/release_checklist.sh $EXTRA_CHECKLIST_ARGS 8.2+main
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: build
pattern: app-*
merge-multiple: true
- name: List standalone applications
run: |
ls -al build
- name: Download distribution files
uses: actions/download-artifact@v4
with:
path: dist
name: dist
- name: List distribution files
run: |
ls -al dist
- name: Download release notes
uses: actions/download-artifact@v4
with:
name: release-notes
- name: Set release notes as job summary
run: |
cat release_notes.md >> $GITHUB_STEP_SUMMARY
- name: Push new tag
if: ${{ (github.repository == 'gcovr/gcovr') && (github.event.ref == 'refs/heads/main') && env.TAG_NEEDS_TO_BE_PUSHED == 'true' }}
run: |
# Set git user info
git config --global user.email "[email protected]"
git config --global user.name "gcovr authors"
git push origin "refs/tags/$GCOVR_VERSION"
- name: Create release and upload build artifacts
if: ${{ (github.repository == 'gcovr/gcovr') && (github.event.ref == 'refs/heads/main') && (env.TAG_NEEDS_TO_BE_PUSHED == 'true') }}
uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191
with:
tag_name: ${{ env.GCOVR_VERSION }}
body_path: release_notes.md
files: build/*
- name: Publish to PyPi
if: ${{ (github.repository == 'gcovr/gcovr') && (github.event.ref == 'refs/heads/main') && (env.TAG_NEEDS_TO_BE_PUSHED == 'true') }}
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
run: |
nox --session upload_wheel