2026-07-10 10:12:13 +02:00
# Forgejo releases and Obtainium
2026-04-24 14:28:23 +02:00
2026-07-10 10:12:13 +02:00
Forgejo Actions workflow: [`.forgejo/workflows/build_release.yml` ](../.forgejo/workflows/build_release.yml )
2026-04-24 14:28:23 +02:00
## What it does
2026-07-10 10:12:13 +02:00
- Triggers on tags matching `v*` , or manually via **Actions → Forgejo Release Builder → Run workflow**
- Builds release APKs (`assembleRelease -Penable-updater -Pdisable-code-shrink`, no telemetry)
- Signs APKs with your release keystore
- Creates or updates a Forgejo release and uploads APK assets
- Publishes stable Obtainium-friendly asset names alongside versioned files
2026-04-24 14:28:23 +02:00
2026-07-10 10:12:13 +02:00
The workflow uses shell + Forgejo API calls only (no GitHub-only release actions), so it runs on self-hosted Forgejo runners.
## Cut a release
1. Bump `versionCode` / `versionName` in `app/build.gradle.kts` if needed.
2. Commit and push to your default branch.
3. Create and push an annotated tag:
```sh
git tag -a v1.13.6 -m "v1.13.6"
git push origin v1.13.6
```
4. Forgejo Actions builds, signs, and publishes the release automatically.
To **rebuild an existing tag** (e.g. after fixing signing secrets), use **Run workflow** and enter the tag name. The tag must already exist on the remote.
2026-04-24 14:28:23 +02:00
## Required repository secrets
2026-07-10 10:12:13 +02:00
Configure under **Repository → Settings → Actions → Secrets** :
| Secret | Description |
|--------|-------------|
| `SIGNING_KEYSTORE_B64` | Base64-encoded release keystore (`.jks` / `.keystore` ) |
| `SIGNING_KEYSTORE_PASSWORD` | Keystore password |
| `SIGNING_KEY_ALIAS` | Key alias inside the keystore |
| `SIGNING_KEY_PASSWORD` | Key password |
2026-04-24 14:28:23 +02:00
2026-07-10 10:12:13 +02:00
`secrets.GITHUB_TOKEN` is the built-in Forgejo Actions token used for release API calls (no extra setup).
2026-04-24 14:28:23 +02:00
2026-07-10 10:12:13 +02:00
Encode a keystore for the secret:
```sh
base64 -w0 your-release.keystore
```
2026-04-24 14:28:23 +02:00
## Runner label
The workflow uses:
```yaml
2026-07-10 10:12:13 +02:00
runs-on: desktop-release
2026-04-24 14:28:23 +02:00
```
2026-07-10 10:12:13 +02:00
Register a self-hosted runner with a matching label. Host mode is simplest for Android builds:
2026-04-24 14:28:23 +02:00
```sh
forgejo-runner register \
2026-07-10 10:12:13 +02:00
--instance https://your-forgejo.example \
2026-04-24 14:28:23 +02:00
--token < registration-token > \
--name komikku-release \
2026-07-10 10:12:13 +02:00
--labels "desktop-release:host"
2026-04-24 14:28:23 +02:00
```
## Runner prerequisites
2026-07-10 10:12:13 +02:00
Install on the runner host:
2026-04-24 14:28:23 +02:00
2026-07-10 10:12:13 +02:00
- Git, curl, jq, zip
2026-04-24 14:28:23 +02:00
- JDK 17
- Android SDK command-line tools
- Android platform `android-35`
2026-07-10 10:12:13 +02:00
- Android build-tools `35.0.0` (or newer; workflow installs via `sdkmanager` if missing)
2026-04-24 14:28:23 +02:00
2026-07-10 10:12:13 +02:00
Recommended environment:
2026-04-24 14:28:23 +02:00
```sh
export ANDROID_HOME=/opt/android-sdk
export ANDROID_SDK_ROOT=/opt/android-sdk
export PATH="$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$PATH"
```
2026-07-10 10:12:13 +02:00
Optional persistent Gradle cache (speeds up repeat builds):
```sh
export KOMIKKU_GRADLE_CACHE="$HOME/.cache/komikku-ci-gradle"
```
## Release assets
Versioned (one set per tag):
- `Komikku-v1.13.6.apk` — universal
- `Komikku-arm64-v8a-v1.13.6.apk`
- `Komikku-armeabi-v7a-v1.13.6.apk`
- `Komikku-x86-v1.13.6.apk`
- `Komikku-x86_64-v1.13.6.apk`
- `Komikku-mapping-v1.13.6.zip` — ProGuard mapping (when present)
Stable aliases (same filename every release; best for Obtainium):
- `Komikku-universal.apk`
- `Komikku-arm64-v8a.apk`
2026-04-24 14:28:23 +02:00
2026-07-10 10:12:13 +02:00
## Obtainium
Obtainium can install directly from Forgejo release assets.
1. Install [Obtainium ](https://github.com/ImranR98/Obtainium ) on your device.
2. **Add app** → source type **Forgejo** (or **Gitea** on older Obtainium).
3. Enter your repository URL, e.g. `https://forgejo.example/youruser/komikku` .
4. Set **APK filter** to a stable asset name:
- Most phones: `Komikku-arm64-v8a.apk`
- Universal fallback: `Komikku-universal.apk`
5. Obtainium reads the latest `v*` release tag; version is parsed from the tag (e.g. `v1.13.6` → `1.13.6` ).
Direct download URL pattern (for reference):
```text
https://forgejo.example/< owner > /< repo > /releases/download/< tag > /Komikku-arm64-v8a.apk
```
2026-04-24 14:28:23 +02:00
## Notes
2026-07-10 10:12:13 +02:00
- GitHub workflows under `.github/workflows/` are unchanged; they target GitHub Actions and upstream secrets.
- Release notes are generated from git history between the previous and current `v*` tag.
- Unsigned APKs are built internally but only signed APKs are uploaded to the release.