All checks were successful
CI / build (pull_request) Successful in 1m20s
- Fix README touch sensor docs (active LOW, INPUT_PULLUP) - Fix README LED pin (G46 -> G35 WS2812) - Fix release.sh to copy server/ and client/ firmware - Remove stale firmware.bin from root assets - Reduce OTA START wait from 10s to 500ms - Close bluetoothGatt before new connection - Use kotlinx.coroutines.CompletableDeferred
142 lines
No EOL
5.1 KiB
Shell
Executable file
142 lines
No EOL
5.1 KiB
Shell
Executable file
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
log() { echo -e "${GREEN}[release]${NC} $1"; }
|
|
warn() { echo -e "${YELLOW}[release]${NC} $1"; }
|
|
err() { echo -e "${RED}[release]${NC} $1" >&2; }
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
|
ANDROID_DIR="$PROJECT_DIR/android"
|
|
APP_BUILD_GRADLE="$ANDROID_DIR/app/build.gradle"
|
|
SIGNING_PROPS="$ANDROID_DIR/signing.properties"
|
|
FORGEJO_URL="https://git.eddydevink.nl/api/v1/repos/eddy/Project_SylDa"
|
|
CHECK_VERSIONS="$PROJECT_DIR/tools/check_versions.sh"
|
|
COPY_FIRMWARE="$PROJECT_DIR/tools/copy_firmware.sh"
|
|
FIRMWARE_DIR="$ANDROID_DIR/app/src/main/assets/firmware"
|
|
|
|
VERSION=$(grep -oP 'versionName\s+"\K[^"]+' "$APP_BUILD_GRADLE")
|
|
TAG="v$VERSION"
|
|
RELEASE_DIR="$PROJECT_DIR/release/$TAG"
|
|
|
|
log "Release v$VERSION (tag $TAG)"
|
|
log "========================================="
|
|
|
|
if [ ! -f "$SIGNING_PROPS" ]; then
|
|
err "signing.properties niet gevonden op $SIGNING_PROPS"
|
|
exit 1
|
|
fi
|
|
|
|
# ── Build firmware ────────────────────────────────────────────
|
|
log "Build firmware (pio run)..."
|
|
cd "$PROJECT_DIR"
|
|
pio run
|
|
log "Firmware built."
|
|
|
|
log "Copy firmware to Android assets..."
|
|
bash "$COPY_FIRMWARE"
|
|
log "Firmware copied."
|
|
|
|
# ── Build Android ─────────────────────────────────────────────
|
|
log "Clean Gradle..."
|
|
cd "$ANDROID_DIR"
|
|
./gradlew clean
|
|
|
|
log "Build release APK + AAB..."
|
|
./gradlew assembleRelease bundleRelease
|
|
log "Android built."
|
|
|
|
# ── Verify version consistency ────────────────────────────────
|
|
log "Verify version consistency..."
|
|
if ! bash "$CHECK_VERSIONS"; then
|
|
err "Version mismatch detected — aborting release."
|
|
err "version.txt is source of truth. Both version.h and SylDaVersions.kt are regenerated above."
|
|
exit 1
|
|
fi
|
|
|
|
# ── Gather artifacts ──────────────────────────────────────────
|
|
log "Verzamel artefacten in $RELEASE_DIR"
|
|
rm -rf "$RELEASE_DIR"
|
|
mkdir -p "$RELEASE_DIR"
|
|
|
|
cp "$ANDROID_DIR/app/build/outputs/apk/release/app-release.apk" "$RELEASE_DIR/"
|
|
cp "$ANDROID_DIR/app/build/outputs/bundle/release/app-release.aab" "$RELEASE_DIR/"
|
|
|
|
# Server firmware
|
|
cp "$FIRMWARE_DIR/server/bootloader.bin" "$RELEASE_DIR/server-bootloader.bin"
|
|
cp "$FIRMWARE_DIR/server/partitions.bin" "$RELEASE_DIR/server-partitions.bin"
|
|
cp "$FIRMWARE_DIR/server/boot_app0.bin" "$RELEASE_DIR/server-boot_app0.bin"
|
|
cp "$FIRMWARE_DIR/server/firmware.bin" "$RELEASE_DIR/server-firmware.bin"
|
|
|
|
# Client firmware
|
|
cp "$FIRMWARE_DIR/client/bootloader.bin" "$RELEASE_DIR/client-bootloader.bin"
|
|
cp "$FIRMWARE_DIR/client/partitions.bin" "$RELEASE_DIR/client-partitions.bin"
|
|
cp "$FIRMWARE_DIR/client/boot_app0.bin" "$RELEASE_DIR/client-boot_app0.bin"
|
|
cp "$FIRMWARE_DIR/client/firmware.bin" "$RELEASE_DIR/client-firmware.bin"
|
|
|
|
log "Checksums..."
|
|
cd "$RELEASE_DIR"
|
|
sha256sum * > checksums.txt
|
|
cat checksums.txt
|
|
|
|
# ── Git tag ───────────────────────────────────────────────────
|
|
cd "$PROJECT_DIR"
|
|
if git diff --quiet && git diff --cached --quiet; then
|
|
log "Working tree clean."
|
|
else
|
|
warn "Working tree has uncommitted changes. Commit before releasing."
|
|
warn "Uncommitted files:"
|
|
git status --short
|
|
exit 1
|
|
fi
|
|
|
|
if git rev-parse "$TAG" >/dev/null 2>&1; then
|
|
log "Tag $TAG bestaat al, skip git tag."
|
|
else
|
|
log "Git tag $TAG..."
|
|
git tag "$TAG"
|
|
git push origin "$TAG"
|
|
fi
|
|
|
|
# ── Create Forgejo release ────────────────────────────────────
|
|
log "Forgejo release aanmaken..."
|
|
TOKEN_FILE="$HOME/.config/sylda/forgejo-token"
|
|
if [ ! -f "$TOKEN_FILE" ]; then
|
|
err "Forgejo token niet gevonden op $TOKEN_FILE"
|
|
err "Genereer een token in Forgejo: Settings > Applications > Generate Token (scope: write:repository)"
|
|
err "Sla op als: echo 'je-token' > $TOKEN_FILE"
|
|
exit 1
|
|
fi
|
|
TOKEN=$(cat "$TOKEN_FILE")
|
|
|
|
RELEASE_RESP=$(curl -s -X POST "$FORGEJO_URL/releases" \
|
|
-H "Authorization: token $TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d "{\"tag_name\": \"$TAG\", \"name\": \"$TAG\", \"body\": \"SylDa Android app + firmware\", \"draft\": false, \"prerelease\": false}")
|
|
|
|
RELEASE_ID=$(echo "$RELEASE_RESP" | python3 -c 'import sys,json; print(json.load(sys.stdin)["id"])' 2>/dev/null || true)
|
|
|
|
if [ -z "$RELEASE_ID" ]; then
|
|
err "Release aanmaken mislukt. Response:"
|
|
echo "$RELEASE_RESP"
|
|
exit 1
|
|
fi
|
|
log "Release ID: $RELEASE_ID"
|
|
|
|
cd "$RELEASE_DIR"
|
|
for f in *; do
|
|
log " Upload $f..."
|
|
curl -s -X POST "$FORGEJO_URL/releases/$RELEASE_ID/assets?name=$f" \
|
|
-H "Authorization: token $TOKEN" \
|
|
-H "Content-Type: application/octet-stream" \
|
|
--data-binary "@$f" > /dev/null
|
|
done
|
|
|
|
log "========================================="
|
|
log "Klaar! Release $TAG staat op Forgejo."
|
|
log " $FORGEJO_URL/releases/tag/$TAG" | sed 's|/api/v1/repos/||' |