Skip to content

(#140) Return error if one of the commands on pipes fails #275

(#140) Return error if one of the commands on pipes fails

(#140) Return error if one of the commands on pipes fails #275

Workflow file for this run

name: CI
on:
push:
branches: [ master, main, 0.4.x ]
pull_request:
branches: [ master, main, 0.4.x ]
jobs:
test:
runs-on: ${{ matrix.os == 'alpine' && 'ubuntu-latest' || 'ubuntu-latest' }}
container: ${{ matrix.os == 'alpine' && 'alpine:latest' || null }}
strategy:
fail-fast: false
matrix:
include:
# Ubuntu tests
- name: "Ubuntu with PCRE2 + Coverage"
os: ubuntu
pcre2: true
coverage: true
configure_flags: "--with-pcre2"
- name: "Ubuntu without PCRE2"
os: ubuntu
pcre2: false
coverage: false
configure_flags: "--without-pcre2"
# Alpine (musl) tests
- name: "Musl with PCRE2"
os: alpine
pcre2: true
coverage: false
configure_flags: "--with-pcre2"
- name: "Musl without PCRE2"
os: alpine
pcre2: false
coverage: false
configure_flags: "--without-pcre2"
name: ${{ matrix.name }}
steps:
- uses: actions/checkout@v4
# Install dependencies - Ubuntu
- name: Install dependencies (Ubuntu)
if: matrix.os == 'ubuntu'
run: |
sudo apt-get update
sudo apt-get install -y \
autoconf \
automake \
build-essential \
perl \
patch \
diffutils \
xmlto \
libpcre2-dev \
gnulib \
lcov
# Install dependencies - Alpine with PCRE2
- name: Install dependencies (Alpine with PCRE2)
if: matrix.os == 'alpine' && matrix.pcre2
run: |
apk add --no-cache \
build-base \
autoconf \
automake \
perl \
patch \
diffutils \
xmlto \
pcre2-dev \
bash \
git \
coreutils \
python3
# Install dependencies - Alpine without PCRE2
- name: Install dependencies (Alpine without PCRE2)
if: matrix.os == 'alpine' && !matrix.pcre2
run: |
apk add --no-cache \
build-base \
autoconf \
automake \
perl \
patch \
diffutils \
xmlto \
bash \
git \
coreutils \
python3
# Bootstrap - Ubuntu
- name: Bootstrap
if: matrix.os == 'ubuntu'
run: ./bootstrap
# Bootstrap - Alpine
- name: Bootstrap (Alpine)
if: matrix.os == 'alpine'
run: |
./gnulib-update.sh
export PATH="/tmp/gnulib:$PATH"
./bootstrap
# Configure
- name: Configure
run: |
CFLAGS_EXTRA=""
LDFLAGS_EXTRA=""
if [ "${{ matrix.coverage }}" = "true" ]; then
CFLAGS_EXTRA="--coverage -g -O0"
LDFLAGS_EXTRA="--coverage"
fi
./configure ${{ matrix.configure_flags }} \
${CFLAGS_EXTRA:+CFLAGS="$CFLAGS_EXTRA"} \
${LDFLAGS_EXTRA:+LDFLAGS="$LDFLAGS_EXTRA"}
# Build
- name: Build
run: make -j$(nproc)
# Test
- name: Run tests
run: make check
# Coverage reporting (only for coverage builds)
- name: Generate coverage report
if: matrix.coverage
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 (using awk for more reliable parsing)
COVERAGE=$(awk '/lines\.+:/ {gsub(/[()%]/, "", $2); print $2}' coverage/summary.txt)
echo "COVERAGE_PERCENT=$COVERAGE" >> $GITHUB_ENV
echo "Coverage: $COVERAGE%"
# Extract detailed coverage info for PR comments
LINES_COVERED=$(awk '/lines\.+:/ {print $3 " " $4 " " $5}' coverage/summary.txt | tr -d '()')
FUNCTIONS_COVERED=$(awk '/functions\.+:/ {print $3 " " $4 " " $5}' coverage/summary.txt | tr -d '()')
echo "LINES_COVERED=$LINES_COVERED" >> $GITHUB_ENV
echo "FUNCTIONS_COVERED=$FUNCTIONS_COVERED" >> $GITHUB_ENV
- name: Upload coverage to Codecov
if: matrix.coverage
uses: codecov/codecov-action@v4
with:
file: ./coverage/coverage_filtered.info
flags: unittests
name: codecov-umbrella
fail_ci_if_error: false
token: ${{ secrets.CODECOV_TOKEN }}
# Show failures
- 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
# Separate distcheck job (doesn't fit well in matrix)
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
- 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