Skip to content

test(e2e): NL→SQL evals via AI gateway (gated by AI_GATEWAY_* envs) #15

test(e2e): NL→SQL evals via AI gateway (gated by AI_GATEWAY_* envs)

test(e2e): NL→SQL evals via AI gateway (gated by AI_GATEWAY_* envs) #15

Workflow file for this run

name: evals
on:
workflow_dispatch: {}
push:
branches: [main]
pull_request:
jobs:
evals:
runs-on: ubuntu-latest
permissions:
contents: read
env:
BRANCH_NAME: evals-${{ github.run_id }}-${{ github.sha }}
NEON_API_KEY: ${{ secrets.NEON_API_KEY }}
NEON_PROJECT_ID: ${{ vars.NEON_PROJECT_ID }}
NEON_DATABASE: ${{ vars.NEON_DATABASE || 'neondb' }}
NEON_ROLE: ${{ vars.NEON_ROLE || 'neondb_owner' }}
AI_GATEWAY_API_KEY: ${{ secrets.AI_GATEWAY_API_KEY || vars.AI_GATEWAY_API_KEY }}
AI_GATEWAY_MODEL: ${{ vars.AI_GATEWAY_MODEL }}
AI_GATEWAY_BASE_URL: ${{ vars.AI_GATEWAY_BASE_URL }}
steps:
- uses: actions/checkout@v4
- name: Create Neon branch
id: create-branch
if: ${{ env.NEON_API_KEY != '' && env.NEON_PROJECT_ID != '' }}
uses: neondatabase/create-branch-action@v6
with:
project_id: ${{ env.NEON_PROJECT_ID }}
branch_name: ${{ env.BRANCH_NAME }}
role: ${{ env.NEON_ROLE }}
api_key: ${{ env.NEON_API_KEY }}
- name: Install psql, jq, and neonctl
if: ${{ env.NEON_API_KEY != '' && env.NEON_PROJECT_ID != '' }}
run: |
sudo apt-get update
sudo apt-get install -y postgresql-client jq
npm i -g neonctl@latest
- name: Debug context
if: ${{ env.NEON_API_KEY != '' && env.NEON_PROJECT_ID != '' }}
run: |
echo "BRANCH_NAME=$BRANCH_NAME"
neonctl --version || true
- name: Get DATABASE_URL for the branch
id: cs
if: ${{ env.NEON_API_KEY != '' && env.NEON_PROJECT_ID != '' && steps.create-branch.outcome == 'success' }}
run: |
RAW=$(neonctl connection-string "$BRANCH_NAME" \
--project-id "$NEON_PROJECT_ID" \
--database-name "$NEON_DATABASE" \
--role-name "$NEON_ROLE" \
--api-key "$NEON_API_KEY" -o json 2>/dev/null || neonctl connection-string "$BRANCH_NAME" \
--project-id "$NEON_PROJECT_ID" \
--database-name "$NEON_DATABASE" \
--role-name "$NEON_ROLE" \
--api-key "$NEON_API_KEY")
if echo "$RAW" | jq -e . >/dev/null 2>&1; then
CONN=$(echo "$RAW" | jq -r '.connection_string // .connectionString // empty')
if [ -z "$CONN" ]; then
CONN="$RAW"
fi
else
CONN="$RAW"
fi
echo "DATABASE_URL=$CONN" >> "$GITHUB_OUTPUT"
- name: Assert DATABASE_URL is non-empty
if: ${{ env.NEON_API_KEY != '' && env.NEON_PROJECT_ID != '' }}
env:
DATABASE_URL: ${{ steps.cs.outputs.DATABASE_URL }}
run: |
if [ -z "$DATABASE_URL" ]; then
echo "DATABASE_URL is empty" >&2
exit 1
else
echo "DATABASE_URL is set"
fi
- name: Seed schema and data
if: ${{ env.NEON_API_KEY != '' && env.NEON_PROJECT_ID != '' && steps.cs.outputs.DATABASE_URL != '' }}
env:
DATABASE_URL: ${{ steps.cs.outputs.DATABASE_URL }}
run: |
psql -v ON_ERROR_STOP=1 "$DATABASE_URL" -f tests/schema.sql -f tests/seed.sql
- name: Setup Node
if: ${{ env.NEON_API_KEY != '' && env.NEON_PROJECT_ID != '' }}
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install deps
if: ${{ env.NEON_API_KEY != '' && env.NEON_PROJECT_ID != '' }}
run: npm ci
- name: Run evals
if: ${{ env.NEON_API_KEY != '' && env.NEON_PROJECT_ID != '' && hashFiles('tests/**/*.spec.*') != '' }}
env:
DATABASE_URL: ${{ steps.cs.outputs.DATABASE_URL }}
run: npm test
- name: Delete Neon branch
if: ${{ always() && env.NEON_API_KEY != '' && env.NEON_PROJECT_ID != '' }}
uses: neondatabase/delete-branch-action@v3
with:
project_id: ${{ env.NEON_PROJECT_ID }}
branch: ${{ env.BRANCH_NAME }}
api_key: ${{ env.NEON_API_KEY }}