feat(tools): Auslieferungsarchiv ohne WLAN-Zugangsdaten

Baut alle acht Ziele ueber den wiederverwendbaren Bauweg tools/build_nocreds.sh
(config.local.cmake liegt per trap beiseite, damit sie nicht als set() jedes -D
schlaegt) und packt ota/, migrate/ (prod+dev signiert), flash/, bruno/,
onboard.sh, README.md und SHA256SUMS nach dist/ninlight-<version>.tar.gz.

Vor dem Packen wird jede Datei binaer gegen SSID, WLAN-Passwort und Token aus
config.local.cmake geprueft; ein Fund bricht den Lauf ab.
This commit is contained in:
Michael Sauer
2026-09-15 01:07:44 +02:00
parent 6325ce073f
commit 2fe2f7d9f4
4 changed files with 883 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
#!/usr/bin/env bash
# Baut Firmwareabzuege OHNE einkompilierte WLAN-Zugangsdaten: die Lampen starten damit
# im Onboarding-AP (ninlight-<mac4>), statt sich in ein fremdes WLAN einzuwaehlen.
#
# Aufruf: tools/build_nocreds.sh [ziel ...] (ohne Argumente: alle acht Ziele)
#
# Ergebnis: je Ziel ein Build-Verzeichnis unter $NINLIGHT_NOCREDS_BUILD_REL (Vorgabe
# "build-nocreds", relativ zum Repo-Wurzelverzeichnis) mit den ueblichen Artefakten
# (ninlight_<ziel>_gz.img, ninlight_<ziel>_ota.img, ...). Bewusst NICHT build/: die
# dortigen Abzuege sind die des Entwicklers - mit seinem WLAN - und bleiben unangetastet.
#
# Dieses Skript ist ausdruecklich zum Wiederverwenden da: tools/release.sh baut damit das
# Auslieferungsarchiv, und die Migrationsstation wird damit die Wahl "Lampe startet im
# Onboarding-AP" bedienen. Deshalb steht die Logik hier und nicht in release.sh.
#
# Umgebungsvariablen:
# NINLIGHT_DOCKER Build-Vorspann (Vorgabe tools/docker.sh); Tests stubben ihn
# NINLIGHT_NOCREDS_BUILD_REL Ausgabeverzeichnis relativ zur Repo-Wurzel
set -euo pipefail
ROOT=$(cd "$(dirname "$0")/.." && pwd)
DOCKER=${NINLIGHT_DOCKER:-$ROOT/tools/docker.sh}
BUILD_REL=${NINLIGHT_NOCREDS_BUILD_REL:-build-nocreds}
DEVICES=(evk e27_rgb e14_rgb gu10_rgb e27_cw e14_cw gu10_cw g95_cw)
if [ $# -gt 0 ]; then
TARGETS=("$@")
else
TARGETS=("${DEVICES[@]}")
fi
for t in "${TARGETS[@]}"; do
ok=0
for d in "${DEVICES[@]}"; do [ "$t" = "$d" ] && ok=1; done
[ "$ok" -eq 1 ] || { echo "Fehler: unbekanntes Ziel '$t' (bekannt: ${DEVICES[*]})" >&2; exit 1; }
done
# config.local.cmake wird in CMakeLists.txt mit gewoehnlichem set() eingebunden und
# SCHLAEGT damit jedes -D auf der Kommandozeile. Ein Bau ohne Zugangsdaten ist deshalb
# nur moeglich, wenn die Datei fuer die Dauer des Baus beiseite liegt. In ihr stehen die
# echte SSID, das WLAN-Passwort und das API-Token - sie muss auch dann zurueckkommen,
# wenn der Bau abbricht oder jemand Strg-C drueckt. Darum ein trap auf EXIT UND auf
# INT/TERM (EXIT allein laeuft bei einem Signal zwar auch, aber der Exit-Code soll das
# Signal widerspiegeln, statt als Erfolg durchzugehen).
LOCAL="$ROOT/config.local.cmake"
STASH_DIR=""
restore_local() {
[ -n "$STASH_DIR" ] || return 0
if [ -f "$STASH_DIR/config.local.cmake" ]; then
cp -p "$STASH_DIR/config.local.cmake" "$LOCAL" || {
echo "ACHTUNG: config.local.cmake konnte nicht zurueckgelegt werden - Kopie liegt unter $STASH_DIR" >&2
STASH_DIR=""
return 1
}
fi
rm -rf "$STASH_DIR"
STASH_DIR=""
}
if [ -f "$LOCAL" ]; then
STASH_DIR=$(mktemp -d)
cp -p "$LOCAL" "$STASH_DIR/config.local.cmake"
trap 'restore_local' EXIT
trap 'restore_local; trap - INT; kill -INT $$' INT
trap 'restore_local; exit 143' TERM
rm -f "$LOCAL"
echo "config.local.cmake liegt fuer diesen Bau beiseite (keine WLAN-Zugangsdaten im Abzug)"
fi
for t in "${TARGETS[@]}"; do
echo "== $t (ohne Zugangsdaten)"
# Relative Pfade, weil der Bau ueblicherweise im Container laeuft, der das Repo unter
# /work einhaengt - absolute Hostpfade gaebe es dort nicht.
"$DOCKER" cmake -S . -B "$BUILD_REL/$t" -G Ninja \
-DCMAKE_TOOLCHAIN_FILE=cmake/arm-none-eabi.cmake -DNINLIGHT_DEVICE="$t" >/dev/null
"$DOCKER" cmake --build "$BUILD_REL/$t"
done
echo "fertig - Abzuege ohne Zugangsdaten unter $ROOT/$BUILD_REL"