Skip to content

CI/CD

DiveSuite uses GitHub Actions for continuous integration and Expo Application Services (EAS) for builds and deployment.

Every push and pull request triggers the CI pipeline:

name: CI
on: [push, pull_request]
jobs:
docs: # Markdown linting
typescript: # Type check + lint + test
rust: # Cargo check + clippy + test
build: # Expo build verification
JobStatusNotes
docsActiveMarkdown linting
typescriptReadyUncomment when code exists
rustReadyUncomment when code exists
buildReadyUncomment when code exists

All quality gates must pass before merge:

GateRequirement
TypeScriptZero compiler errors
ESLintZero errors (warnings allowed temporarily)
TestsAll pass, no skipped safety tests
Deco EngineRust test suite passes
BuildExpo builds for all platforms
typescript:
name: TypeScript (Lint + Test)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: ".nvmrc"
cache: "npm"
- run: npm ci
- name: Type check
run: npx tsc --noEmit
- name: Lint
run: npx eslint . --max-warnings 0
- name: Unit tests
run: npm test -- --coverage
- name: Upload coverage
uses: actions/upload-artifact@v4
with:
name: ts-coverage
path: coverage/
rust:
name: Rust Deco Engine
runs-on: ubuntu-latest
defaults:
run:
working-directory: rust-engine
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
workspaces: rust-engine
- name: Check
run: cargo check
- name: Clippy
run: cargo clippy -- -D warnings
- name: Test
run: cargo test
- name: Build WASM
run: |
cargo install wasm-pack
wasm-pack build --target web
EnvironmentPurposeTrigger
DevLocal developmentnpx expo start
PreviewPR testingExpo Go
StagingPre-release testingEAS Build -> TestFlight/Internal
ProductionLive appEAS Build -> App Store/Play Store
Terminal window
# Development build
npx eas build --profile development --platform ios
# Preview build
npx eas build --profile preview --platform all
# Production build
npx eas build --profile production --platform all
{
"cli": {
"version": ">= 5.0.0"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"preview": {
"distribution": "internal"
},
"production": {}
},
"submit": {
"production": {}
}
}
graph LR
A[Feature Complete] --> B[Create Release Branch]
B --> C[Full Test Suite]
C --> D[Manual QA]
D --> E[EAS Build]
E --> F[TestFlight/Internal]
F --> G[Smoke Test]
G --> H[Submit to Stores]
H --> I[Monitor Crashes]
  1. Feature Complete — All planned features merged to main
  2. Create Release Branchrelease/v1.0.0
  3. Full Test Suite — CI passes, coverage meets targets
  4. Manual QA — Test on physical devices (iOS + Android)
  5. EAS Build — Production build for all platforms
  6. TestFlight/Internal — Submit to beta testers
  7. Smoke Test — Critical flows work on real devices
  8. Submit to Stores — App Store + Play Store submission
  9. Monitor — Watch crash reports, user feedback

MkDocs documentation deploys to GitHub Pages:

deploy-docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: '3.x'
- run: pip install mkdocs-material
- run: mkdocs gh-deploy --force

Required secrets in GitHub repository settings:

SecretPurpose
EXPO_TOKENEAS Build authentication
APPLE_API_KEYApp Store Connect
GOOGLE_SERVICE_ACCOUNTPlay Store
CODECOV_TOKENCoverage reporting

Main branch protection rules:

  • Require pull request reviews
  • Require status checks to pass
  • Require branches to be up to date
  • Require linear history (squash merge)