CI/CD Pipeline
Kuviq uses GitHub Actions for continuous integration and deployment.
Current Metrics (January 2026):
- 374 test files
- 5,940 passing tests, 122 skipped
- Full CI run: ~5 minutes
- Automatic deployment on push to main/master
Pipeline Overview
Push to main/master
↓
┌─────────────────────────────────────┐
│ Parallel Jobs: │
│ - lint (ESLint) │
│ - typecheck (TypeScript) │
│ - test-unit │
│ - test-integration │
│ - test-api (MSW) │
│ - test-e2e (Playwright) │
└─────────────────────────────────────┘
↓
build (after lint + typecheck)
↓
lighthouse (performance audit)
↓
ci-success (all checks passed)
↓
deploy (only on main/master push)
↓
Version bump + Firebase deploy
Jobs
Lint
Runs ESLint to check code quality and formatting.
Type Check
Runs TypeScript compiler (tsc --noEmit) to verify types.
Test Jobs
- test-unit: Vitest unit tests
- test-integration: Vitest integration tests
- test-api: MSW-based API mocking tests
- test-e2e: Playwright browser tests
Build
Builds the production application to verify it compiles successfully.
Lighthouse
Runs Lighthouse CI to audit:
- Performance (target: 85%)
- Accessibility (target: 95%)
- Best Practices (target: 95%)
- SEO (target: 95%)
Deploy
Only runs on pushes to main or master branch:
- Updates version using
npm run version:date - Builds the application
- Deploys to Firebase Hosting
- Pushes version commit back to repository
Local Hooks
Pre-commit Hook
Checks test files follow project standards (using renderWithTheme).
Pre-push Hook
Runs before every git push:
- TypeScript type check
- ESLint
- Unit tests
This catches issues locally before using CI minutes.
GitHub Secrets Required
| Secret | Description |
|---|---|
FIREBASE_SERVICE_ACCOUNT | Firebase service account JSON for deployment |
Setting up Firebase Service Account
- Go to Firebase Console → Project Settings → Service Accounts
- Click "Generate new private key"
- Download the JSON file
- Add to GitHub: Settings → Secrets → Actions → New repository secret
- Name:
FIREBASE_SERVICE_ACCOUNT - Value: Paste entire JSON contents
Workflow File
The CI configuration is in .github/workflows/ci.yml.
Skipping CI
To skip CI for a commit (e.g., documentation-only changes):
git commit -m "docs: update readme [skip ci]"
Monitoring
- View pipeline status: GitHub repo → Actions tab
- Lighthouse reports: Available as artifacts on failed runs
- Playwright reports: Available as artifacts on failed runs