#!/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/||'