|
| 1 | +# Eclipse Timer — Release Plan (Post v1.0.0) |
| 2 | + |
| 3 | +> Scope: all releases after the first manual Android launch. |
| 4 | +> Goal: use EAS for build, submit, and OTA updates with a repeatable checklist. |
| 5 | +
|
| 6 | +--- |
| 7 | + |
| 8 | +## Current Baseline |
| 9 | + |
| 10 | +- First public Android release is manual. |
| 11 | +- App version: `1.0.0`. |
| 12 | +- EAS project ID: `a29a7662-96be-4509-a79e-fbe4b5dac1ff`. |
| 13 | +- Build profile for stores: `production` in `apps/mobile/eas.json` (`autoIncrement: true`). |
| 14 | +- Runtime policy: `runtimeVersion` is tied to app version in `apps/mobile/app.json`. |
| 15 | + |
| 16 | +--- |
| 17 | + |
| 18 | +## Release Types |
| 19 | + |
| 20 | +1. **Store binary release** (`eas build` + `eas submit`): use when native code/config changes, SDK upgrades, permission changes, or store-required updates are included. |
| 21 | +2. **OTA JavaScript/content release** (`eas update`): use when only JS/TS/assets change and no native/runtime-version change is required. |
| 22 | + |
| 23 | +--- |
| 24 | + |
| 25 | +## Prerequisites (One-Time) |
| 26 | + |
| 27 | +- `EXPO_TOKEN` is available for CI and local CLI login is valid (`eas whoami`). |
| 28 | +- Google Play service account is configured for submit in `apps/mobile/eas.json` (or provided via EAS credentials). |
| 29 | +- Store listing metadata is kept current in: |
| 30 | + - `documents/store-metadata.md` |
| 31 | + - `documents/store-privacy-declarations.md` |
| 32 | +- Required checks pass locally: `pnpm typecheck`, `pnpm lint`, `pnpm test`. |
| 33 | + |
| 34 | +--- |
| 35 | + |
| 36 | +## Standard Store Release Flow |
| 37 | + |
| 38 | +### 1) Prepare release content |
| 39 | + |
| 40 | +- Update `CHANGELOG.md` with the new version section. |
| 41 | +- Draft release notes from changelog (same structure as `What's New`). |
| 42 | +- Confirm screenshots/feature graphic only if UI changed materially. |
| 43 | + |
| 44 | +### 2) Versioning |
| 45 | + |
| 46 | +- Bump app version in `apps/mobile/app.json` and `apps/mobile/package.json` (for example: `1.0.1`). |
| 47 | +- Keep `android.versionCode` and `ios.buildNumber` managed by EAS `production.autoIncrement` unless a manual override is needed. |
| 48 | + |
| 49 | +### 3) Run quality gates |
| 50 | + |
| 51 | +```bash |
| 52 | +pnpm typecheck |
| 53 | +pnpm lint |
| 54 | +pnpm test |
| 55 | +``` |
| 56 | + |
| 57 | +### 4) Build production binaries with EAS |
| 58 | + |
| 59 | +From repo root: |
| 60 | + |
| 61 | +```bash |
| 62 | +pnpm -C apps/mobile exec eas build --profile production --platform all |
| 63 | +``` |
| 64 | + |
| 65 | +Android-only: |
| 66 | + |
| 67 | +```bash |
| 68 | +pnpm -C apps/mobile exec eas build --profile production --platform android |
| 69 | +``` |
| 70 | + |
| 71 | +### 5) Submit via EAS |
| 72 | + |
| 73 | +Submit latest successful builds: |
| 74 | + |
| 75 | +```bash |
| 76 | +pnpm -C apps/mobile exec eas submit --platform all --latest |
| 77 | +``` |
| 78 | + |
| 79 | +Android-only: |
| 80 | + |
| 81 | +```bash |
| 82 | +pnpm -C apps/mobile exec eas submit --platform android --latest |
| 83 | +``` |
| 84 | + |
| 85 | +### 6) Play Console/App Store rollout |
| 86 | + |
| 87 | +- Set release notes from changelog-derived text. |
| 88 | +- For Android production, use staged rollout first when risk is medium/high. |
| 89 | +- Monitor crash-free users, ANR, and fatal issues before full rollout. |
| 90 | + |
| 91 | +### 7) Preferred automation path (GitHub Actions) |
| 92 | + |
| 93 | +- Use `.github/workflows/eas-build.yml` for repeatable release execution. |
| 94 | +- Trigger `workflow_dispatch` with: |
| 95 | + - `platform: android` or `all` |
| 96 | + - `submit: true` when ready to upload automatically after build |
| 97 | +- Keep `EXPO_TOKEN` and store credentials configured before using non-interactive submit. |
| 98 | + |
| 99 | +--- |
| 100 | + |
| 101 | +## OTA Release Flow (No Native Changes) |
| 102 | + |
| 103 | +Use only when native modules/config do not change and runtime remains compatible. |
| 104 | + |
| 105 | +```bash |
| 106 | +pnpm -C apps/mobile exec eas update --branch production --message "vX.Y.Z: short summary" |
| 107 | +``` |
| 108 | + |
| 109 | +Rules: |
| 110 | +- Do not use OTA for permission changes, Expo SDK upgrades, new native libs, or config requiring a rebuild. |
| 111 | +- If `runtimeVersion` must change, perform a full store binary release. |
| 112 | + |
| 113 | +--- |
| 114 | + |
| 115 | +## Suggested Cadence |
| 116 | + |
| 117 | +1. **Patch releases (`x.y.Z`)**: OTA first when safe; binary only if native fix is required. |
| 118 | +2. **Minor releases (`x.Y.0`)**: prefer full binary release for predictable rollout. |
| 119 | +3. **Major releases (`X.0.0`)**: full binary release with staged rollout and explicit release checklist signoff. |
| 120 | + |
| 121 | +--- |
| 122 | + |
| 123 | +## Rollback / Hotfix |
| 124 | + |
| 125 | +1. If OTA issue: publish a corrective OTA update immediately to `production`. |
| 126 | +2. If binary issue in staged rollout: halt rollout in Play Console/App Store Connect. |
| 127 | +3. If binary issue after full rollout: prepare hotfix version bump and run standard store release flow. |
| 128 | +4. Document incident in `CHANGELOG.md` and internal notes. |
| 129 | + |
| 130 | +--- |
| 131 | + |
| 132 | +## Quick Checklist (Per Release) |
| 133 | + |
| 134 | +- [ ] Changelog updated |
| 135 | +- [ ] Version updated (`app.json`, `package.json`) |
| 136 | +- [ ] Typecheck/lint/test passed |
| 137 | +- [ ] EAS build completed |
| 138 | +- [ ] EAS submit completed |
| 139 | +- [ ] Release notes entered in store consoles |
| 140 | +- [ ] Rollout started and monitored |
| 141 | +- [ ] Post-release verification done on physical Android + iOS devices |
0 commit comments