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
Job Status Notes
docs Active Markdown linting
typescript Ready Uncomment when code exists
rust Ready Uncomment when code exists
build Ready Uncomment when code exists

All quality gates must pass before merge:

Gate Requirement
TypeScript Zero compiler errors
ESLint Zero errors (warnings allowed temporarily)
Tests All pass, no skipped safety tests
Deco Engine Rust test suite passes
Build Expo 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
Environment Purpose Trigger
Dev Local development npx expo start
Preview PR testing Expo Go
Staging Pre-release testing EAS Build -> TestFlight/Internal
Production Live app EAS 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 Branch – release/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:

Secret Purpose
EXPO_TOKEN EAS Build authentication
APPLE_API_KEY App Store Connect
GOOGLE_SERVICE_ACCOUNT Play Store
CODECOV_TOKEN Coverage 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)