Skip to content

Add code coverage reporting #104

Add code coverage reporting

Add code coverage reporting #104

Workflow file for this run

name: CI

Check failure on line 1 in .github/workflows/ci.yml

View workflow run for this annotation

GitHub Actions / .github/workflows/ci.yml

Invalid workflow file

(Line: 70, Col: 11): Unrecognized named-value: 'secrets'. Located at position 69 within expression: github.ref == 'refs/heads/master' && github.event_name == 'push' && secrets.GIST_ID != ''
on:
push:
branches: [ master, main ]
pull_request:
branches: [ master, main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
autoconf \
automake \
build-essential \
perl \
patch \
diffutils \
xmlto \
libpcre2-dev \
gnulib \
lcov
- name: Bootstrap
run: ./bootstrap
- name: Configure
run: |
./configure \
--with-pcre2 \
CFLAGS="--coverage -g -O0" \
LDFLAGS="--coverage"
- name: Build
run: make -j$(nproc)
- name: Run tests
run: make check
- name: Generate coverage report
run: |
# Create coverage directory
mkdir -p coverage
# Capture coverage data with geninfo options to handle warnings
lcov --capture --directory . --output-file coverage/coverage.info --rc geninfo_unexecuted_blocks=1
# Remove coverage data for system headers, lib files, and test files
lcov --remove coverage/coverage.info '/usr/*' '*/lib/*' '*/tests/*' --output-file coverage/coverage_filtered.info --ignore-errors unused
# Generate HTML report
genhtml coverage/coverage_filtered.info --output-directory coverage/html
# Generate summary for CI and extract coverage percentage
lcov --summary coverage/coverage_filtered.info > coverage/summary.txt
# Extract coverage percentage for badge
COVERAGE=$(grep -o 'lines......: [0-9.]*%' coverage/summary.txt | grep -o '[0-9.]*')
echo "COVERAGE_PERCENT=$COVERAGE" >> $GITHUB_ENV
echo "Coverage: $COVERAGE%"
- name: Create coverage badge
if: github.ref == 'refs/heads/master' && github.event_name == 'push' && secrets.GIST_ID != ''
uses: schneegans/dynamic-badges-action@v1.7.0
with:
auth: ${{ secrets.GITHUB_TOKEN }}
gistID: ${{ secrets.GIST_ID }}
filename: patchutils-coverage.json
label: coverage
message: ${{ env.COVERAGE_PERCENT }}%
color: ${{ env.COVERAGE_PERCENT > 80 && 'brightgreen' || env.COVERAGE_PERCENT > 60 && 'yellow' || 'red' }}
- name: Upload coverage reports
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage/
- name: Show test results on failure
if: failure()
run: |
echo "=== Test logs ==="
find . -name "*.log" -type f -exec echo "=== {} ===" \; -exec cat {} \;
echo "=== Test arena contents ==="
find test-arena -type f 2>/dev/null | head -20 | while read f; do
echo "=== $f ==="
cat "$f" 2>/dev/null || echo "Cannot read file"
done
test-without-pcre2:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies (without PCRE2)
run: |
sudo apt-get update
sudo apt-get install -y \
autoconf \
automake \
build-essential \
perl \
patch \
diffutils \
xmlto \
gnulib
- name: Bootstrap
run: ./bootstrap
- name: Configure without PCRE2
run: ./configure --without-pcre2
- name: Build
run: make -j$(nproc)
- name: Run tests
run: make check
test-distcheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
autoconf \
automake \
build-essential \
perl \
patch \
diffutils \
xmlto \
libpcre2-dev \
gnulib
- name: Bootstrap
run: ./bootstrap
- name: Configure
run: ./configure --with-pcre2
- name: Build and test distribution
run: make distcheck
test-musl:
runs-on: ubuntu-latest
container: alpine:latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
apk add --no-cache \
build-base \
autoconf \
automake \
perl \
patch \
diffutils \
xmlto \
pcre2-dev \
bash \
git \
coreutils \
python3
- name: Clone gnulib for bootstrap
run: |
./gnulib-update.sh
- name: Bootstrap
run: |
export PATH="/tmp/gnulib:$PATH"
./bootstrap
- name: Configure
run: ./configure --with-pcre2
- name: Build
run: make -j$(nproc)
- name: Run tests
run: make check
- name: Show test results on failure
if: failure()
run: |
echo "=== Test logs ==="
find . -name "*.log" -type f -exec echo "=== {} ===" \; -exec cat {} \;
echo "=== Test arena contents ==="
find test-arena -type f 2>/dev/null | head -20 | while read f; do
echo "=== $f ==="
cat "$f" 2>/dev/null || echo "Cannot read file"
done
test-musl-without-pcre2:
runs-on: ubuntu-latest
container: alpine:latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies (without PCRE2)
run: |
apk add --no-cache \
build-base \
autoconf \
automake \
perl \
patch \
diffutils \
xmlto \
bash \
git \
coreutils \
python3
- name: Clone gnulib for bootstrap
run: |
./gnulib-update.sh
- name: Bootstrap
run: |
export PATH="/tmp/gnulib:$PATH"
./bootstrap
- name: Configure without PCRE2
run: ./configure --without-pcre2
- name: Build
run: make -j$(nproc)
- name: Run tests
run: make check
- name: Show test results on failure
if: failure()
run: |
echo "=== Test logs ==="
find . -name "*.log" -type f -exec echo "=== {} ===" \; -exec cat {} \;
echo "=== Test arena contents ==="
find test-arena -type f 2>/dev/null | head -20 | while read f; do
echo "=== $f ==="
cat "$f" 2>/dev/null || echo "Cannot read file"
done