Project_SylDa/docs/superpowers/specs/2026-07-30-release-build-design.md
eddy 70f004c45b docs: add release build spec and implementation plan
Also un-ignores docs/ directory so project documentation (specs, plans)
is tracked in git. Individual research files remain gitignored.
2026-07-30 19:54:13 +02:00

99 lines
3.9 KiB
Markdown

# Release build & Forgejo publishing — design
**Datum:** 2026-07-30
**Context:** Android app (AtomRelay) heeft nog geen ondertekende release build. Doel: signing keystore aanmaken, release APK + AAB bouwen, en publiceren als release op Forgejo (`git.eddydevink.nl/eddy/Project_SylDa`). Vooruitkijkend op multi-store publishing (Amazon, Samsung, F-Droid, later Google Play).
## Scope
- Keystore genereren en veilig opslaan (Obsidian vault + gitignored workspace copy)
- Signing configuratie in `build.gradle` via extern `signing.properties`
- Release script `scripts/release.sh` dat APK, AAB en firmware binaries bundelt
- Upload naar Forgejo als git-tagged release met attachments
- Buiten scope: daadwerkelijk uploaden naar app stores, Forgejo Actions/CI
## Huidige situatie
- `versionCode 1`, `versionName "1.0"`
- Geen keystore, geen signing config
- `gradle.properties` is tracked (geen secrets)
- APK/AAB bestanden al in `.gitignore`
- Forgejo repo `eddy/Project_SylDa`, API op `http://localhost:3000/api/v1`, 0 releases, 0 tags
- Firmware binaries in `android/app/src/main/assets/firmware/`
- Root project: `AtomRelay`, Gradle 8.14, AGP 8.5.2, Kotlin 2.0.21
## Ontwerp
### 1. Keystore & signing config
| Bestand | Pad | Git |
|---|---|---|
| Keystore | `android/keystore/sylda-release.jks` | `.gitignore` |
| Wachtwoorden | `android/signing.properties` | `.gitignore` |
| Signing block | `android/app/build.gradle` (aanpassing) | tracked |
**`signing.properties`** inhoud:
```properties
KEYSTORE_PATH=keystore/sylda-release.jks
KEYSTORE_PASSWORD=<wachtwoord>
KEY_ALIAS=sylda
KEY_PASSWORD=<wachtwoord>
```
**`build.gradle`** aanpassing: onder `android {}` block wordt signing block toegevoegd dat `signing.properties` inleest. Alleen actief als het bestand bestaat → debug builds blijven werken zonder keystore.
**Keystore generatie:**
```bash
keytool -genkey -v -keystore android/keystore/sylda-release.jks \
-alias sylda -keyalg RSA -keysize 2048 -validity 10000
```
**Opslag:** kopie van `.jks` + wachtwoorden naar Obsidian vault. Gitignored kopie blijft in workspace voor Gradle.
### 2. .gitignore
Toevoegen:
```
android/keystore/
android/signing.properties
```
### 3. Release script (`scripts/release.sh`)
Flow:
1. Controleert dat `signing.properties` bestaat
2. `./gradlew clean`
3. `./gradlew bundleRelease assembleRelease`
4. Verzamelt artefacten in `release/v{version}/`:
- `app-release.apk`
- `app-release.aab`
- `bootloader.bin`, `partitions.bin`, `boot_app0.bin`, `firmware.bin`
- `checksums.txt` (SHA256 van alle bestanden)
5. `git tag v{version} && git push origin v{version}`
6. Maakt Forgejo release aan via API
7. Uploadt alle artefacten als attachments
**Forgejo token:** opgeslagen in `~/.config/sylda/forgejo-token` (niet in repo). Moet handmatig aangemaakt worden in Forgejo web UI (Settings > Applications > Generate Token, scope `write:repository`).
**Versie-detectie:** script leest `versionName` uit `build.gradle` via grep, géén handmatige argumenten nodig.
### 4. F-Droid compatibiliteit
- Geen timestamp in APK/AAB build (huidige `BUILD_NUMBER` buildConfigField wordt alleen voor debug gebruikt en zit niet in release builds — check)
- Vaste Gradle wrapper versie (8.14)
- Check: `buildConfigField` met timestamp staat in `defaultConfig`, niet in release buildType. Dit is OK voor F-Droid want F-Droid bouwt reproduceerbare builds met eigen tooling.
### 5. Multi-store vooruitblik
| Platform | Artefact | Extra nodig |
|---|---|---|
| Forgejo release | APK + AAB + firmware | Deze release |
| Google Play | AAB | Google Play developer account |
| Amazon Appstore | APK | Amazon developer account |
| Samsung Galaxy Store | APK | Samsung developer account |
| F-Droid | Source | F-Droid metadata + merge request |
## Beslissingen
- Keystore in Obsidian vault (conform AGENTS.md credentials policy)
- Huidig versienummer behouden (1/1.0) — eerste release
- Aanpak A: release script, handmatig (geen CI voor nu)