CI/CD Pipeline
Last Verified: February 2026
This guide documents the continuous integration and deployment pipelines for the Equa platform. Each repository has its own CI configuration with different deployment targets.
Pipeline Overview
GitHub Actions Workflows
| Repository | Workflow File | Triggers | Jobs |
|---|
| equa-web | .github/workflows/e2e-tests.yml | Push/PR to main, master, develop, feat/** | E2E tests, regression tests |
| equa-server | .github/workflows/ci.yml | Push to main, staging, prod-deploy; PRs to main/staging | build, test, docker-build |
| equabot-gateway | (Vitest in CI) | Push to main | lint, build, test (with coverage thresholds) |
Source: GitHub Actions workflow files in each repository
equa-web CI
File: .github/workflows/e2e-tests.yml
Two jobs run on every push/PR:
E2E Tests Job
- Runner: ubuntu-latest
- Node version: 18
- Timeout: 30 minutes
- Steps: Install deps -> start webpack dev server -> run Playwright tests
- On failure: Uploads test results and screenshots as artifacts
Regression Tests Job
- Timeout: 20 minutes
- Runs: Specific regression test files targeting previously fixed issues
Source: equa-web/.github/workflows/e2e-tests.yml
equa-server CI
File: .github/workflows/ci.yml
Three jobs:
Build Job
- Runner: ubuntu-latest
- Node version: 18
- Steps: Install deps -> compile TypeScript (
yarn tsc && yarn tsa)
- Note: Tests continue on error (
continue-on-error: true)
Test Job
- Steps: Install deps -> run tests (
yarn test:api)
- Continues on error so Docker build can proceed even if tests fail
Docker Build Job
- Steps: Build Docker image -> verify compiled files exist
- Does not push — only validates the image builds correctly
Source: equa-server/.github/workflows/ci.yml
Deployment Targets
Google Cloud Run (equa-server production)
Config: equa-server/cloudbuild.yaml
Cloud Build steps:
- Build Docker image
- Push to Container Registry
- Deploy to Cloud Run
Cloud Run configuration:
| Setting | Value |
|---|
| Region | us-central1 |
| Port | 3000 |
| Memory | 1Gi |
| CPU | 1 |
| Min instances | 1 |
| Max instances | 10 |
| Request timeout | 300s |
| Startup CPU boost | Enabled |
Source: equa-server/cloudbuild.yaml
Railway (equa-web and equa-server)
Both equa-web and equa-server have Railway deployment configs:
equa-server (railway.toml):
[build]
builder = "nixpacks"
[deploy]
startCommand = "npm run start:api"
healthcheckPath = "/health"
healthcheckTimeout = 300
restartPolicyType = "on_failure"
restartPolicyMaxRetries = 3
equa-web (railway.toml):
[build]
builder = "nixpacks"
[deploy]
startCommand = "npm run start"
healthcheckPath = "/"
Source: equa-server/railway.toml, equa-web/railway.toml
PM2 (equa-server traditional hosting)
Config: equa-server/ecosystem.config.js
PM2 manages the production process with two apps:
api — the main API server
raven-addresses — the Raven address service
The production Docker image uses PM2 as its runtime (pm2-runtime start ecosystem.config.js --only api).
Source: equa-server/ecosystem.config.js
Docker Configuration
File: equa-server/Dockerfile
Multi-stage build using Node 18 Alpine:
| Stage | Purpose |
|---|
| Build | Install all deps, compile TypeScript |
| Production | Copy compiled output, install production deps only, run via PM2 |
Key details:
- Base image:
node:18-alpine
- Health check: HTTP GET to port 3000
- Entry point:
pm2-runtime start ecosystem.config.js --only api
Source: equa-server/Dockerfile
The general flow for deploying changes:
feature branch → PR → main/staging → production
equa-server
- Develop on feature branch
- PR to
staging — CI runs build + test
- Merge to
staging — deploys to staging environment (Railway)
- After verification, push/merge to
prod-deploy branch — triggers Cloud Build -> Cloud Run
equa-web
- Develop on feature branch
- PR to
main or staging — CI runs E2E tests
- Merge — deploys to Railway
Secrets management is handled via environment variables in the deployment platform (Railway dashboard, Cloud Run service config, or GitHub Secrets for CI). There is no centralized secrets management tool. Secrets are configured per-environment and are not documented in code.
Health Checks
| Service | Endpoint | Configured In |
|---|
| equa-server (Railway) | GET /health | railway.toml |
| equa-server (Cloud Run) | Port 3000 startup probe | cloudbuild.yaml |
| equa-web (Railway) | GET / | railway.toml |
Environments
| Environment | equa-web URL | equa-server URL | Deploy Trigger |
|---|
| Local dev | http://localhost:8080 | http://localhost:3000 | Manual |
| Staging | staging.app.equa.cc | staging.api.equa.cc | Merge to staging |
| Production | app.equa.cc | api.equa.cc | Merge to prod-deploy / main |