Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7747ea194c | ||
|
|
6570ad8a87 |
@@ -12,7 +12,7 @@ on:
|
||||
|
||||
# Cancel in-progress runs on new push to same branch
|
||||
concurrency:
|
||||
group: ${{ gitea.workflow }}-${{ gitea.ref }}
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
@@ -43,8 +43,8 @@ jobs:
|
||||
- name: Analyze Dart code
|
||||
run: flutter analyze --fatal-warnings
|
||||
|
||||
- name: Check formatting
|
||||
run: dart format --set-exit-if-changed lib/ test/
|
||||
- name: Auto-format source
|
||||
run: dart format lib/ test/
|
||||
|
||||
|
||||
# ── Stage 2: Unit & widget tests ─────────────────────────────────
|
||||
@@ -72,11 +72,11 @@ jobs:
|
||||
run: flutter test --reporter=expanded
|
||||
|
||||
- name: Run tests with coverage
|
||||
if: gitea.ref == 'refs/heads/main' && gitea.event_name == 'push'
|
||||
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
|
||||
run: flutter test --coverage
|
||||
|
||||
- name: Upload coverage report
|
||||
if: gitea.ref == 'refs/heads/main' && gitea.event_name == 'push'
|
||||
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: coverage-report
|
||||
@@ -189,12 +189,9 @@ jobs:
|
||||
|
||||
|
||||
# ── Stage 3 (parallel): iOS build ───────────────────────────────
|
||||
# Note: requires a macOS runner. Uses 'self-hosted' label which
|
||||
# matches our Gitea Actions runner. Falls back to --no-codesign
|
||||
# if Apple signing secrets are not configured.
|
||||
build-ios:
|
||||
name: Build iOS
|
||||
runs-on: self-hosted
|
||||
runs-on: macos-latest
|
||||
needs: [test]
|
||||
steps:
|
||||
- name: Checkout
|
||||
|
||||
@@ -159,12 +159,9 @@ jobs:
|
||||
|
||||
|
||||
# ── iOS release build ───────────────────────────────────────
|
||||
# Note: requires a macOS runner. Uses 'self-hosted' label which
|
||||
# matches our Gitea Actions runner. Falls back to --no-codesign
|
||||
# if Apple signing secrets are not configured.
|
||||
build-ios:
|
||||
name: Build iOS Release
|
||||
runs-on: self-hosted
|
||||
runs-on: macos-latest
|
||||
needs: [test]
|
||||
steps:
|
||||
- name: Checkout
|
||||
@@ -243,7 +240,7 @@ jobs:
|
||||
- name: Create Gitea Release
|
||||
env:
|
||||
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||
TAG: ${{ gitea.ref_name }}
|
||||
TAG: ${{ github.ref_name }}
|
||||
GITEA_BASE: https://git.westerntechnologies.duckdns.org
|
||||
run: |
|
||||
curl -s -X POST \
|
||||
@@ -255,7 +252,7 @@ jobs:
|
||||
- name: Upload APK to Release
|
||||
env:
|
||||
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||
TAG: ${{ gitea.ref_name }}
|
||||
TAG: ${{ github.ref_name }}
|
||||
GITEA_BASE: https://git.westerntechnologies.duckdns.org
|
||||
run: |
|
||||
curl -s -X POST \
|
||||
@@ -263,15 +260,3 @@ jobs:
|
||||
-H "Content-Type: application/vnd.android.package-archive" \
|
||||
--data-binary @app-release.apk \
|
||||
"$GITEA_BASE/api/v1/repos/kfj001/kryz-go-flutter/releases/assets?name=app-release.apk&tag_name=$TAG"
|
||||
|
||||
- name: Upload AAB to Release
|
||||
env:
|
||||
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||
TAG: ${{ gitea.ref_name }}
|
||||
GITEA_BASE: https://git.westerntechnologies.duckdns.org
|
||||
run: |
|
||||
curl -s -X POST \
|
||||
-H "Authorization: token $GITEA_TOKEN" \
|
||||
-H "Content-Type: application/octet-stream" \
|
||||
--data-binary @app-release.aab \
|
||||
"$GITEA_BASE/api/v1/repos/kfj001/kryz-go-flutter/releases/assets?name=app-release.aab&tag_name=$TAG"
|
||||
|
||||
@@ -13,7 +13,7 @@ Will build a release build for `<platform>`.
|
||||
## Running in Debug mode
|
||||
With a device or devices connected:
|
||||
|
||||
`flutter run <platform>`
|
||||
`flutter run <platform>`
|
||||
|
||||
Will execute the application in the debugging sandbox.
|
||||
|
||||
@@ -31,70 +31,3 @@ dart run flutter_name_manager:rename_app --name "KRYZ Go!"
|
||||
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 `main` or `develop`
|
||||
- Pull requests targeting `main`
|
||||
|
||||
Stages:
|
||||
1. **Lint** — `dart format --fix` + `flutter analyze --fatal-warnings`
|
||||
2. **Test** — `flutter test` (coverage on main branch pushes)
|
||||
3. **Build Android** — APK + AAB release builds with artifact upload
|
||||
4. **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:
|
||||
1. **Lint** — `dart format --set-exit-if-changed` + `flutter analyze --fatal-warnings`
|
||||
2. **Test** — `flutter test`
|
||||
3. **Build Android Release** — Signed APK + AAB
|
||||
4. **Build iOS Release** — Signed IPA (or `--no-codesign` fallback)
|
||||
5. **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.py` script auto-generates `lib/generated/*.dart` stubs when `theme.json` is absent.
|
||||
- **macOS runner unavailable**: The iOS stage uses `self-hosted` label. Ensure a macOS Gitea runner is registered.
|
||||
- **Format checks**: CI uses `dart format --fix` (auto-fix). Release uses `--set-exit-if-changed` (gate).
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ DEFAULT_APP_CONFIG = '''// GENERATED STUB — DO NOT EDIT.
|
||||
|
||||
class AppConfig {
|
||||
static const String callsign = 'KRYZ';
|
||||
static const String appName = 'KRYZ Go';
|
||||
static const String appName = 'KRYZ Go!';
|
||||
static const String tagline = '';
|
||||
static const String frequency = '';
|
||||
static const String streamUrl = '';
|
||||
|
||||
Reference in New Issue
Block a user