Skip to content

ci: add examples build matrix, config variants, and upstream drift watcher - #11

Merged
fudio101 merged 4 commits into
mainfrom
ci/examples-matrix-and-upstream-drift
Aug 14, 2026
Merged

ci: add examples build matrix, config variants, and upstream drift watcher#11
fudio101 merged 4 commits into
mainfrom
ci/examples-matrix-and-upstream-drift

Conversation

@fudio101

Copy link
Copy Markdown
Collaborator

Two commits:

  1. examples job (matrix over all 5 examples on ESP-IDF v6.0.1, plus an
    early-warning release-v6.0 build) and config-variants job (zerocopy,
    minimal, cellular-zerocopy -- the three combinations the examples'
    own sdkconfig.defaults don't already exercise). Also fixes
    examples/failover_connect/main/CMakeLists.txt, which was missing
    REQUIRES entirely.
  2. Upstream drift watcher for CamM2325/microlink -- same pattern as
    fugo101/wireguard-lwip's, filtered against the PR numbers
    UPSTREAM_PRS.md already accounts for.

This is the first PR to actually exercise the real build (the manifest
job that unblocked #10 only validates the manifest, not a full compile) --
worth watching its run closely before merging.

- examples job: matrix of all 5 examples on ESP-IDF v6.0.1 (the version
  inside espressif32@7.0.1, which is what zen-clock actually pins), plus
  an early-warning basic_connect build against release-v6.0
  (continue-on-error).
- config-variants job: covers the three config combinations the 5
  examples' own sdkconfig.defaults don't already exercise -- zerocopy
  (CONFIG_ML_ZERO_COPY_WG=y), minimal (everything optional off), and
  cellular-zerocopy (both features together, since neither alone would
  catch an interaction bug between them). Overlays live in ci/, applied
  via -DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.ci" (which
  replaces the implicit default list, so the base file has to be
  re-listed alongside the overlay).
- examples/failover_connect/main/CMakeLists.txt was missing REQUIRES
  entirely -- harmless today only because IDF links everything when a
  component doesn't declare REQUIRES, but it meant this was the one
  example that would silently build even if `microlink` fell out of the
  build graph. Set it to match the other 4 examples.

espressif/esp-idf-ci-action interpolates `command` inside a single-quoted
`bash -c '...'` -- only double quotes are usable inside the command string,
noted inline where it matters.
Same pattern as fugo101/wireguard-lwip's watcher: weekly cron +
workflow_dispatch, a single tracking issue updated in place and
auto-closed when clean. git cherry -v against upstream/main catches
missing commits by patch-id; gh pr list catches open PRs, filtered
against the PR numbers UPSTREAM_PRS.md already accounts for (absorbed
or deliberately skipped with a recorded reason) so the issue only
surfaces genuinely new drift.

Requires the upstream-drift label (created on the repo, not tracked in
git).
Component-requirements expansion (which decides REQUIRES/PRIV_REQUIRES,
and therefore public include-dir propagation) runs in an ESP-IDF CMake
pass that happens before Kconfig is resolved -- REQUIRES can never
depend on a CONFIG_* value, only SRCS can (in the later registration
pass). The previous commit (ea9237a) gated the esp_driver_uart/
esp_driver_gpio REQUIRES on CONFIG_ML_ENABLE_CELLULAR, which silently
no-ops: confirmed the fix never actually took effect, in both a local
PlatformIO build and the real ESP-IDF Docker CI added by this same PR
(everything with CONFIG_ML_ENABLE_CELLULAR=y still failed with "driver/
uart.h: No such file or directory").

Fix: make both REQUIRES unconditional, same as `driver` and
esp_driver_tsens already are above them -- REQUIRES is necessarily
coarser-grained than SRCS in ESP-IDF, this is normal.
config_load_peers()'s old-format migration path compared old_count
(uint8_t, max 255) directly against ML_CONFIG_MAX_ALLOWED_PEERS. Every
example in this repo defaults that Kconfig value to 512 -- since 255 is
always <= 512, GCC's -Werror=type-limits correctly flags the comparison
as always true regardless of old_count's runtime value, which is a real
bug: on a config with a *smaller* max (the Kconfig range allows as low
as 1), the intended clamp would silently never trigger either, since the
compiler would have already proven the check meaningless for the
default and this path is only reachable at all when it isn't.

This was pre-existing on main, unrelated to this migration -- it just
never had CI to catch it before. Fix: widen old_count to uint16_t before
the comparison, so the check is against the variable's actual runtime
value instead of a type range GCC can resolve at compile time.
@fudio101
fudio101 merged commit 3400092 into main Aug 14, 2026
10 checks passed
fudio101 added a commit that referenced this pull request Aug 19, 2026
Issue #23 (captive-portal detection) was closed and merged via PR #48
on 2026-08-18 but the tracker table was never updated to reflect it —
the only row still missing a done marker. Also prunes the Notes
section's two "conflicts to resolve before scoping" callouts (#11,
#2-vs-#17), both already resolved in their own rows.

Co-authored-by: Adrian.Nguyen-Qualgo <nguyen.ndt@qualgo.net>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants