Skip to content

chore: refresh QuickVoice deployments #310

chore: refresh QuickVoice deployments

chore: refresh QuickVoice deployments #310

Workflow file for this run

name: CI
on:
pull_request:
branches: [main]
push:
branches: [main]
workflow_call:
permissions:
contents: read
jobs:
workspace-config:
name: Workspace Config
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "24"
cache: "pnpm"
cache-dependency-path: "pnpm-lock.yaml"
- name: Install Node dependencies
run: pnpm install --frozen-lockfile
- name: Verify workspace tasks
run: pnpm check:tasks
- name: Verify shared configs
run: pnpm check:configs
root-tests:
name: Root Node Tests
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "24"
cache: "pnpm"
cache-dependency-path: "pnpm-lock.yaml"
- name: Install Node dependencies
run: pnpm install --frozen-lockfile
- name: Run root tests
run: node --test tests/*.test.mjs
console:
name: Console Lint, Types, Build, Tests
runs-on: ubuntu-latest
timeout-minutes: 40
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "24"
cache: "pnpm"
cache-dependency-path: "pnpm-lock.yaml"
- name: Install Node dependencies
run: pnpm install --frozen-lockfile
- name: Lint console
run: pnpm --filter console lint
- name: Typecheck console
run: pnpm --filter console check-types
- name: Build console
run: pnpm --filter console build
- name: Run console tests
run: node --test apps/console/tests/*.test.mjs
web:
name: Web Lint, Types, Build
runs-on: ubuntu-latest
timeout-minutes: 40
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "24"
cache: "pnpm"
cache-dependency-path: "pnpm-lock.yaml"
- name: Install Node dependencies
run: pnpm install --frozen-lockfile
- name: Lint web
run: pnpm --filter web lint
- name: Typecheck web
run: pnpm --filter web check-types
- name: Build web
run: pnpm --filter web build
docs:
name: Docs Lint, Types, Build
runs-on: ubuntu-latest
timeout-minutes: 40
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "24"
cache: "pnpm"
cache-dependency-path: "pnpm-lock.yaml"
- name: Install Node dependencies
run: pnpm install --frozen-lockfile
- name: Lint docs
run: pnpm --filter docs lint
- name: Typecheck docs
run: pnpm --filter docs check-types
- name: Build docs
run: pnpm --filter docs build
server:
name: Server Lint, Types, Build, Tests
runs-on: ubuntu-latest
timeout-minutes: 40
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "24"
cache: "pnpm"
cache-dependency-path: "pnpm-lock.yaml"
- name: Install Node dependencies
run: pnpm install --frozen-lockfile
- name: Generate Prisma client
run: pnpm --filter server exec prisma generate
env:
# Prisma config requires a syntactically valid URL during generation,
# but `prisma generate` does not connect to the database.
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/quickvoice_ci
- name: Lint server
run: pnpm --filter server lint
- name: Typecheck server
run: pnpm --filter server check-types
- name: Build server
run: pnpm --filter server build
- name: Run server tests
run: pnpm --filter server test
ai-python:
name: AI Python Tests
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: "pip"
cache-dependency-path: |
apps/ai/requirements.txt
apps/ai/requirements-dev.txt
- name: Install Python dependencies
working-directory: apps/ai
run: |
python -m pip install --upgrade pip
python -m pip install -r requirements-dev.txt
- name: Audit Python dependencies
working-directory: apps/ai
run: python -m pip_audit --local
- name: Run AI tests
working-directory: apps/ai
run: python -m pytest tests -W error
docker-server:
name: Server Docker Validate
runs-on: ubuntu-latest
timeout-minutes: 40
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build server image target
shell: bash
run: |
set -euo pipefail
for attempt in 1 2 3; do
if docker build \
--target build \
--tag quickvoice-server:ci \
--file apps/server/Dockerfile \
.; then
exit 0
fi
echo "Docker server build failed on attempt ${attempt}; retrying after transient registry/network failure..."
sleep $((attempt * 20))
done
exit 1
docker-ai:
name: AI Docker Validate
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Build AI image
shell: bash
run: |
set -euo pipefail
for attempt in 1 2 3; do
if docker build \
--build-arg PREINSTALL_CPU_TORCH=true \
--build-arg SKIP_MODEL_DOWNLOAD=true \
--tag quickvoice-ai:ci \
--file apps/ai/Dockerfile \
apps/ai; then
exit 0
fi
echo "Docker AI build failed on attempt ${attempt}; retrying after transient registry/network failure..."
sleep $((attempt * 20))
done
exit 1
quality-summary:
name: Quality Summary
runs-on: ubuntu-latest
timeout-minutes: 10
if: always()
needs:
- workspace-config
- root-tests
- console
- web
- docs
- server
- ai-python
- docker-server
- docker-ai
steps:
- name: Write quality gate summary
run: |
{
echo "## Quality gate"
echo "- Workspace config: ${{ needs.workspace-config.result }}"
echo "- Root tests: ${{ needs.root-tests.result }}"
echo "- Console: ${{ needs.console.result }}"
echo "- Web: ${{ needs.web.result }}"
echo "- Docs: ${{ needs.docs.result }}"
echo "- Server: ${{ needs.server.result }}"
echo "- AI Python: ${{ needs.ai-python.result }}"
echo "- Server Docker: ${{ needs.docker-server.result }}"
echo "- AI Docker: ${{ needs.docker-ai.result }}"
} >> "$GITHUB_STEP_SUMMARY"
- name: Fail if any quality job failed
run: |
set -euo pipefail
for result in \
"${{ needs.workspace-config.result }}" \
"${{ needs.root-tests.result }}" \
"${{ needs.console.result }}" \
"${{ needs.web.result }}" \
"${{ needs.docs.result }}" \
"${{ needs.server.result }}" \
"${{ needs.ai-python.result }}" \
"${{ needs.docker-server.result }}" \
"${{ needs.docker-ai.result }}"; do
if [ "$result" != "success" ]; then
echo "Quality job result was ${result}"
exit 1
fi
done