ci: add version consistency check and fully automate release pipeline
- New tools/check_versions.sh: verifies version.txt, version.h, SylDaVersions.kt match - release.yml: 'Verify version consistency' step after build, aborts release if mismatch - ci.yml: same check after debug APK build - scripts/release.sh: now runs full pipeline (pio run -> copy firmware -> gradle -> check) and refuses dirty working tree - Untrack version.h, SylDaVersions.kt, release/ — always regenerated fresh from version.txt Prevents the v1.1 bug where stale generated files caused version mismatch and infinite re-flash loop.
This commit is contained in:
parent
1d94f088fd
commit
6a07505d02
14 changed files with 123 additions and 20 deletions
75
tools/check_versions.sh
Executable file
75
tools/check_versions.sh
Executable file
|
|
@ -0,0 +1,75 @@
|
|||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
NC='\033[0m'
|
||||
|
||||
pass() { echo -e " ${GREEN}OK${NC} $1"; }
|
||||
fail() { echo -e " ${RED}MISMATCH${NC} $1"; }
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
||||
|
||||
VERSION_FILE="$PROJECT_DIR/version.txt"
|
||||
HEADER_FILE="$PROJECT_DIR/src/version.h"
|
||||
KOTLIN_FILE="$PROJECT_DIR/android/app/src/main/java/nl/eddydevink/sylda/SylDaVersions.kt"
|
||||
|
||||
errors=0
|
||||
|
||||
echo "=== Version consistency check ==="
|
||||
|
||||
# 1. Parse version.txt (source of truth)
|
||||
if [ ! -f "$VERSION_FILE" ]; then
|
||||
fail "version.txt not found at $VERSION_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
src_server=$(grep -oP '^server=\K\d+' "$VERSION_FILE" || true)
|
||||
src_client=$(grep -oP '^client=\K\d+' "$VERSION_FILE" || true)
|
||||
|
||||
if [ -z "$src_server" ] || [ -z "$src_client" ]; then
|
||||
fail "version.txt missing server= or client="
|
||||
exit 1
|
||||
fi
|
||||
pass "version.txt server=$src_server client=$src_client"
|
||||
|
||||
# 2. Parse src/version.h (generated by pio run)
|
||||
if [ ! -f "$HEADER_FILE" ]; then
|
||||
fail "src/version.h not found — run 'pio run' first"
|
||||
((errors++))
|
||||
else
|
||||
hdr_server=$(grep -oP 'FIRMWARE_VERSION_SERVER\s+"\K\d+' "$HEADER_FILE" || true)
|
||||
hdr_client=$(grep -oP 'FIRMWARE_VERSION_CLIENT\s+"\K\d+' "$HEADER_FILE" || true)
|
||||
if [ "$hdr_server" = "$src_server" ] && [ "$hdr_client" = "$src_client" ]; then
|
||||
pass "src/version.h server=$hdr_server client=$hdr_client"
|
||||
else
|
||||
fail "src/version.h server=${hdr_server:-MISSING} client=${hdr_client:-MISSING} (expected server=$src_server client=$src_client)"
|
||||
((errors++))
|
||||
fi
|
||||
fi
|
||||
|
||||
# 3. Parse SylDaVersions.kt (generated by Gradle build)
|
||||
if [ ! -f "$KOTLIN_FILE" ]; then
|
||||
fail "SylDaVersions.kt not found — run './gradlew build' first"
|
||||
((errors++))
|
||||
else
|
||||
kt_server=$(grep -oP 'const val SERVER = "\K\d+' "$KOTLIN_FILE" || true)
|
||||
kt_client=$(grep -oP 'const val CLIENT = "\K\d+' "$KOTLIN_FILE" || true)
|
||||
if [ "$kt_server" = "$src_server" ] && [ "$kt_client" = "$src_client" ]; then
|
||||
pass "SylDaVersions.kt server=$kt_server client=$kt_client"
|
||||
else
|
||||
fail "SylDaVersions.kt server=${kt_server:-MISSING} client=${kt_client:-MISSING} (expected server=$src_server client=$src_client)"
|
||||
((errors++))
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
if [ "$errors" -eq 0 ]; then
|
||||
echo -e "${GREEN}All version files in sync.${NC}"
|
||||
exit 0
|
||||
else
|
||||
echo -e "${RED}$errors version file(s) out of sync with version.txt.${NC}"
|
||||
echo "Run 'pio run' and './gradlew build' to regenerate."
|
||||
exit 1
|
||||
fi
|
||||
Loading…
Reference in a new issue