Skip to content

chore: Add babel-preset-expo to lockfile for EAS build resolution #647

chore: Add babel-preset-expo to lockfile for EAS build resolution

chore: Add babel-preset-expo to lockfile for EAS build resolution #647

Workflow file for this run

name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
# Cancel in-progress runs on the same branch/PR
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
NODE_VERSION: '22'
PNPM_VERSION: '9'
jobs:
# ─── Job 1: Lint & Type Check ─────────────────────────────────────────────
lint-typecheck:
name: Lint & Type Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ env.PNPM_VERSION }}
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: pnpm
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: TypeScript check
# NOTE: There is a known duplicate 'txa' key in
# server/_core/embeddings/medical-terms.ts that causes a TS error.
# This is tracked and intentionally left as a warning for now.
# When it's fixed, remove the `|| true` and let this fail hard.
run: pnpm check || true
- name: Lint
run: pnpm lint
env:
NODE_ENV: test
# ─── Job 2: Build Check ───────────────────────────────────────────────────
build:
name: Build Check
runs-on: ubuntu-latest
needs: lint-typecheck
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ env.PNPM_VERSION }}
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: pnpm
- name: Install root dependencies
run: pnpm install --frozen-lockfile
- name: Build server (esbuild)
# Runs the esbuild bundle defined in the root package.json `build` script
run: pnpm run build
env:
NODE_ENV: production
- name: Install landing page dependencies
run: pnpm install --frozen-lockfile
working-directory: landing
- name: Build landing page (Vite)
run: pnpm run build
working-directory: landing
env:
NODE_ENV: production
- name: Upload server dist artifact
uses: actions/upload-artifact@v4
with:
name: server-dist
path: dist/
retention-days: 3
# ─── Job 3: Search Accuracy Gate ─────────────────────────────────────────
# Only runs on PRs that touch server/_core/ — skip on push to main to save time
search-accuracy-gate:
name: Search Accuracy Gate (50-query smoke test)
runs-on: ubuntu-latest
# Only trigger when server core files change
if: |
github.event_name == 'pull_request' &&
contains(toJson(github.event.pull_request.changed_files), 'server/_core/')
needs: build
services:
# Postgres needed by the server at startup
postgres:
image: postgres:16
env:
POSTGRES_USER: protocol
POSTGRES_PASSWORD: protocol
POSTGRES_DB: protocol_test
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: ${{ env.PNPM_VERSION }}
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: pnpm
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download server dist
uses: actions/download-artifact@v4
with:
name: server-dist
path: dist/
- name: Start server in background
run: node dist/index.js &
env:
NODE_ENV: production
PORT: 3000
DATABASE_URL: postgres://protocol:protocol@localhost:5432/protocol_test
SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
SUPABASE_SERVICE_ROLE_KEY: ${{ secrets.SUPABASE_SERVICE_ROLE_KEY }}
VOYAGE_API_KEY: ${{ secrets.VOYAGE_API_KEY }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
- name: Wait for server to be ready
run: |
for i in $(seq 1 30); do
curl -sf http://localhost:3000/health && break
echo "Waiting for server... attempt $i"
sleep 2
done
- name: Run 50-query smoke test
run: node scripts/ci-smoke-test.mjs
env:
SERVER_URL: http://localhost:3000
# ─── Job 4: Deploy notification ──────────────────────────────────────────
deploy-notify:
name: Railway Deploy Notification
runs-on: ubuntu-latest
needs: build
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
steps:
- uses: actions/checkout@v4
- name: Post deploy trigger comment
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const sha = context.sha.slice(0, 7);
const runUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`;
await github.rest.repos.createCommitStatus({
owner: context.repo.owner,
repo: context.repo.repo,
sha: context.sha,
state: 'success',
target_url: runUrl,
description: `CI passed — Railway deploy triggered for ${sha}`,
context: 'railway/deploy-trigger',
});
console.log(`Deploy status posted for ${sha}`);