Skip to main content

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:

  1. Updates version using npm run version:date
  2. Builds the application
  3. Deploys to Firebase Hosting
  4. 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:

  1. TypeScript type check
  2. ESLint
  3. Unit tests

This catches issues locally before using CI minutes.

GitHub Secrets Required

SecretDescription
FIREBASE_SERVICE_ACCOUNTFirebase service account JSON for deployment

Setting up Firebase Service Account

  1. Go to Firebase Console → Project Settings → Service Accounts
  2. Click "Generate new private key"
  3. Download the JSON file
  4. Add to GitHub: Settings → Secrets → Actions → New repository secret
  5. Name: FIREBASE_SERVICE_ACCOUNT
  6. 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