chore: refresh QuickVoice deployments #310
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |