--- name: feedback_gururmm_build_verification description: Before touching the GuruRMM build pipeline, verify locally first — merge-to-main IS the build+deploy. Canonical refs: docs/BUILD.md + the gururmm-build skill. Compile-gate trap. metadata: type: feedback --- Every Claude instance that touches the GuruRMM build pipeline must internalize this before editing agent/server/dashboard code: **Merging to `main` IS the build-and-deploy trigger — there is no separate build step.** A push to main fires the Gitea webhook → `webhook-handler.py` on 172.16.3.30 → `build-shared.sh` (version bump + `[ci-version-bump]` commit) → per-component builds (each self-gated on change). New agent/server/dashboard artifacts land on **beta** first; prod promotion is deliberate. Canonical, kept-current references (use these, don't re-derive from the scripts): - **`projects/msp-tools/guru-rmm/docs/BUILD.md`** — developer build + pre-merge verification guide. - **`gururmm-build` skill** — `verify.sh {server|agent|dashboard|all|migrations} [--check]` runs the same cargo/npm the server runs, on the right OS, with the gotchas baked in + errorlog on failure. - **`projects/msp-tools/guru-rmm/deploy/build-pipeline/README.md`** — server-side pipeline source of truth (webhook, Beast/Pluto hosts, signing, dashboard channels, repo↔/opt sync). The repo's older `scripts/build-agents.sh` + `scripts/webhook-handler.py` are a PRIOR generation — do not follow them. The traps that break a post-merge build: - **Compile gate:** Linux-gated agent code (`#[cfg(target_os="linux")]`, e.g. `is_docker_container()` in `agent/src/updater/mod.rs`) is ONLY compiled by the Linux agent build — Windows `cargo check` CANNOT verify it (`openssl-sys` won't cross-build). The Linux agent build on .30 is the real gate. Build agent changes on the OS family they target; Windows-only paths (MSI/tray/legacy/x86) are gated only by the Beast/Pluto Windows build. - **sqlx offline cache:** the server build uses `SQLX_OFFLINE=true` + `server/.sqlx`. If you changed queries/migrations, run `cargo sqlx prepare` and commit `server/.sqlx`, or the build fails. - **Migration number collisions** across branches: check the highest `NNN_` on origin/main before naming a new one (`verify.sh migrations`). Idempotent (`IF NOT EXISTS`) keeps overlaps harmless. - Webhook builds from **origin/main**, so verify the COMMITTED state, not the working tree. **Why:** merging deploys, so an unverified merge breaks the build or ships broken code. Howard hit this 2026-06-21 — couldn't cross-build the Linux-gated BUG-019 path from his Windows box, so the post-merge Linux build on .30 was the only gate. **How to apply:** before merging gururmm changes, run `gururmm-build` `verify.sh` for each touched component (on the OS it targets); read `docs/BUILD.md` if unfamiliar with the model; after merge, watch the matching `/var/log/gururmm-build-*.log` on .30. Promote the dashboard beta→prod only via `promote-dashboard.sh --confirm`. Related: [[reference_gururmm]] [[rmm-dashboard-beta-before-main]] [[feedback_dashboard_beta_first]] [[feedback_gururmm_build_channel_default]] [[feedback_verify_committed_state_before_push]] [[reference_guru5070_rust_toolchain]] [[reference_sqlx_migrations_immutable]] [[gururmm-beast-windows-build-host]] [[feedback_gururmm]] [[rmm-agent-update-model]]