| Image | Tag | Used by |
|---|---|---|
ghcr.io/davidcozens/cpputest |
sha-2c7b76b |
devcontainer (gcc service), most CI jobs. Now ships include-what-you-use 0.23 (clang_19) matching the cpputest-clang build, so local iwyu runs work in the gcc container |
ghcr.io/davidcozens/cpputest-clang |
sha-7eac3ab |
clang compose service, build-linux-clang CI job, analyze-iwyu CI job |
ghcr.io/davidcozens/cpputest-freertos |
sha-0b93766 |
freertos-host compose service, build-freertos-host-tdd-plustcp CI job — adds FreeRTOS-Kernel / Plus-TCP / Plus-FAT / lwIP / FatFs / Mbed TLS sources for host-TDD of FreeRTOS adapters against fakes; inherits IWYU from the rebased cpputest base, enabling the freertos-aware analyze-iwyu lane |
ghcr.io/davidcozens/cpputest-freertos-cross |
sha-0b93766 |
freertos-target compose service, build-freertos-target-plustcp CI job, behave-freertos BDD service, bdd-freertos-qemu-plustcp CI job — adds gcc-arm-none-eabi, libnewlib-arm-none-eabi, gdb-multiarch (aliased as arm-none-eabi-gdb), qemu-system-arm, python3 + behave, FreeRTOS-Kernel / Plus-TCP / Plus-FAT / lwIP / FatFs sources at /opt/freertos-kernel / /opt/freertos-plus-tcp / /opt/freertos/plus-fat / /opt/lwip / /opt/fatfs for cross builds, on-QEMU runs, and BDD scenarios driving a QEMU target |
balabit/syslog-ng |
4.8.2 |
syslog-ng-linux and syslog-ng-freertos services — BDD test oracles, one per target pair. Pinned to the 4.8 LTS line; 4.11.0 (latest as of 2026-02-24) regressed by aborting on STATS over the control socket, which crashed the oracle and cascaded to the dev-container network when freertos-target shares the namespace. |
ghcr.io/davidcozens/behave |
sha-3faff14 |
behave-linux service — Debian trixie + Python 3.12 + Behave for Linux BDD scenarios. The FreeRTOS BDD runner uses the cpputest-freertos-cross image instead (which carries QEMU + Behave). |
The devcontainer uses Docker Compose (.devcontainer/docker-compose.yml).
VS Code connects to the gcc service (GCC). The clang service is on-demand only —
it starts when you explicitly run a command against it and stops when done.
BDD testing pairs each target with its own syslog-ng oracle so jobs running
in parallel (or developers switching containers) never interfere:
| Target | Behave runner | Oracle |
|---|---|---|
| Linux | behave-linux |
syslog-ng-linux |
| FreeRTOS | inside freertos-target (image carries both QEMU and Behave) |
syslog-ng-freertos |
The gcc service depends on syslog-ng-linux so it starts automatically with the
devcontainer; the freertos-target service depends on syslog-ng-freertos and shares
its network namespace via network_mode: service:syslog-ng-freertos, so QEMU's
slirp gateway 10.0.2.2 NATs to the pair's loopback where syslog-ng-freertos is
listening on 0.0.0.0:5514. Both oracles also alias as the bare hostname syslog-ng
on their network so the existing BDD target wiring (Bdd/Targets/Linux/BddTarget*Config.c,
the BDD step helpers) keeps resolving without per-target host overrides. The
pairs never run together, so the alias collision is academic.
As more cross-compilation targets are added, each gets its own oracle pair in the
same shape (syslog-ng-<target> + a runner service or in-container Behave).
cpputest-freertos and cpputest-freertos-cross both ship the
FreeRTOS-Plus-TCP and lwIP source trees side-by-side. The library picks
between them at CMake time via SOLIDSYSLOG_FREERTOS_NET:
| Value | Behaviour |
|---|---|
PLUSTCP (default) |
Cross-builds the full FreeRTOS-Plus-TCP BDD target (Bdd/Targets/FreeRtos/). Current first-class backend. |
LWIP |
Cross-builds the Bdd/Targets/FreeRtosLwip/ link-probe — a stub proving Platform/LwipRaw/ links against lwIP core for FreeRTOS/ARM with no PlusTcp dependency (E28 S28.07). The worked netif + QEMU UDP BDD integration lands in S28.09. |
BOTH |
Cross-builds the PLUSTCP target only and emits a STATUS message noting the lwIP backend builds in isolation under LWIP. Lets dev-container users keep BOTH set without breaking their build. |
CI runs PLUSTCP (required) and LWIP (advisory build-freertos-target-lwip
lane, S28.07) in isolation; the BOTH value is a dev-container convenience and
is not exercised by CI.
From a host terminal (not inside the devcontainer):
docker compose -f .devcontainer/docker-compose.yml run --rm clang \
cmake --preset clang-debug
docker compose -f .devcontainer/docker-compose.yml run --rm clang \
cmake --build --preset clang-debug --target junitWhen a new image tag is available:
- Build and push the new image in the container image repo
- Update the SHA tag in all files that reference it (see table below), plus
docs/containers.md - Rebuild the devcontainer (
Ctrl+Shift+P→ "Dev Containers: Rebuild Container") and verify locally - Raise a PR — use
chore: bump container image to <sha>as the title
| Image | Files to update |
|---|---|
cpputest |
.devcontainer/docker-compose.yml, .github/workflows/ci.yml |
cpputest-clang |
.devcontainer/docker-compose.yml, .github/workflows/ci.yml |
cpputest-freertos |
.devcontainer/docker-compose.yml, .github/workflows/ci.yml, docs/containers.md |
cpputest-freertos-cross |
.devcontainer/docker-compose.yml, .github/workflows/ci.yml, ci/docker-compose.bdd.yml, docs/containers.md |
behave |
.devcontainer/docker-compose.yml, ci/docker-compose.bdd.yml |
The cpputest-freertos and cpputest-freertos-cross images both come from
CppUTestFreertosDocker.
A single push to that repo's main rebuilds and publishes both images at
the same sha-<short> tag — always update both rows together.
All references to a given image must use the same tag. Never update one without the others.
The available services and the build preset each one drives:
| Service | Use case | BUILD_PRESET |
|---|---|---|
gcc |
Primary C/C++ development (default) | debug |
clang |
Clang-specific debugging / portability | clang-debug |
freertos-host |
TDD of FreeRTOS adapters against host-side fakes | debug |
freertos-target |
Cross builds, on-QEMU runs, GDB attach (Cortex-M3, mps2-an385), BDD against the QEMU target | freertos-cross |
behave-linux |
Linux BDD scenario development (Python + Behave) | (none — cmake skipped) |
To switch:
- In
.devcontainer/devcontainer.json, change"service": "gcc"to the target service name (e.g."freertos-target"). Ctrl+Shift+P→ "Dev Containers: Rebuild Container".- Work normally —
Ctrl+Shift+Band all other tasks pick up the right preset via$BUILD_PRESET.
When done, revert "service" back to "gcc" and rebuild again.
The same VS Code keys work across every service:
Ctrl+Shift+Bruns thebuild and testtask, which adapts to the activeBUILD_PRESET. Underfreertos-crossit builds the hello-world ELF; underdebug/clang-debugit builds and runsSolidSyslogTests; withBUILD_PRESETempty (thebehaveservice) it runsbehave.F5debugs:Debug SolidSyslogTests (host)— works ingcc,clang, andfreertos-host(path resolves via${env:BUILD_PRESET}). Builds first via the samebuild and testtask and stops atmain.Debug FreeRTOS BDD Target (QEMU)— works infreertos-target(cortex-debug + arm-none-eabi-gdb + qemu-system-arm). Stops atmainviarunToEntryPoint.- After switching the devcontainer service, pick the matching config from the Run-and-Debug dropdown once. VS Code remembers the last-picked config per workspace (not per container), so the previous choice survives a container rebuild — a stale selection will fail with the wrong debugger type.
Ctrl+Shift+P→ "Tasks: Run Task" →run on QEMU (FreeRTOS)— one-shot QEMU run for sanity-checking the build, output to the integrated terminal. Use only in thefreertos-targetservice.
For the FreeRTOS BDD target, see Bdd/Targets/FreeRtos/README.md for build / run / GDB-attach instructions.