Skip to content

ci: bump github/codeql-action to 4.37.9 and group its bumps #1384

ci: bump github/codeql-action to 4.37.9 and group its bumps

ci: bump github/codeql-action to 4.37.9 and group its bumps #1384

Workflow file for this run

name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
permissions:
contents: read
jobs:
build-linux-gcc:
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
container:
image: ghcr.io/cososo-ltd/cpputest@sha256:68e7fbb6f02996717ce9211fd8089a0c52763da4990dfe69653c00ad697551b9 # sha-6715942
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure
run: cmake --preset debug
- name: Build and test
run: cmake --build --preset debug --target junit BddTargetTests
- name: Run BDD target tests
run: cd build/debug && ./Tests/Bdd/Targets/BddTargetTests -ojunit -k BddTargetTests
- name: Test Report
uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 # v3.0.0
if: success() || failure()
with:
name: Test Results (GCC)
path: build/debug/cpputest_*.xml
reporter: java-junit
- name: Upload JUnit XML
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: junit-build-linux-gcc
path: build/debug/cpputest_*.xml
retention-days: 1
integration-linux-openssl:
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
container:
image: ghcr.io/cososo-ltd/cpputest@sha256:68e7fbb6f02996717ce9211fd8089a0c52763da4990dfe69653c00ad697551b9 # sha-6715942
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure
run: cmake --preset debug
- name: Build integration tests
run: cmake --build --preset debug --target OpenSslIntegrationTests
- name: Run integration tests
run: cd build/debug && ./Tests/OpenSslIntegration/OpenSslIntegrationTests -v -ojunit -k OpenSslIntegrationTests
- name: Test Report
uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 # v3.0.0
if: success() || failure()
with:
name: Test Results (OpenSSL Integration)
path: build/debug/cpputest_*.xml
reporter: java-junit
- name: Upload JUnit XML
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: junit-integration-linux-openssl
path: build/debug/cpputest_*.xml
retention-days: 1
integration-linux-mbedtls:
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
# cpputest-freertos image carries /opt/mbedtls (and exports MBEDTLS_DIR);
# Tests/MbedTlsIntegration/CMakeLists.txt requires that env var.
container:
image: ghcr.io/cososo-ltd/cpputest-freertos@sha256:476cfeab90e8179ab909dba8c77c8e9ef3b594e67ba98dca39108747583f5c41 # sha-ad10bf2
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure
run: cmake --preset debug
- name: Build integration tests
run: cmake --build --preset debug --target MbedTlsIntegrationTests
- name: Run integration tests
run: cd build/debug && ./Tests/MbedTlsIntegration/MbedTlsIntegrationTests -v -ojunit -k MbedTlsIntegrationTests
- name: Test Report
uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 # v3.0.0
if: success() || failure()
with:
name: Test Results (mbedTLS Integration)
path: build/debug/cpputest_*.xml
reporter: java-junit
- name: Upload JUnit XML
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: junit-integration-linux-mbedtls
path: build/debug/cpputest_*.xml
retention-days: 1
integration-windows-openssl:
runs-on: windows-latest
permissions:
contents: read
checks: write
env:
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Enable vcpkg binary cache
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
# Cache vcpkg's classic-mode installed tree across runs and branches.
# x-gha (above) is per-workflow scope and goes cold on a fresh branch;
# actions/cache survives across branches with a static key. Bump the
# `v1` suffix to force a rebuild (e.g. when adding a package).
# C:\vcpkg is the standard VCPKG_INSTALLATION_ROOT on github-hosted
# windows runners — hardcoded here so the cache step doesn't depend
# on a runner-image-set env var (the linter can't see those).
- name: Cache vcpkg installed tree
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
# The cache is a pure speed optimisation — a flaky restore must never
# skip the build+test. actions/cache can fail mid-restore (even after
# reporting a hit); without continue-on-error that failure trips the
# default `if: success()` on every following step, so Install / Configure
# / Build-and-test all skip and the job goes red without ever compiling.
# On a miss or partial restore the `vcpkg install` below rebuilds the
# tree (backed by the x-gha binary cache), so the only cost is a slower
# run.
continue-on-error: true
with:
path: C:\vcpkg\installed
key: ${{ runner.os }}-vcpkg-cpputest-openssl-v1
- name: Install CppUTest and OpenSSL
run: |
vcpkg install cpputest openssl
echo "VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT" >> $env:GITHUB_ENV
- name: Configure
run: cmake --preset msvc-debug
- name: Build integration tests
run: cmake --build --preset msvc-debug --target OpenSslIntegrationTests
- name: Run integration tests
shell: pwsh
run: |
Set-Location build/msvc-debug/Tests/OpenSslIntegration/Debug
./OpenSslIntegrationTests.exe -v -ojunit -k OpenSslIntegrationTests
- name: Test Report
uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 # v3.0.0
if: success() || failure()
with:
name: Test Results (OpenSSL Integration Windows)
path: build/msvc-debug/Tests/OpenSslIntegration/Debug/cpputest_*.xml
reporter: java-junit
- name: Upload JUnit XML
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: junit-integration-windows-openssl
path: build/msvc-debug/Tests/OpenSslIntegration/Debug/cpputest_*.xml
retention-days: 1
build-linux-tunable-override:
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
container:
image: ghcr.io/cososo-ltd/cpputest@sha256:68e7fbb6f02996717ce9211fd8089a0c52763da4990dfe69653c00ad697551b9 # sha-6715942
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure with tunable override
run: cmake --preset tunable-override-debug
# The host BDD target is built here rather than against the defaults --
# see the @requires_message_size_1500 entry in docs/bdd.md.
- name: Build and test
run: cmake --build --preset tunable-override-debug --target junit SolidSyslogBddTarget
- name: Test Report
uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 # v3.0.0
if: success() || failure()
with:
name: Test Results (Tunable Override)
path: build/tunable-override-debug/cpputest_*.xml
reporter: java-junit
- name: Upload JUnit XML
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: junit-build-linux-tunable-override
path: build/tunable-override-debug/cpputest_*.xml
retention-days: 1
- name: Upload BDD target binaries
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: solid-syslog-bdd-targets
path: |
build/tunable-override-debug/Bdd/Targets/SolidSyslogBddTarget
retention-days: 1
compression-level: 0
# BDD-side mirror of build-time tunables, generated by configure_file.
# bdd-linux-syslog-ng downloads this into Bdd/features/steps/ so behave
# can `import solidsyslog_tunables` (the file is gitignored, not in checkout).
- name: Upload BDD Python tunables (Linux)
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: bdd-tunables-linux
path: Bdd/features/steps/solidsyslog_tunables.py
retention-days: 1
build-linux-clang:
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
container:
image: ghcr.io/cososo-ltd/cpputest-clang@sha256:95e8a1b076aa2faab98af1415c89a36feaa12e0a9e42950194f9775d0ed27c35 # sha-5905aea
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure
run: cmake --preset clang-debug
- name: Build and test
run: cmake --build --preset clang-debug --target junit
- name: Test Report
uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 # v3.0.0
if: success() || failure()
with:
name: Test Results (Clang)
path: build/clang-debug/cpputest_*.xml
reporter: java-junit
- name: Upload JUnit XML
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: junit-build-linux-clang
path: build/clang-debug/cpputest_*.xml
retention-days: 1
# Proves the public claim that Core compiles as C99, then checks the POSIX and
# OpenSSL packs have not drifted off it. Library only, no tests.
# See docs/builds.md.
build-linux-c99:
runs-on: ubuntu-latest
permissions:
contents: read
container:
image: ghcr.io/cososo-ltd/cpputest@sha256:68e7fbb6f02996717ce9211fd8089a0c52763da4990dfe69653c00ad697551b9 # sha-6715942
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure Core at C99
run: cmake --preset c99
- name: Build Core at C99
run: cmake --build --preset c99
- name: Configure POSIX and OpenSSL packs at C99
run: cmake --preset c99-platforms
- name: Build POSIX and OpenSSL packs at C99
run: cmake --build --preset c99-platforms
# The library is C99; the code that includes its headers need not be. Compiles
# every public header standalone at -std=c89 -pedantic-errors, so an
# integrator on an older toolchain can include them. See docs/build-integration.md.
build-linux-c89-headers:
runs-on: ubuntu-latest
permissions:
contents: read
container:
image: ghcr.io/cososo-ltd/cpputest@sha256:68e7fbb6f02996717ce9211fd8089a0c52763da4990dfe69653c00ad697551b9 # sha-6715942
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Compile every public header as C89
run: python3 scripts/check_headers_c89.py --cc gcc
sanitize-linux-gcc:
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
container:
image: ghcr.io/cososo-ltd/cpputest@sha256:68e7fbb6f02996717ce9211fd8089a0c52763da4990dfe69653c00ad697551b9 # sha-6715942
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure
run: cmake --preset sanitize
- name: Build and test
run: cmake --build --preset sanitize --target junit
- name: Test Report
uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 # v3.0.0
if: success() || failure()
with:
name: Test Results (Sanitize)
path: build/sanitize/cpputest_*.xml
reporter: java-junit
- name: Upload JUnit XML
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: junit-sanitize-linux-gcc
path: build/sanitize/cpputest_*.xml
retention-days: 1
coverage-linux-gcc:
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
container:
image: ghcr.io/cososo-ltd/cpputest@sha256:68e7fbb6f02996717ce9211fd8089a0c52763da4990dfe69653c00ad697551b9 # sha-6715942
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure
run: cmake --preset coverage
- name: Build and generate coverage report
run: cmake --build --preset coverage --target coverage
- name: Post coverage summary
run: |
echo '## Coverage Summary' >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
lcov --summary build/coverage/coverage.filtered.info --rc branch_coverage=1 2>&1 >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
- name: Enforce coverage thresholds
env:
LINE_THRESHOLD: 90
BRANCH_THRESHOLD: 90
run: |
SUMMARY=$(lcov --summary build/coverage/coverage.filtered.info --rc branch_coverage=1 2>&1)
LINE_COV=$(echo "$SUMMARY" | sed -n 's/.*lines\.*: \([0-9.]*\)%.*/\1/p')
BRANCH_COV=$(echo "$SUMMARY" | sed -n 's/.*branches\.*: \([0-9.]*\)%.*/\1/p')
FAIL=0
if [ -n "$LINE_COV" ]; then
echo "Line coverage: ${LINE_COV}% (threshold: ${LINE_THRESHOLD}%)"
if awk "BEGIN{exit !($LINE_COV < $LINE_THRESHOLD)}"; then
echo "FAIL: line coverage ${LINE_COV}% is below ${LINE_THRESHOLD}%"
FAIL=1
fi
else
echo "FAIL: could not determine line coverage"
FAIL=1
fi
if [ -n "$BRANCH_COV" ]; then
echo "Branch coverage: ${BRANCH_COV}% (threshold: ${BRANCH_THRESHOLD}%)"
if awk "BEGIN{exit !($BRANCH_COV < $BRANCH_THRESHOLD)}"; then
echo "FAIL: branch coverage ${BRANCH_COV}% is below ${BRANCH_THRESHOLD}%"
FAIL=1
fi
else
echo "Branch coverage: no branch data found (skipping threshold check)"
fi
exit $FAIL
# GitHub Pages now serves the docs site (see deploy-docs-pages), not the
# coverage report. The HTML report stays available as a downloadable run
# artifact for anyone who wants to inspect it; success()||failure() keeps
# it uploaded even when the threshold gate above fails, which is exactly
# when you want to read it.
- name: Upload coverage report artifact
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: coverage-report-linux-gcc
path: build/coverage/coverage_report/
retention-days: 7
analyze-tidy:
runs-on: ubuntu-latest
container:
image: ghcr.io/cososo-ltd/cpputest@sha256:68e7fbb6f02996717ce9211fd8089a0c52763da4990dfe69653c00ad697551b9 # sha-6715942
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure
run: cmake --preset tidy
- name: Build with clang-tidy
shell: bash
run: set -o pipefail && cmake --build --preset tidy 2>&1 | tee build/tidy/clang-tidy-output.txt
- name: Upload clang-tidy output
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: clang-tidy-report
path: build/tidy/clang-tidy-output.txt
retention-days: 1
analyze-iwyu:
runs-on: ubuntu-latest
container:
image: ghcr.io/cososo-ltd/cpputest-clang@sha256:95e8a1b076aa2faab98af1415c89a36feaa12e0a9e42950194f9775d0ed27c35 # sha-5905aea
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure
run: cmake --preset iwyu
# IWYU is advisory: the two-pass "should add / should remove" output is
# hard to interpret correctly under time pressure, and the per-PR
# friction it causes outweighs the steady-state value (S24.13 / E24).
# Findings still surface via the uploaded artifact below; release prep
# is responsible for clearing them.
- name: Run include-what-you-use (advisory)
shell: bash
continue-on-error: true
run: set -o pipefail && cmake --build --preset iwyu --target iwyu 2>&1 | tee build/iwyu/iwyu-output.txt
- name: Upload iwyu output
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: iwyu-report
path: build/iwyu/iwyu-output.txt
retention-days: 1
# Mirrors analyze-tidy but runs on cpputest-freertos so the Platform/{FreeRtos,
# PlusTcp,LwipRaw,MbedTls,FatFs} trees and their Tests/* siblings enter the
# CMake configure (gated by FREERTOS_KERNEL_PATH / MBEDTLS_DIR / LWIP_PATH /
# FATFS_PATH, all set in the freertos image). The base lane on cpputest skips
# those trees because the env vars are absent.
analyze-tidy-freertos-plustcp:
runs-on: ubuntu-latest
container:
image: ghcr.io/cososo-ltd/cpputest-freertos@sha256:476cfeab90e8179ab909dba8c77c8e9ef3b594e67ba98dca39108747583f5c41 # sha-ad10bf2
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure
run: cmake --preset tidy
- name: Build with clang-tidy
shell: bash
run: set -o pipefail && cmake --build --preset tidy 2>&1 | tee build/tidy/clang-tidy-output.txt
- name: Upload clang-tidy output
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: clang-tidy-report-freertos-plustcp
path: build/tidy/clang-tidy-output.txt
retention-days: 1
# Same freertos coverage rationale as analyze-tidy-freertos-plustcp. Overrides
# CMAKE_C_COMPILER explicitly to clang-19 because the cpputest-freertos image
# (chained from the cpputest gcc base) ships clang-19/clang++-19 but no
# `clang`/`clang++` alternative — only the cpputest-clang image creates that
# alias. A future image bump could add the alternative to the gcc base and
# drop these overrides.
analyze-iwyu-freertos-plustcp:
runs-on: ubuntu-latest
container:
image: ghcr.io/cososo-ltd/cpputest-freertos@sha256:476cfeab90e8179ab909dba8c77c8e9ef3b594e67ba98dca39108747583f5c41 # sha-ad10bf2
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure
run: cmake --preset iwyu -DCMAKE_C_COMPILER=clang-19 -DCMAKE_CXX_COMPILER=clang++-19
# Advisory per S24.13 — see analyze-iwyu above for rationale.
- name: Run include-what-you-use (advisory)
shell: bash
continue-on-error: true
run: set -o pipefail && cmake --build --preset iwyu --target iwyu 2>&1 | tee build/iwyu/iwyu-output.txt
- name: Upload iwyu output
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: iwyu-report-freertos-plustcp
path: build/iwyu/iwyu-output.txt
retention-days: 1
# lwIP twin of analyze-tidy-freertos-plustcp. Same cpputest-freertos image and
# tidy preset, with Plus-TCP deselected so the configure exercises the lwIP
# wiring path with Platform/PlusTcp absent. Since S30.06 that is said directly
# — a platform is deselected by its own switch — rather than inferred from a
# FreeRTOS networking-backend variable. Guards the LwipRaw tree and its Tests
# under clang-tidy as a named required check.
analyze-tidy-freertos-lwip:
runs-on: ubuntu-latest
container:
image: ghcr.io/cososo-ltd/cpputest-freertos@sha256:476cfeab90e8179ab909dba8c77c8e9ef3b594e67ba98dca39108747583f5c41 # sha-ad10bf2
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure
run: cmake --preset tidy -DSOLIDSYSLOG_PLUSTCP=OFF
- name: Build with clang-tidy
shell: bash
run: set -o pipefail && cmake --build --preset tidy 2>&1 | tee build/tidy/clang-tidy-output.txt
- name: Upload clang-tidy output
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: clang-tidy-report-freertos-lwip
path: build/tidy/clang-tidy-output.txt
retention-days: 1
# NET=LWIP twin of analyze-iwyu-freertos-plustcp — see that lane for the
# clang-19 override rationale and analyze-tidy-freertos-lwip for the NET scope.
# Advisory per S24.13.
analyze-iwyu-freertos-lwip:
runs-on: ubuntu-latest
container:
image: ghcr.io/cososo-ltd/cpputest-freertos@sha256:476cfeab90e8179ab909dba8c77c8e9ef3b594e67ba98dca39108747583f5c41 # sha-ad10bf2
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure
run: cmake --preset iwyu -DSOLIDSYSLOG_PLUSTCP=OFF -DCMAKE_C_COMPILER=clang-19 -DCMAKE_CXX_COMPILER=clang++-19
# Advisory per S24.13 — see analyze-iwyu above for rationale.
- name: Run include-what-you-use (advisory)
shell: bash
continue-on-error: true
run: set -o pipefail && cmake --build --preset iwyu --target iwyu 2>&1 | tee build/iwyu/iwyu-output.txt
- name: Upload iwyu output
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: iwyu-report-freertos-lwip
path: build/iwyu/iwyu-output.txt
retention-days: 1
analyze-format:
runs-on: ubuntu-latest
container:
image: ghcr.io/cososo-ltd/cpputest@sha256:68e7fbb6f02996717ce9211fd8089a0c52763da4990dfe69653c00ad697551b9 # sha-6715942
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Check clang-format
run: |
find Core/Interface Core/Source Platform Tests Bdd/Targets -name '*.c' -o -name '*.cpp' -o -name '*.h' \
| xargs clang-format --dry-run --Werror
# README.md claims Core's implementation has no conditional compilation.
# Keep that true rather than aspirational.
- name: Assert Core's implementation has no conditional compilation
run: |
if grep -rnE '^[[:space:]]*#[[:space:]]*(if|ifdef|ifndef|elif|else)' Core/Source/*.c; then
echo "::error::Core/Source/*.c must contain no conditional compilation (see README.md, Architecture)"
exit 1
fi
# A bare _Create in a comment or in Markdown stops meaning anything the
# moment the surrounding text names a second class, and the header tables
# name several per row. See docs/NAMING.md, "Writing identifiers in prose".
#
# The sed neutralises the reserved identifiers that legitimately begin _X
# before the second grep, so filtering is per match rather than per line —
# one line can carry both a legitimate _Atomic and a bare _Destroy, and
# discarding the whole line would hide the second. Tracked files only, so
# an untracked local `site/` build never trips it. NAMING.md is exempt: it
# is the one file that has to quote the form it forbids.
- name: Assert API identifiers are written in full in prose
run: |
violations=$(git ls-files '*.md' '*.c' '*.h' '*.cpp' \
| grep -v '^docs/NAMING\.md$' \
| xargs -r grep -nE '(^|[^A-Za-z0-9_>])_[A-Z][a-z]' \
| sed -E 's/_(Atomic|Bool|Static_assert|Noreturn|Thread_local|Generic|Alignas|Alignof|Complex|Imaginary|Pragma|Exit)\b/KEYWORD/g' \
| grep -E '(^|[^A-Za-z0-9_>])_[A-Z][a-z]' \
| cut -d: -f1,2)
if [ -n "$violations" ]; then
echo "$violations"
echo "::error::Write API identifiers in full in prose — SolidSyslogFoo_Create, or <Class>_Create for a pattern-level statement (see docs/NAMING.md, 'Writing identifiers in prose')"
exit 1
fi
# Asserts every shipped source file carries the licence header, and that none
# of them claims anyone else's copyright. Both halves matter: the header is
# the only statement of terms that travels with a file copied out of the tree
# by a Path B integrator, and the no-third-party-code invariant in Core/ and
# Platform/ is what makes it safe to stamp our copyright across all of them.
# Pure file scan, no toolchain — runs in about a second.
analyze-spdx:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Check licence headers
run: python3 scripts/check_spdx_headers.py
analyze-markdown:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
# Same pinned engine (markdownlint-cli2 v0.22.1) used locally and by
# CodeRabbit. Config + ignores come from .markdownlint-cli2.jsonc.
- name: Lint markdown
run: |
docker run --rm -v "$PWD:/workdir" \
davidanson/markdownlint-cli2@sha256:0ed9a5f4c77ef447da2a2ac6e67caf74b214a7f80288819565e8b7d2ac148fe5
# Builds the MkDocs + mkdoxy documentation site with the pinned toolchain
# image (see docs/containers.md) so the site cannot silently rot. Runs on every
# PR as a required check; on main it also stages the built site as the Pages
# artifact for the deploy-docs-pages job to publish. PRs build but never deploy.
docs-build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
# Platforms are declared in SOLIDSYSLOG_PLATFORM_REGISTRY and roles by
# their Core/Interface/SolidSyslog<Role>Definition.h header. This asserts
# the docs enumerate exactly what the code declares — a platform's pages,
# nav entry, description and matrix row; a role's link from the porting
# guide, the roles index and the nav — and the reverse in both cases. It
# also holds the three boundaries hand review kept losing: no platform
# names another, every class a platform declares carries its registry
# token, and every class a platform ships is on its page.
- name: Check the docs match what the code declares
run: python3 scripts/check_platform_docs.py
# A path written in code font in a sentence, or in a CMake list, a
# Compose mount or a path filter, is text nothing reads back out — the
# link check below sees Markdown links only. This asserts every such path
# still exists, so a rename cannot leave a green reference to nothing.
- name: Check the paths documents and build files name exist
run: python3 scripts/check_references.py
# Guard the build hooks against regression — the source-link rewrite's
# Markdown parsing, and the meta-description map's nav validation.
# Image digest below is mkdocs-mkdoxy sha-34173c0 (see docs/containers.md).
- name: Test docs build hooks
run: |
docker run --rm -v "$PWD:/docs" \
ghcr.io/cososo-ltd/mkdocs-mkdoxy@sha256:9ab3d41807a941f3d5a7077fb7288d0ffe2a926729ce13a4fc889cc8b6630d43 \
python3 -m unittest discover -s /docs/hooks -p 'test_*.py'
# --strict fails the build on broken nav, config, or links. Out-of-docs
# source links (../Core/…, ../SECURITY.md) are rewritten to canonical
# GitHub URLs by hooks/source_links.py, so not_found validation is fatal;
# the api/ reference is generated from Core/Interface/*.h by mkdoxy.
# Image digest below is mkdocs-mkdoxy sha-34173c0 (see docs/containers.md).
- name: Build docs site
run: |
docker run --rm -v "$PWD:/docs" \
ghcr.io/cososo-ltd/mkdocs-mkdoxy@sha256:9ab3d41807a941f3d5a7077fb7288d0ffe2a926729ce13a4fc889cc8b6630d43 \
mkdocs build --strict
- name: Upload site artifact
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: docs-site
path: site/
retention-days: 7
# On main only, restage the built site as the GitHub Pages artifact so
# deploy-docs-pages can publish it. PRs stop at the build+artifact above.
- name: Upload Pages artifact
if: github.ref == 'refs/heads/main'
uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
with:
path: site/
# Publishes the built docs site to GitHub Pages. Main-only; PRs never deploy.
# GitHub Pages permits a single deployment to the github-pages environment, so
# the pages concurrency group serialises overlapping main pushes.
deploy-docs-pages:
needs: docs-build
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
permissions:
pages: write # to deploy the built site to GitHub Pages
id-token: write # to verify the deployment originates from this workflow
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
concurrency:
group: pages
cancel-in-progress: false
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0
analyze-cppcheck:
runs-on: ubuntu-latest
container:
image: ghcr.io/cososo-ltd/cpputest@sha256:68e7fbb6f02996717ce9211fd8089a0c52763da4990dfe69653c00ad697551b9 # sha-6715942
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure
run: cmake --preset cppcheck
- name: Build with cppcheck
run: cmake --build --preset cppcheck
- name: Generate cppcheck XML report
if: success() || failure()
run: >
cppcheck
--enable=warning,style,performance,portability
--suppress=missingIncludeSystem
--suppressions-list=cppcheck_suppressions_tests.txt
--inline-suppr
--std=c11
-DLWIP_DNS=1
-DLWIP_UDP=1
-DLWIP_TCP=1
-DconfigSUPPORT_STATIC_ALLOCATION=1
-DconfigUSE_MUTEXES=1
-DipconfigUSE_TCP=1
-ICore/Interface
-IPlatform/StdAtomic/Interface
-IPlatform/Posix/Interface
-IPlatform/Windows/Interface
-IPlatform/OpenSsl/Interface
-IPlatform/MbedTls/Interface
-IPlatform/FreeRtos/Interface
-IPlatform/PlusTcp/Interface
-IPlatform/LwipRaw/Interface
-IPlatform/FatFs/Interface
-IPlatform/PlusFat/Interface
--xml --xml-version=2
Core/Source/
Platform/StdAtomic/Source/
Platform/Posix/Source/
Platform/Windows/Source/
Platform/OpenSsl/Source/
Platform/MbedTls/Source/
Platform/FreeRtos/Source/
Platform/PlusTcp/Source/
Platform/LwipRaw/Source/
Platform/FatFs/Source/
Platform/PlusFat/Source/
2> build/cppcheck/cppcheck-report.xml
- name: Upload cppcheck report
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: cppcheck-report
path: build/cppcheck/cppcheck-report.xml
retention-days: 1
# ----------------------------------------------------------------
# cppcheck-misra addon — runs the MISRA C:2012 addon over Strict +
# Pragmatic tiers (Core/Source/ + Platform/*/Source/). Findings
# fail CI (--error-exitcode=1); suppressions live in
# misra_suppressions.txt with rationales in docs/misra-deviations.md.
# ----------------------------------------------------------------
- name: Run cppcheck-misra
if: success() || failure()
run: >
cppcheck
--addon=misra
--suppressions-list=misra_suppressions.txt
--error-exitcode=1
--inline-suppr
--std=c11
-DLWIP_DNS=1
-DLWIP_UDP=1
-DLWIP_TCP=1
-DconfigSUPPORT_STATIC_ALLOCATION=1
-DconfigUSE_MUTEXES=1
-DipconfigUSE_TCP=1
-ICore/Interface
-IPlatform/StdAtomic/Interface
-IPlatform/Posix/Interface
-IPlatform/Windows/Interface
-IPlatform/OpenSsl/Interface
-IPlatform/MbedTls/Interface
-IPlatform/FreeRtos/Interface
-IPlatform/PlusTcp/Interface
-IPlatform/LwipRaw/Interface
-IPlatform/FatFs/Interface
-IPlatform/PlusFat/Interface
Core/Source/
Platform/StdAtomic/Source/
Platform/Posix/Source/
Platform/Windows/Source/
Platform/OpenSsl/Source/
Platform/MbedTls/Source/
Platform/FreeRtos/Source/
Platform/PlusTcp/Source/
Platform/LwipRaw/Source/
Platform/FatFs/Source/
Platform/PlusFat/Source/
- name: Generate cppcheck-misra XML report
if: success() || failure()
run: |
mkdir -p build/cppcheck-misra
cppcheck \
--addon=misra \
--suppressions-list=misra_suppressions.txt \
--error-exitcode=1 \
--inline-suppr \
--std=c11 \
-DLWIP_DNS=1 \
-DLWIP_UDP=1 \
-DLWIP_TCP=1 \
-DconfigSUPPORT_STATIC_ALLOCATION=1 \
-DconfigUSE_MUTEXES=1 \
-DipconfigUSE_TCP=1 \
-ICore/Interface \
-IPlatform/StdAtomic/Interface \
-IPlatform/Posix/Interface \
-IPlatform/Windows/Interface \
-IPlatform/OpenSsl/Interface \
-IPlatform/MbedTls/Interface \
-IPlatform/FreeRtos/Interface \
-IPlatform/PlusTcp/Interface \
-IPlatform/LwipRaw/Interface \
-IPlatform/FatFs/Interface \
-IPlatform/PlusFat/Interface \
--xml --xml-version=2 \
Core/Source/ \
Platform/StdAtomic/Source/ \
Platform/Posix/Source/ \
Platform/Windows/Source/ \
Platform/OpenSsl/Source/ \
Platform/MbedTls/Source/ \
Platform/FreeRtos/Source/ \
Platform/PlusTcp/Source/ \
Platform/LwipRaw/Source/ \
Platform/FatFs/Source/ \
Platform/PlusFat/Source/ \
2> build/cppcheck-misra/cppcheck-misra-report.xml
- name: Upload cppcheck-misra report
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: cppcheck-misra-report
path: build/cppcheck-misra/cppcheck-misra-report.xml
retention-days: 1
build-windows-msvc:
runs-on: windows-latest
permissions:
contents: read
checks: write
env:
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Enable vcpkg binary cache
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
script: |
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
# Same cache as integration-windows-openssl — both jobs share one
# entry. See that job's comment for rationale and key-bump policy.
- name: Cache vcpkg installed tree
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
# The cache is a pure speed optimisation — a flaky restore must never
# skip the build+test. actions/cache can fail mid-restore (even after
# reporting a hit); without continue-on-error that failure trips the
# default `if: success()` on every following step, so Install / Configure
# / Build-and-test all skip and the job goes red without ever compiling.
# On a miss or partial restore the `vcpkg install` below rebuilds the
# tree (backed by the x-gha binary cache), so the only cost is a slower
# run.
continue-on-error: true
with:
path: C:\vcpkg\installed
key: ${{ runner.os }}-vcpkg-cpputest-openssl-v1
- name: Install CppUTest and OpenSSL
run: |
vcpkg install cpputest openssl
echo "VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT" >> $env:GITHUB_ENV
- name: Configure
run: cmake --preset msvc-debug
- name: Build and test
run: cmake --build --preset msvc-debug --target junit
# The BDD target is built against a raised message size, as on Linux. Its
# own configure regenerates the Python tunables mirror uploaded below, so
# it runs after the default-preset build rather than before it.
- name: Configure the BDD target with the tunable override
run: cmake --preset msvc-tunable-override
- name: Build the BDD target
run: cmake --build --preset msvc-tunable-override --target SolidSyslogBddTarget
- name: Test Report
uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 # v3.0.0
if: success() || failure()
with:
name: Test Results (MSVC)
path: build/msvc-debug/cpputest_*.xml
reporter: java-junit
- name: Upload JUnit XML
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: junit-build-windows-msvc
path: build/msvc-debug/cpputest_*.xml
retention-days: 1
- name: Upload Windows BDD target binary
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: solid-syslog-bdd-target-windows
path: build/msvc-tunable-override/Bdd/Targets/Debug/SolidSyslogBddTarget.exe
retention-days: 1
compression-level: 0
- name: Upload BDD Python tunables (Windows)
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: bdd-tunables-windows
path: Bdd/features/steps/solidsyslog_tunables.py
retention-days: 1
# Windows is the one platform whose sources are entirely probe-gated, so a
# Linux runner would emit an empty fragment and verify-manifest cannot
# generate it. It is checked here rather than committed: a hand-written
# copy of a generated file would rot, and Path B's audience is embedded
# toolchains. The check still catches a Windows adapter that reaches the
# directory without reaching CMakeLists.
- name: Check the Windows platform manifest against the tree
shell: bash
run: |
cmake -S . -B build/manifest-windows -DSOLIDSYSLOG_BUILD_TESTING=OFF \
-DSOLIDSYSLOG_MANIFEST_SCOPE=platform \
-DSOLIDSYSLOG_PLATFORMS=Windows \
-DSOLIDSYSLOG_MANIFEST_PLATFORMS=Windows
python3 scripts/check_manifest.py build/manifest-windows/solidsyslog-manifest.txt
bdd-windows-otel:
needs: build-windows-msvc
runs-on: windows-2025
permissions:
contents: read
checks: write
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: solid-syslog-bdd-target-windows
path: build/msvc-tunable-override/Bdd/Targets/Debug/
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: bdd-tunables-windows
path: Bdd/features/steps/
- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: '3.13'
- name: Install behave
run: pip install -r Bdd/requirements.txt
- name: Install otelcol-contrib
shell: pwsh
run: ./Bdd/otel/Install-OtelCollector.ps1
- name: Prepare BDD directories
run: mkdir -p Bdd/output Bdd/junit
- name: Start OTel Collector
# Use bash `&` backgrounding (what works locally) rather than pwsh
# Start-Process — the latter launched silently on windows-2025 with
# empty redirect files and no UDP bind, suggesting the child was
# either killed with the parent console or never actually executed.
run: |
nohup ./Bdd/otel/bin/otelcol-contrib.exe \
--config=Bdd/otel/config.yaml \
> Bdd/output/otelcol.out 2> Bdd/output/otelcol.err &
echo "otelcol backgrounded with PID $!"
- name: Wait for oracle to bind UDP 5514 + TCP 6514/6515
shell: pwsh
run: |
$deadline = (Get-Date).AddSeconds(30)
while ((Get-Date) -lt $deadline) {
$udp5514 = Get-NetUDPEndpoint -LocalPort 5514 -ErrorAction SilentlyContinue
$tcp6514 = Get-NetTCPConnection -LocalPort 6514 -State Listen -ErrorAction SilentlyContinue
$tcp6515 = Get-NetTCPConnection -LocalPort 6515 -State Listen -ErrorAction SilentlyContinue
if ($udp5514 -and $tcp6514 -and $tcp6515) {
Write-Host "otelcol is listening on UDP 5514 + TCP 6514 (TLS) + TCP 6515 (mTLS)"
exit 0
}
Start-Sleep -Milliseconds 500
}
Write-Host "otelcol did not bind all expected ports within 30 seconds"
Write-Host "--- tasklist otelcol-contrib ---"
tasklist /FI "IMAGENAME eq otelcol-contrib.exe"
Write-Host "--- UDP endpoints (top 20) ---"
Get-NetUDPEndpoint | Select-Object -First 20 | Format-Table -AutoSize
Write-Host "--- TCP listeners (top 20) ---"
Get-NetTCPConnection -State Listen | Select-Object -First 20 | Format-Table -AutoSize
Write-Host "--- Bdd/output contents ---"
Get-ChildItem Bdd/output -ErrorAction SilentlyContinue | Format-Table
Write-Host "--- otelcol.out ---"
Get-Content Bdd/output/otelcol.out -ErrorAction SilentlyContinue
Write-Host "--- otelcol.err ---"
Get-Content Bdd/output/otelcol.err -ErrorAction SilentlyContinue
exit 1
- name: Run BDD tests
env:
BDD_TARGET: windows
EXAMPLE_BINARY: build/msvc-tunable-override/Bdd/Targets/Debug/SolidSyslogBddTarget.exe
RECEIVED_LOG: Bdd/output/received.jsonl
ORACLE_FORMAT: otel-jsonl
run: >
behave --junit --junit-directory Bdd/junit
--tags='not @wip and not @windows_wip and not @no_rtc and not @aesgcm'
Bdd/features/
- name: BDD Test Report (Windows)
uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 # v3.0.0
if: success() || failure()
with:
name: Test Results (BDD Windows)
path: Bdd/junit/TESTS-*.xml
reporter: java-junit
- name: Upload JUnit XML
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: junit-bdd-windows-otel
path: Bdd/junit/TESTS-*.xml
retention-days: 1
- name: OTel collector logs on failure
if: failure()
run: |
echo "--- otelcol.out ---"
cat Bdd/output/otelcol.out || true
echo "--- otelcol.err ---"
cat Bdd/output/otelcol.err || true
bdd-linux-syslog-ng:
needs: build-linux-tunable-override
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: solid-syslog-bdd-targets
path: build/tunable-override-debug/Bdd/Targets/
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: bdd-tunables-linux
path: Bdd/features/steps/
- name: Make example binary executable
run: chmod +x build/tunable-override-debug/Bdd/Targets/SolidSyslogBddTarget
- name: Prepare BDD output directory
run: mkdir -p Bdd/junit && chmod 777 Bdd/junit
- name: Run BDD tests
run: >
docker compose -f ci/docker-compose.bdd.yml
up --abort-on-container-exit --exit-code-from behave-linux
behave-linux syslog-ng-linux
- name: BDD Test Report
uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 # v3.0.0
if: success() || failure()
with:
name: Test Results (BDD)
path: Bdd/junit/TESTS-*.xml
reporter: java-junit
- name: Upload JUnit XML
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: junit-bdd-linux-syslog-ng
path: Bdd/junit/TESTS-*.xml
retention-days: 1
- name: Compose logs on failure
if: failure()
run: docker compose -f ci/docker-compose.bdd.yml logs --no-color
build-freertos-host-tdd-plustcp:
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
container:
image: ghcr.io/cososo-ltd/cpputest-freertos@sha256:476cfeab90e8179ab909dba8c77c8e9ef3b594e67ba98dca39108747583f5c41 # sha-ad10bf2
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
# Smoke check: configure + build the regular host preset under the
# cpputest-freertos image. FREERTOS_KERNEL_PATH is set, so
# Platform/FreeRtos and the FreeRtosFakes / Tests/FreeRtos placeholder
# directories are added — placeholders today, real fakes from S08.04.
- name: Configure
run: cmake --preset debug
- name: Build and test
run: cmake --build --preset debug --target junit BddTargetTests SolidSyslogBddTarget
- name: Run BDD target tests
run: cd build/debug && ./Tests/Bdd/Targets/BddTargetTests -ojunit -k BddTargetTests
- name: Test Report
uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 # v3.0.0
if: success() || failure()
with:
name: Test Results (FreeRTOS host)
path: build/debug/cpputest_*.xml
reporter: java-junit
- name: Upload JUnit XML
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: junit-build-freertos-host-tdd-plustcp
path: build/debug/cpputest_*.xml
retention-days: 1
build-freertos-target-plustcp:
runs-on: ubuntu-latest
permissions:
contents: read
container:
image: ghcr.io/cososo-ltd/cpputest-freertos-cross@sha256:481267bea7200641fac41d7136e7e08deeba1b311e9873aa6d1c311db5b4cf58 # sha-ad10bf2
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure (ARM cross)
run: cmake --preset freertos-cross
- name: Cross-build FreeRTOS BDD target ELF
run: cmake --build --preset freertos-cross --target SolidSyslogBddTarget
- name: Upload FreeRTOS BDD target ELF
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: solid-syslog-bdd-target-freertos
path: build/freertos-cross/Bdd/Targets/FreeRtos/SolidSyslogBddTarget.elf
retention-days: 1
compression-level: 0
- name: Upload BDD Python tunables (FreeRTOS)
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: bdd-tunables-freertos
path: Bdd/features/steps/solidsyslog_tunables.py
retention-days: 1
# Required as of S28.11 (in the `summary` needs list). Proves the
# Platform/LwipRaw tree cross-builds for FreeRTOS/ARM with Plus-TCP
# deselected and zero PlusTcp dependency (the symbol
# assertion below enforces that). No QEMU run. Adding it to the GitHub
# branch-protection required-checks set is a separate manual step (David).
build-freertos-target-lwip:
runs-on: ubuntu-latest
permissions:
contents: read
container:
image: ghcr.io/cososo-ltd/cpputest-freertos-cross@sha256:481267bea7200641fac41d7136e7e08deeba1b311e9873aa6d1c311db5b4cf58 # sha-ad10bf2
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Configure (ARM cross, NET=LWIP)
run: cmake --preset freertos-cross-lwip
- name: Cross-build FreeRTOS+lwIP BDD target ELF
run: cmake --build --preset freertos-cross-lwip --target SolidSyslogBddTargetLwip
- name: Assert no PlusTcp / Plus-TCP symbols linked
run: |
elf=build/freertos-cross-lwip/Bdd/Targets/FreeRtosLwip/SolidSyslogBddTargetLwip.elf
arm-none-eabi-nm "$elf" > /tmp/lwip-symbols.txt
if grep -E -i 'PlusTcp|FreeRTOS_socket|FreeRTOS_sendto|FreeRTOS_recv|FreeRTOS_IPInit' /tmp/lwip-symbols.txt; then
echo "::error::PlusTcp / FreeRTOS-Plus-TCP symbol linked into the lwIP BDD target ELF"
exit 1
fi
echo "OK: no PlusTcp / FreeRTOS-Plus-TCP symbols in the lwIP BDD target ELF"
- name: Upload FreeRTOS+lwIP BDD target ELF
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: solid-syslog-bdd-target-freertos-lwip
path: build/freertos-cross-lwip/Bdd/Targets/FreeRtosLwip/SolidSyslogBddTargetLwip.elf
retention-days: 1
compression-level: 0
# BDD-side mirror of build-time tunables (configure_file). The lwIP bdd
# lane consumes this so environment.py's runtime tag gates track the lwIP
# target's SOLIDSYSLOG_MAX_MESSAGE_SIZE.
- name: Upload BDD Python tunables (FreeRTOS+lwIP)
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: bdd-tunables-freertos-lwip
path: Bdd/features/steps/solidsyslog_tunables.py
retention-days: 1
bdd-freertos-qemu-plustcp:
needs: build-freertos-target-plustcp
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: solid-syslog-bdd-target-freertos
path: build/freertos-cross/Bdd/Targets/FreeRtos/
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: bdd-tunables-freertos
path: Bdd/features/steps/
- name: Make ELF readable
run: chmod +r build/freertos-cross/Bdd/Targets/FreeRtos/SolidSyslogBddTarget.elf
- name: Prepare BDD output directory
run: mkdir -p Bdd/junit && chmod 777 Bdd/junit
- name: Run BDD tests
run: >
docker compose -f ci/docker-compose.bdd.yml
up --abort-on-container-exit --exit-code-from behave-freertos
behave-freertos syslog-ng-freertos
- name: BDD Test Report (FreeRTOS)
uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 # v3.0.0
if: success() || failure()
with:
name: Test Results (BDD FreeRTOS)
path: Bdd/junit/TESTS-*.xml
reporter: java-junit
- name: Upload JUnit XML
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: junit-bdd-freertos-qemu-plustcp
path: Bdd/junit/TESTS-*.xml
retention-days: 1
- name: Compose logs on failure
if: failure()
run: docker compose -f ci/docker-compose.bdd.yml logs --no-color
# Required as of S28.11 (in the `summary` needs list): runs the lwIP BDD
# target on QEMU against the syslog-ng oracle over UDP / TCP / TLS / mTLS.
# Adding it to the GitHub branch-protection required-checks set is a
# separate manual step (David).
bdd-freertos-qemu-lwip:
needs: build-freertos-target-lwip
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: solid-syslog-bdd-target-freertos-lwip
path: build/freertos-cross-lwip/Bdd/Targets/FreeRtosLwip/
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: bdd-tunables-freertos-lwip
path: Bdd/features/steps/
- name: Make ELF readable
run: chmod +r build/freertos-cross-lwip/Bdd/Targets/FreeRtosLwip/SolidSyslogBddTargetLwip.elf
- name: Prepare BDD output directory
run: mkdir -p Bdd/junit && chmod 777 Bdd/junit
- name: Run BDD tests
run: >
docker compose -f ci/docker-compose.bdd.yml
up --abort-on-container-exit --exit-code-from behave-freertos-lwip
behave-freertos-lwip syslog-ng-freertos-lwip
- name: BDD Test Report (FreeRTOS+lwIP)
uses: dorny/test-reporter@a43b3a5f7366b97d083190328d2c652e1a8b6aa2 # v3.0.0
if: success() || failure()
with:
name: Test Results (BDD FreeRTOS+lwIP)
path: Bdd/junit/TESTS-*.xml
reporter: java-junit
- name: Upload JUnit XML
if: success() || failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: junit-bdd-freertos-qemu-lwip
path: Bdd/junit/TESTS-*.xml
retention-days: 1
- name: Compose logs on failure
if: failure()
run: docker compose -f ci/docker-compose.bdd.yml logs --no-color
# Anti-drift gate (S30.03): regenerate the committed beta-stack integration
# manifest from CMake and fail if it differs from what is checked in. Keeps
# docs/generated/beta-stack-manifest.txt honest against the platform source
# lists (the generator reads each upstream platform target's INTERFACE_SOURCES
# and the Core target's SOURCES). The stack is stated in SOLIDSYSLOG_PLATFORMS
# rather than inherited from the image's environment, so the manifest
# describes the platforms this gate means to describe (S30.05).
verify-manifest:
runs-on: ubuntu-latest
container:
image: ghcr.io/cososo-ltd/cpputest-freertos@sha256:476cfeab90e8179ab909dba8c77c8e9ef3b594e67ba98dca39108747583f5c41 # sha-ad10bf2
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
# The environment is scrubbed so an upstream platform is described because
# it was named, not because the image happens to carry its tree. Windows is
# the one token missing here — it is probe-kind, so it cannot be selected on
# Linux; build-windows-msvc generates that fragment.
- name: Regenerate the Core and per-platform manifests
shell: bash
run: |
scrubbed() {
env -u LWIP_PATH -u FREERTOS_KERNEL_PATH -u MBEDTLS_DIR \
-u FATFS_PATH -u FREERTOS_PLUS_FAT_PATH -u FREERTOS_PLUS_TCP_PATH "$@"
}
scrubbed cmake -S . -B build/manifest-core -DSOLIDSYSLOG_BUILD_TESTING=OFF \
-DSOLIDSYSLOG_MANIFEST_SCOPE=core \
-DSOLIDSYSLOG_MANIFEST_OUTPUT="$(pwd)/docs/generated/core-manifest.txt"
for platform in $(python3 scripts/check_manifest.py --list-platforms); do
[ "$platform" = "Windows" ] && continue
scrubbed cmake -S . -B "build/manifest-$platform" -DSOLIDSYSLOG_BUILD_TESTING=OFF \
-DSOLIDSYSLOG_MANIFEST_SCOPE=platform \
-DSOLIDSYSLOG_PLATFORMS="$platform" \
-DSOLIDSYSLOG_MANIFEST_PLATFORMS="$platform" \
-DSOLIDSYSLOG_MANIFEST_OUTPUT="$(pwd)/docs/generated/$platform-manifest.txt"
done
- name: Regenerate the beta-stack manifest
shell: bash
run: |
cmake -S . -B build/manifest -DSOLIDSYSLOG_BUILD_TESTING=OFF \
-DSOLIDSYSLOG_PLATFORMS="LwipRaw;FreeRtos;MbedTls;FatFs;StdAtomic" \
-DSOLIDSYSLOG_MANIFEST_PLATFORMS="LwipRaw;MbedTls;FreeRtos;FatFs;StdAtomic" \
-DSOLIDSYSLOG_MANIFEST_OUTPUT="$(pwd)/docs/generated/beta-stack-manifest.txt"
- name: Fail on drift
shell: bash
run: |
git diff --exit-code docs/generated/ \
|| { echo "::error::docs/generated is stale — regenerate with the manifest target (see docs/build-integration.md)"; exit 1; }
# Every manifest section's file list must equal that directory's *.c,
# compared against the filesystem rather than the build targets, so a
# source no target lists is visible.
- name: Assert every manifest matches the tree
shell: bash
run: |
for manifest in docs/generated/*-manifest.txt; do
python3 scripts/check_manifest.py "$manifest" \
|| { echo "::error::$manifest does not match the source tree — see the diff above"; exit 1; }
done
# Consume the library from outside, the way an integrator does (S30.04). The
# bug this guards against — SolidSyslog assuming it is the top-level project —
# survived every other lane precisely because they all build it top-level.
consumer-smoke-linux:
runs-on: ubuntu-latest
permissions:
contents: read
container:
image: ghcr.io/cososo-ltd/cpputest@sha256:68e7fbb6f02996717ce9211fd8089a0c52763da4990dfe69653c00ad697551b9 # sha-6715942
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
# FETCHCONTENT_SOURCE_DIR_SOLIDSYSLOG points FetchContent at this checkout,
# so the PR is validated against its own tree instead of main.
- name: Configure the consumer project
run: |
cmake -S ci/consumer-smoke -B build/consumer-smoke \
-DFETCHCONTENT_SOURCE_DIR_SOLIDSYSLOG="$(pwd)"
- name: Build the consumer project
run: cmake --build build/consumer-smoke
# A nested configure must not write into the dependency's checkout. The BDD
# tunables mirror is the one that did, and it is gitignored, so check for
# the file itself as well as for tracked-file drift.
- name: Assert the nested configure left the library tree alone
run: |
git diff --exit-code \
|| { echo "::error::configuring SolidSyslog as a subproject modified its own source tree"; exit 1; }
if [ -f Bdd/features/steps/solidsyslog_tunables.py ]; then
echo "::error::a nested configure wrote Bdd/features/steps/solidsyslog_tunables.py into the dependency's checkout"
exit 1
fi
consumer-smoke-freertos-cross:
runs-on: ubuntu-latest
permissions:
contents: read
container:
image: ghcr.io/cososo-ltd/cpputest-freertos-cross@sha256:481267bea7200641fac41d7136e7e08deeba1b311e9873aa6d1c311db5b4cf58 # sha-ad10bf2
options: --user root
env:
GIT_CONFIG_COUNT: 1
GIT_CONFIG_KEY_0: safe.directory
GIT_CONFIG_VALUE_0: '*'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
# The consumer's toolchain sets CMAKE_SYSTEM_PROCESSOR=arm and
# CMAKE_CROSSCOMPILING — the exact pair that used to drag SolidSyslog's own
# BDD ELF into their build. Reusing our arm-none-eabi file keeps the lane
# honest without vendoring a second copy; a real integrator brings theirs.
- name: Configure the consumer project (ARM cross)
run: |
cmake -S ci/consumer-smoke -B build/consumer-smoke-cross \
-DCMAKE_TOOLCHAIN_FILE="$(pwd)/Bdd/Targets/FreeRtos/cmake/arm-none-eabi.cmake" \
-DFETCHCONTENT_SOURCE_DIR_SOLIDSYSLOG="$(pwd)"
- name: Cross-build the consumer project
run: cmake --build build/consumer-smoke-cross
# The integrator shape no other lane has (S30.05). Every container here
# exports all five upstream paths, so a pack that exists only because the
# environment says so looks identical to one that works. Scrubbing the
# environment leaves -DSOLIDSYSLOG_PLATFORMS as the only thing that can
# select a pack and -D as the only thing that can locate an upstream tree.
#
# It LINKS the packs rather than asserting their targets exist: the packs
# carry their sources into the consumer's target, so "do these compile
# against someone else's config header" is the question, and only linking
# asks it.
- name: Configure the consumer project (scrubbed environment, explicit selection)
run: |
env -u LWIP_PATH -u FREERTOS_KERNEL_PATH -u MBEDTLS_DIR \
-u FATFS_PATH -u FREERTOS_PLUS_FAT_PATH -u FREERTOS_PLUS_TCP_PATH \
cmake -S ci/consumer-smoke -B build/consumer-smoke-scrubbed \
-DCMAKE_TOOLCHAIN_FILE="$(pwd)/Bdd/Targets/FreeRtos/cmake/arm-none-eabi.cmake" \
-DFETCHCONTENT_SOURCE_DIR_SOLIDSYSLOG="$(pwd)" \
-DSOLIDSYSLOG_PLATFORMS="LwipRaw;FreeRtos" \
-DSOLIDSYSLOG_LWIP_PATH=/opt/lwip \
-DSOLIDSYSLOG_FREERTOS_KERNEL_PATH=/opt/freertos/kernel \
-DSOLIDSYSLOG_SMOKE_LINK_PACKS=ON
- name: Cross-build and link the packs
run: cmake --build build/consumer-smoke-scrubbed
# Builds the gated-out path for the packs this lane selects. PlusTcp is an
# alternative network stack and is not built here.
- name: Configure the consumer project (LwipRaw and FreeRtos gates off)
run: |
env -u LWIP_PATH -u FREERTOS_KERNEL_PATH -u MBEDTLS_DIR \
-u FATFS_PATH -u FREERTOS_PLUS_FAT_PATH -u FREERTOS_PLUS_TCP_PATH \
cmake -S ci/consumer-smoke -B build/consumer-smoke-gates-off \
-DCMAKE_TOOLCHAIN_FILE="$(pwd)/Bdd/Targets/FreeRtos/cmake/arm-none-eabi.cmake" \
-DFETCHCONTENT_SOURCE_DIR_SOLIDSYSLOG="$(pwd)" \
-DSOLIDSYSLOG_PLATFORMS="LwipRaw;FreeRtos" \
-DSOLIDSYSLOG_LWIP_PATH=/opt/lwip \
-DSOLIDSYSLOG_FREERTOS_KERNEL_PATH=/opt/freertos/kernel \
-DSOLIDSYSLOG_SMOKE_CONFIG_DIR=config-gates-off \
-DSOLIDSYSLOG_SMOKE_LINK_PACKS=ON
- name: Cross-build the packs with the LwipRaw and FreeRtos gates off
run: cmake --build build/consumer-smoke-gates-off
# Path B has no CMake to select anything, so the same consumer is built by
# directory selection. The environment is scrubbed for the same reason as
# above: the platform list and the -D paths are all that can reach it.
- name: Build the Make consumer (scrubbed environment)
run: |
env -u LWIP_PATH -u FREERTOS_KERNEL_PATH -u MBEDTLS_DIR \
-u FATFS_PATH -u FREERTOS_PLUS_FAT_PATH -u FREERTOS_PLUS_TCP_PATH \
make -f ci/consumer-smoke/Makefile -j"$(nproc)" \
LWIP_PATH=/opt/lwip \
FREERTOS_KERNEL_PATH=/opt/freertos/kernel
- name: Build the Make consumer with the LwipRaw and FreeRtos gates off
run: |
env -u LWIP_PATH -u FREERTOS_KERNEL_PATH -u MBEDTLS_DIR \
-u FATFS_PATH -u FREERTOS_PLUS_FAT_PATH -u FREERTOS_PLUS_TCP_PATH \
make -f ci/consumer-smoke/Makefile -j"$(nproc)" \
LWIP_PATH=/opt/lwip \
FREERTOS_KERNEL_PATH=/opt/freertos/kernel \
CONFIG_DIR=config-gates-off \
BUILD="$(pwd)/build/consumer-smoke-make-gates-off"
# A nested configure must not write into the dependency's checkout. The BDD
# tunables mirror is the one that did, and it is gitignored, so check for
# the file itself as well as for tracked-file drift.
- name: Assert the nested configure left the library tree alone
run: |
git diff --exit-code \
|| { echo "::error::configuring SolidSyslog as a subproject modified its own source tree"; exit 1; }
if [ -f Bdd/features/steps/solidsyslog_tunables.py ]; then
echo "::error::a nested configure wrote Bdd/features/steps/solidsyslog_tunables.py into the dependency's checkout"
exit 1
fi
summary:
if: always() && github.event_name == 'pull_request'
needs: [build-linux-gcc, build-linux-tunable-override, build-linux-clang, build-linux-c99, build-linux-c89-headers, sanitize-linux-gcc, coverage-linux-gcc, analyze-tidy, analyze-tidy-freertos-plustcp, analyze-tidy-freertos-lwip, analyze-cppcheck, analyze-format, analyze-markdown, analyze-spdx, analyze-iwyu, analyze-iwyu-freertos-plustcp, analyze-iwyu-freertos-lwip, bdd-linux-syslog-ng, build-windows-msvc, bdd-windows-otel, integration-linux-openssl, integration-linux-mbedtls, integration-windows-openssl, build-freertos-host-tdd-plustcp, build-freertos-target-plustcp, bdd-freertos-qemu-plustcp, build-freertos-target-lwip, bdd-freertos-qemu-lwip, verify-manifest, consumer-smoke-linux, consumer-smoke-freertos-cross]
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
pull-requests: write
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Download JUnit artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: junit-*
path: quality-reports/
- name: Download clang-tidy report
continue-on-error: true
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: clang-tidy-report
path: quality-reports/
- name: Download cppcheck report
continue-on-error: true
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: cppcheck-report
path: quality-reports/
- name: Download iwyu report
continue-on-error: true
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: iwyu-report
path: quality-reports/
- name: Quality Monitor
uses: uhafner/quality-monitor@0100da6973a1498aad89af676852a8c788d397f8 # v4.15.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
pr-number: ${{ github.event.pull_request.number }}
checks-name: Quality Summary
config: >
{
"tests": {
"name": "Tests",
"tools": [
{
"id": "junit",
"name": "build-linux-gcc",
"pattern": "**/junit-build-linux-gcc/cpputest_*.xml"
},
{
"id": "junit",
"name": "build-freertos-host-tdd-plustcp",
"pattern": "**/junit-build-freertos-host-tdd-plustcp/cpputest_*.xml"
},
{
"id": "junit",
"name": "build-linux-clang",
"pattern": "**/junit-build-linux-clang/cpputest_*.xml"
},
{
"id": "junit",
"name": "sanitize-linux-gcc",
"pattern": "**/junit-sanitize-linux-gcc/cpputest_*.xml"
},
{
"id": "junit",
"name": "integration-linux-openssl",
"pattern": "**/junit-integration-linux-openssl/cpputest_*.xml"
},
{
"id": "junit",
"name": "integration-linux-mbedtls",
"pattern": "**/junit-integration-linux-mbedtls/cpputest_*.xml"
},
{
"id": "junit",
"name": "integration-windows-openssl",
"pattern": "**/junit-integration-windows-openssl/cpputest_*.xml"
},
{
"id": "junit",
"name": "bdd-linux-syslog-ng",
"pattern": "**/junit-bdd-linux-syslog-ng/TESTS-*.xml"
},
{
"id": "junit",
"name": "bdd-windows-otel",
"pattern": "**/junit-bdd-windows-otel/TESTS-*.xml"
},
{
"id": "junit",
"name": "bdd-freertos-qemu-plustcp",
"pattern": "**/junit-bdd-freertos-qemu-plustcp/TESTS-*.xml"
},
{
"id": "junit",
"name": "bdd-freertos-qemu-lwip",
"pattern": "**/junit-bdd-freertos-qemu-lwip/TESTS-*.xml"
},
{
"id": "junit",
"name": "build-windows-msvc",
"pattern": "**/junit-build-windows-msvc/cpputest_*.xml"
},
{
"id": "junit",
"name": "build-linux-tunable-override",
"pattern": "**/junit-build-linux-tunable-override/cpputest_*.xml"
}
]
},
"analysis": [
{
"name": "analyze-tidy",
"id": "analyze-tidy",
"tools": [
{
"id": "clang-tidy",
"pattern": "**/clang-tidy-output.txt"
}
]
},
{
"name": "analyze-cppcheck",
"id": "analyze-cppcheck",
"tools": [
{
"id": "cppcheck",
"pattern": "**/cppcheck-report.xml"
}
]
}
]
}