Neon database client migration #1109
This file contains 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: Validate | |
on: | |
push: {branches: [main, production]} | |
pull_request: | |
jobs: | |
main: | |
name: Run type checks, lint, and tests | |
runs-on: ubuntu-latest | |
timeout-minutes: 15 | |
env: | |
NODE_OPTIONS: --max-old-space-size=4096 | |
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} | |
DATABASE_URL: postgres://postgres:[email protected]:5432/postgres | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Set up Docker | |
uses: docker/setup-buildx-action@v3 | |
- name: Start Docker services | |
run: docker compose up -d | |
- name: Install Node.js | |
uses: actions/setup-node@v3 | |
with: | |
node-version: 20 # TODO: Can we get this from "engine" field in package.json? | |
- uses: pnpm/action-setup@v4 | |
name: Install pnpm | |
id: pnpm-install | |
with: | |
version: 9.9.0 # Ideally we should get this from engine field too... | |
run_install: false | |
- name: Get pnpm store directory | |
id: pnpm-cache | |
run: | | |
echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT | |
- name: Setup pnpm cache | |
uses: actions/cache@v3 | |
with: | |
path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} | |
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} | |
restore-keys: | | |
${{ runner.os }}-pnpm-store- | |
- name: Install dependencies | |
run: pnpm install --frozen-lockfile | |
# - name: Set up tmate session | |
# uses: mxschmitt/action-tmate@v2 | |
# - name: Setup upterm session | |
# uses: lhotari/action-upterm@v1 | |
- name: Run type checks | |
run: pnpm run typecheck | |
- name: Run lint | |
run: pnpm run lint | |
- name: Download dev env vars from Vercel | |
run: | | |
npm install --global vercel@latest | |
vercel link --token $VERCEL_TOKEN --scope openint-dev --yes | |
vercel env pull --token $VERCEL_TOKEN ./apps/web/.env.local | |
- name: Ensure OpenAPI spec and docs are up to date | |
run: pnpm --dir ./kits/sdk run gen && pnpm --dir ./docs generate && git diff --exit-code | |
- name: Run migration and store the completed schema | |
# TODO: consider diffing schema with stored schema? | |
# Perhaps make dump and diff one of the code generation next steps? | |
run: | | |
pnpm migrate | |
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' | |
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - | |
sudo apt-get update | |
sudo apt-get install -y postgresql-client-17 | |
mkdir -p ./artifacts | |
/usr/lib/postgresql/17/bin/pg_dump $DATABASE_URL --inserts > ./artifacts/dump.sql | |
/usr/lib/postgresql/17/bin/pg_dump $DATABASE_URL --inserts --data-only --table __drizzle_migrations | |
- name: Archive migration artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: migration-artifacts | |
path: | | |
./artifacts | |
# To test this with a locally install postgres, run | |
# psql postgres -c 'drop database if exists test;' && psql postgres -c 'create database test;' && DATABASE_URL=postgres://localhost:5432/test pnpm migrate | |
- name: Run health check | |
run: MOCK_HEALTHCHECK=true NANGO_SECRET_KEY=noop JWT_SECRET=NOOP npx tsx ./bin/openint.ts health | |
- name: Start dev server in background | |
run: | | |
pnpm run web --port 4000 & | |
pnpm wait-on tcp:4000 | |
- name: Start inngest dev server in background | |
run: | | |
npx inngest-cli@latest dev & | |
pnpm wait-on tcp:8288 | |
- name: Run tests | |
run: ./bin/shdotenv -e ./apps/web/.env.local pnpm run test::ci | |
- name: Send Slack notification for job status | |
uses: 8398a7/action-slack@v3 | |
with: | |
status: ${{ job.status }} | |
fields: repo,message,commit,author,action,eventName,ref,workflow,job,took,pullRequest # selectable (default: repo,message) | |
env: | |
SLACK_WEBHOOK_URL: ${{ secrets.SLATIFY_SLACK_WEBHOOK_URL }} # required | |
if: ${{ env.SLACK_WEBHOOK_URL != '' && always() }} # Pick up events even if the job fails or is canceled. |