Skip to content

Resolve merge conflicts in common.ts with envVars + emulator support #3245

Resolve merge conflicts in common.ts with envVars + emulator support

Resolve merge conflicts in common.ts with envVars + emulator support #3245

name: DB migration compat
on:
push:
branches-ignore:
- main
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/dev' }}
jobs:
check-migrations-changed:
name: Check if migrations changed
runs-on: ubuntu-latest
outputs:
migrations_changed: ${{ steps.check-diff.outputs.migrations_changed }}
base_branch: ${{ steps.check-diff.outputs.base_branch }}
steps:
- name: Checkout current branch
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Check for migration changes
id: check-diff
run: |
# Determine base branch: dev compares to main, all others compare to dev
if [ "${{ github.ref }}" = "refs/heads/dev" ]; then
BASE_BRANCH="main"
else
BASE_BRANCH="dev"
fi
echo "base_branch=$BASE_BRANCH" >> $GITHUB_OUTPUT
# Get the merge base with the base branch
git fetch origin $BASE_BRANCH
MERGE_BASE=$(git merge-base HEAD origin/$BASE_BRANCH)
# Check if there are any changes in the migrations folder
if git diff --quiet "$MERGE_BASE" HEAD -- apps/backend/prisma/migrations/; then
echo "No changes in migrations folder"
echo "migrations_changed=false" >> $GITHUB_OUTPUT
else
echo "Migrations have changed"
echo "migrations_changed=true" >> $GITHUB_OUTPUT
fi
backwards-compatibility:
name: Back-compat — Current branch migrations with ${{ needs.check-migrations-changed.outputs.base_branch }} branch code
needs: check-migrations-changed
if: needs.check-migrations-changed.outputs.migrations_changed == 'true'
runs-on: ubicloud-standard-8
env:
NODE_ENV: test
STACK_ENABLE_HARDCODED_PASSKEY_CHALLENGE_FOR_TESTING: yes
STACK_DATABASE_CONNECTION_STRING: "postgres://postgres:PASSWORD-PLACEHOLDER--uqfEC1hmmv@localhost:8128/stackframe"
steps:
# First, checkout the current branch to get its migrations
- name: Checkout current branch
uses: actions/checkout@v6
with:
path: current-branch
# Save the migrations folder from the current branch
- name: Save current branch migrations
run: |
mkdir -p saved-migrations
cp -r current-branch/apps/backend/prisma/migrations/* saved-migrations/
# Now checkout base branch (main for dev, dev for all others)
- name: Checkout base branch
uses: actions/checkout@v6
with:
ref: ${{ needs.check-migrations-changed.outputs.base_branch }}
path: base-branch
# Move base-branch to the root for the rest of the workflow (keep base's migrations for now)
- name: Setup working directory
run: |
shopt -s dotglob
mv base-branch/* .
rm -rf base-branch current-branch
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 22.x
- name: Setup pnpm
uses: pnpm/action-setup@v4
# Start Docker Compose in the background
- name: Start Docker Compose in background
uses: JarvusInnovations/background-action@v1.0.7
with:
run: docker compose -f docker/dependencies/docker.compose.yaml up --pull always -d &
wait-on: /dev/null
tail: true
wait-for: 3s
log-output-if: true
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Create .env.test.local file for apps/backend
run: cp apps/backend/.env.development apps/backend/.env.test.local
- name: Create .env.test.local file for apps/dashboard
run: cp apps/dashboard/.env.development apps/dashboard/.env.test.local
- name: Create .env.test.local file for apps/e2e
run: cp apps/e2e/.env.development apps/e2e/.env.test.local
- name: Create .env.test.local file for docs
run: cp docs/.env.development docs/.env.test.local
- name: Create .env.test.local file for examples/cjs-test
run: cp examples/cjs-test/.env.development examples/cjs-test/.env.test.local
- name: Create .env.test.local file for examples/demo
run: cp examples/demo/.env.development examples/demo/.env.test.local
- name: Create .env.test.local file for examples/docs-examples
run: cp examples/docs-examples/.env.development examples/docs-examples/.env.test.local
- name: Create .env.test.local file for examples/e-commerce
run: cp examples/e-commerce/.env.development examples/e-commerce/.env.test.local
- name: Create .env.test.local file for examples/middleware
run: cp examples/middleware/.env.development examples/middleware/.env.test.local
- name: Create .env.test.local file for examples/supabase
run: cp examples/supabase/.env.development examples/supabase/.env.test.local
- name: Create .env.test.local file for examples/convex
run: cp examples/convex/.env.development examples/convex/.env.test.local
- name: Build
run: pnpm build
- name: Wait on Postgres
run: pnpm run wait-until-postgres-is-ready:pg_isready
- name: Wait on Inbucket
run: pnpm exec wait-on tcp:localhost:8129
- name: Wait on Svix
run: pnpm exec wait-on tcp:localhost:8113
- name: Wait on ClickHouse
run: pnpm exec wait-on http://localhost:8136/ping
- name: Initialize database
run: pnpm run db:init
- name: Start stack-backend in background
uses: JarvusInnovations/background-action@v1.0.7
with:
run: pnpm run start:backend --log-order=stream &
wait-on: |
http://localhost:8102
tail: true
wait-for: 30s
log-output-if: true
- name: Start stack-dashboard in background
uses: JarvusInnovations/background-action@v1.0.7
with:
run: pnpm run start:dashboard --log-order=stream &
wait-on: |
http://localhost:8101
tail: true
wait-for: 30s
log-output-if: true
- name: Start mock-oauth-server in background
uses: JarvusInnovations/background-action@v1.0.7
with:
run: pnpm run start:mock-oauth-server --log-order=stream &
wait-on: |
http://localhost:8102
tail: true
wait-for: 30s
log-output-if: true
- name: Start run-email-queue in background
uses: JarvusInnovations/background-action@v1.0.7
with:
run: pnpm -C apps/backend run run-email-queue --log-order=stream &
wait-on: |
http://localhost:8102
tail: true
wait-for: 30s
log-output-if: true
- name: Start run-cron-jobs in background
uses: JarvusInnovations/background-action@v1.0.7
if: ${{ hashFiles('apps/backend/scripts/run-cron-jobs.ts') != '' }}
with:
run: pnpm -C apps/backend run with-env:dev tsx scripts/run-cron-jobs.ts --log-order=stream &
wait-on: |
http://localhost:8102
tail: true
wait-for: 30s
log-output-if: true
- name: Wait 10 seconds
run: sleep 10
# First test run: base branch with base's migrations
- name: Run tests (base branch with original migrations)
run: pnpm test
# Now copy over current branch's migrations and run migrate
- name: Replace migrations with current branch migrations
run: |
rm -rf apps/backend/prisma/migrations/*
cp -r saved-migrations/* apps/backend/prisma/migrations/
rm -rf saved-migrations
- name: Run database migrations
run: pnpm run db:migrate
# Second test run: base branch code with new migrations applied
- name: Run tests (base branch with new migrations)
run: pnpm test
- name: Verify data integrity
run: pnpm run verify-data-integrity --no-bail
- name: Print Docker Compose logs
if: always()
run: docker compose -f docker/dependencies/docker.compose.yaml logs
forward-compatibility:
name: Forward-compat — Current branch code with ${{ needs.check-migrations-changed.outputs.base_branch }} branch migrations
needs: [check-migrations-changed, backwards-compatibility]
if: always() && needs.backwards-compatibility.result == 'failure'
runs-on: ubicloud-standard-8
env:
NODE_ENV: test
STACK_ENABLE_HARDCODED_PASSKEY_CHALLENGE_FOR_TESTING: yes
STACK_DATABASE_CONNECTION_STRING: "postgres://postgres:PASSWORD-PLACEHOLDER--uqfEC1hmmv@localhost:8128/stackframe"
steps:
# First, checkout the base branch to get its migrations
- name: Checkout base branch
uses: actions/checkout@v6
with:
ref: ${{ needs.check-migrations-changed.outputs.base_branch }}
path: base-branch
- name: Save base branch migrations
run: |
mkdir -p saved-migrations
cp -r base-branch/apps/backend/prisma/migrations/* saved-migrations/
# Now checkout current branch (new code)
- name: Checkout current branch
uses: actions/checkout@v6
with:
path: current-branch
# Move current branch to the root for the rest of the workflow
- name: Setup working directory
run: |
shopt -s dotglob
mv current-branch/* .
rm -rf current-branch base-branch
# Replace current branch's migrations with base branch's (old) migrations
- name: Replace migrations with base branch migrations
run: |
rm -rf apps/backend/prisma/migrations/*
cp -r saved-migrations/* apps/backend/prisma/migrations/
rm -rf saved-migrations
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 22.x
- name: Setup pnpm
uses: pnpm/action-setup@v4
# Start Docker Compose in the background
- name: Start Docker Compose in background
uses: JarvusInnovations/background-action@v1.0.7
with:
run: docker compose -f docker/dependencies/docker.compose.yaml up --pull always -d &
wait-on: /dev/null
tail: true
wait-for: 3s
log-output-if: true
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Create .env.test.local file for apps/backend
run: cp apps/backend/.env.development apps/backend/.env.test.local
- name: Create .env.test.local file for apps/dashboard
run: cp apps/dashboard/.env.development apps/dashboard/.env.test.local
- name: Create .env.test.local file for apps/e2e
run: cp apps/e2e/.env.development apps/e2e/.env.test.local
- name: Create .env.test.local file for docs
run: cp docs/.env.development docs/.env.test.local
- name: Create .env.test.local file for examples/cjs-test
run: cp examples/cjs-test/.env.development examples/cjs-test/.env.test.local
- name: Create .env.test.local file for examples/demo
run: cp examples/demo/.env.development examples/demo/.env.test.local
- name: Create .env.test.local file for examples/docs-examples
run: cp examples/docs-examples/.env.development examples/docs-examples/.env.test.local
- name: Create .env.test.local file for examples/e-commerce
run: cp examples/e-commerce/.env.development examples/e-commerce/.env.test.local
- name: Create .env.test.local file for examples/middleware
run: cp examples/middleware/.env.development examples/middleware/.env.test.local
- name: Create .env.test.local file for examples/supabase
run: cp examples/supabase/.env.development examples/supabase/.env.test.local
- name: Create .env.test.local file for examples/convex
run: cp examples/convex/.env.development examples/convex/.env.test.local
- name: Build
run: pnpm build
- name: Wait on Postgres
run: pnpm run wait-until-postgres-is-ready:pg_isready
- name: Wait on Inbucket
run: pnpm exec wait-on tcp:localhost:8129
- name: Wait on Svix
run: pnpm exec wait-on tcp:localhost:8113
- name: Wait on ClickHouse
run: pnpm exec wait-on http://localhost:8136/ping
- name: Initialize database
run: pnpm run db:init
- name: Start stack-backend in background
uses: JarvusInnovations/background-action@v1.0.7
with:
run: pnpm run start:backend --log-order=stream &
wait-on: |
http://localhost:8102
tail: true
wait-for: 30s
log-output-if: true
- name: Start stack-dashboard in background
uses: JarvusInnovations/background-action@v1.0.7
with:
run: pnpm run start:dashboard --log-order=stream &
wait-on: |
http://localhost:8101
tail: true
wait-for: 30s
log-output-if: true
- name: Start mock-oauth-server in background
uses: JarvusInnovations/background-action@v1.0.7
with:
run: pnpm run start:mock-oauth-server --log-order=stream &
wait-on: |
http://localhost:8102
tail: true
wait-for: 30s
log-output-if: true
- name: Start run-email-queue in background
uses: JarvusInnovations/background-action@v1.0.7
with:
run: pnpm -C apps/backend run run-email-queue --log-order=stream &
wait-on: |
http://localhost:8102
tail: true
wait-for: 30s
log-output-if: true
- name: Start run-cron-jobs in background
uses: JarvusInnovations/background-action@v1.0.7
if: ${{ hashFiles('apps/backend/scripts/run-cron-jobs.ts') != '' }}
with:
run: pnpm -C apps/backend run with-env:dev tsx scripts/run-cron-jobs.ts --log-order=stream &
wait-on: |
http://localhost:8102
tail: true
wait-for: 30s
log-output-if: true
- name: Wait 10 seconds
run: sleep 10
# Run tests: current branch code with base branch (old) migrations
- name: Run tests (current branch code with base branch migrations)
run: pnpm test
- name: Verify data integrity
run: pnpm run verify-data-integrity --no-bail
- name: Print Docker Compose logs
if: always()
run: docker compose -f docker/dependencies/docker.compose.yaml logs
# This job runs when migrations haven't changed, ensuring the workflow succeeds
skip-unchanged:
name: No migration changes (skipped)
needs: check-migrations-changed
if: needs.check-migrations-changed.outputs.migrations_changed == 'false'
runs-on: ubuntu-latest
steps:
- name: No migration changes detected
run: echo "No changes to migrations folder detected. Skipping backwards compatibility test."