name: CI on: push: branches: [main] pull_request: branches: [main] jobs: ci: name: Lint, Typecheck, Test & Build runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Install dependencies run: npm ci - name: Generate Prisma client run: npx prisma generate --generator client - name: Lint run: npm run lint - name: Typecheck run: npx tsc --noEmit - name: Prisma validate run: npx prisma validate - name: Test run: npm test - name: Build run: npm run build env: DATABASE_URL: ${{ secrets.DATABASE_URL }} DIRECT_URL: ${{ secrets.DIRECT_URL }} SESSION_SECRET: ${{ secrets.SESSION_SECRET }} deploy-preview: name: Deploy Preview (PR) runs-on: ubuntu-latest needs: ci if: github.event_name == 'pull_request' steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Install dependencies run: npm ci - name: Install Vercel CLI run: npm install -g vercel@latest - name: Deploy Preview to Vercel run: vercel deploy --token=${{ secrets.VERCEL_TOKEN }} env: VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} deploy-production: name: Deploy Production (main) runs-on: ubuntu-latest needs: ci if: github.ref == 'refs/heads/main' && github.event_name == 'push' steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Install dependencies run: npm ci - name: Install Vercel CLI run: npm install -g vercel@latest - name: Run database migrations run: npx prisma migrate deploy env: DATABASE_URL: ${{ secrets.DATABASE_URL }} DIRECT_URL: ${{ secrets.DIRECT_URL }} - name: Deploy Production to Vercel run: vercel deploy --prod --token=${{ secrets.VERCEL_TOKEN }} env: VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}