065df61e8aabb2c3f7049036395fa42a725d20d6
Every job now runs inside kryz-ci:latest via 'docker run' with volume
mounts. The image is built once per pipeline (with a cache check) instead
of every job redownloading Flutter + Android SDK + Java independently.
Before: ~40 min (each of 3-4 jobs downloads ~750MB of SDKs from scratch)
After (first run): ~25 min (single Docker build, then all jobs use cached image)
After (cached): ~5-8 min (image already on runner, jobs just docker run)
Changes:
- ci.yml: replace inline SDK setup in lint/test/build-android with
'docker run --rm -v ${PWD}:/workspace kryz-ci:latest' per step
- release.yml: same container strategy + fix auth token leak (was
hardcoded '***' instead of using $GITEA_TOKEN env var)
- ci.Dockerfile: add cleanup (rm /tmp, http cache) to shrink image size
- Net reduction: 3 files changed, -111 lines removed
KRYZ Go!
About
A Flutter application for KRYZ LP-FM 98.5 Mariposa. This is our Mobile application that ties our listiners into our radio station while on the Go!
Operations
Build
flutter build <platform>
Will build a release build for <platform>.
Running in Debug mode
With a device or devices connected:
flutter run <platform>
Will execute the application in the debugging sandbox.
Building and deploying in release mode (required for iOS launcher.)
Assumes the device is connected meaningfully to the session:
flutter build <platform> && flutter install
Flutter build tools
Renaming the app
dart run flutter_name_manager:rename_app --name "KRYZ Go!"
Updating the launcher icons
dart run flutter_launcher_icons
CI/CD Pipeline
This project uses Gitea Actions for continuous integration and release automation.
Pipeline Overview
┌─────────┐ ┌────────┐ ┌──────────────┐ ┌──────────────┐
│ Lint │───►│ Test │───►│ Build Android │ │ Build iOS │
│ │ │ │ │ (APK + AAB) │ │ (self-hosted)│
└─────────┘ └────────┘ └──────────────┘ └──────────────┘
│ │ │
▼ ▼ ▼
dart fmt flutter test flutter build ios
flutter analyze (--no-codesign fallback)
Workflows
CI (.gitea/workflows/ci.yml)
Triggers on:
- Push to
mainordevelop - Pull requests targeting
main
Stages:
- Lint —
dart format --fix+flutter analyze --fatal-warnings - Test —
flutter test(coverage on main branch pushes) - Build Android — APK + AAB release builds with artifact upload
- Build iOS —
flutter build ios --release --no-codesign(runs on self-hosted macOS runner)
Release (.gitea/workflows/release.yml)
Triggers on:
- Git tags matching
v*(e.g.,v1.0.0)
Stages:
- Lint —
dart format --set-exit-if-changed+flutter analyze --fatal-warnings - Test —
flutter test - Build Android Release — Signed APK + AAB
- Build iOS Release — Signed IPA (or
--no-codesignfallback) - Publish Release — Creates Gitea release + uploads artifacts
Configuration
| Secret | Required | Description |
|---|---|---|
ANDROID_KEYSTORE_BASE64 |
No | Base64-encoded Android release keystore |
ANDROID_KEYSTORE_PASS |
No | Keystore password |
ANDROID_KEY_ALIAS |
No | Key alias |
ANDROID_KEY_PASS |
No | Key password |
APPLE_CERTIFICATE_P12 |
No | Base64-encoded Apple signing certificate |
APPLE_CERTIFICATE_PASS |
No | Certificate password |
APPLE_PROVISION_PROFILE |
No | Base64-encoded provisioning profile |
GITEA_TOKEN |
Yes (Release) | Token for creating Gitea releases |
Without signing secrets, builds use debug keys or --no-codesign.
CI Status
Troubleshooting
- Stubs missing: The
ci_stub_gen.pyscript auto-generateslib/generated/*.dartstubs whentheme.jsonis absent. - macOS runner unavailable: The iOS stage uses
self-hostedlabel. Ensure a macOS Gitea runner is registered. - Format checks: CI uses
dart format --fix(auto-fix). Release uses--set-exit-if-changed(gate).
Languages
Dart
35.4%
Kotlin
19.1%
Python
13.1%
C++
12.9%
CMake
10.3%
Other
9.2%