---
# ci-sync: 2026-05-30T01:29:55Z
# Homelab CI — Node/pages lane (git-ci-01) + secret scan (git-ci-02)
name: CI

on:
  push:
    branches: [master, main]
  pull_request:
    types: [opened, synchronize, reopened]

jobs:
  skip-ci-check:
    runs-on: [homelab, self-hosted, linux]
    container:
      image: node:20-bookworm
    outputs:
      should-skip: ${{ steps.check.outputs.skip }}
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 1
      - id: check
        run: |
          SKIP=0
          BRANCH="${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}"
          MSG="${GITHUB_EVENT_HEAD_COMMIT_MESSAGE:-$(git log -1 --pretty=%B 2>/dev/null || true)}"
          echo "$BRANCH" "$MSG" | grep -qi '@skipci' && SKIP=1
          echo "skip=$SKIP" >> $GITHUB_OUTPUT

  node-ci:
    needs: skip-ci-check
    if: needs.skip-ci-check.outputs.should-skip != '1'
    runs-on: [homelab, self-hosted, linux, node]
    container:
      image: node:20-bookworm
    steps:
      - uses: actions/checkout@v4

      - name: npm ci
        run: |
          if [ -f package-lock.json ]; then npm ci; elif [ -f package.json ]; then npm install; else exit 0; fi

      - name: Playwright browsers
        run: |
          if [ -f playwright.config.ts ] || [ -f playwright.config.js ] || [ -f playwright.config.mjs ] \
             || grep -q '@playwright/test' package.json 2>/dev/null; then
            npx playwright install --with-deps chromium
          else
            echo "No Playwright — skip browser install"
          fi

      - name: Lint
        run: npm run lint --if-present

      - name: Test
        run: npm test --if-present

      - name: Build
        env:
          NEXTAUTH_SECRET: ${{ secrets.NEXTAUTH_SECRET }}
          NEXTAUTH_URL: ${{ secrets.NEXTAUTH_URL }}
          AUTH_SECRET: ${{ secrets.AUTH_SECRET }}
          DATABASE_URL: ${{ secrets.DATABASE_URL }}
        run: |
          export CI=true
          # Placeholders so Next.js/NextAuth can compile in CI without real secrets.
          # Override via Gitea repo Actions secrets when you need production-like builds.
          export NEXTAUTH_SECRET="${NEXTAUTH_SECRET:-ci-build-placeholder-not-for-production}"
          export AUTH_SECRET="${AUTH_SECRET:-$NEXTAUTH_SECRET}"
          export NEXTAUTH_URL="${NEXTAUTH_URL:-http://localhost:3000}"
          export DATABASE_URL="${DATABASE_URL:-postgresql://ci:ci@127.0.0.1:5432/ci?schema=public}"
          npm run build --if-present

      - name: npm audit (advisory)
        run: npm audit --audit-level=high || true

  secret-scan:
    needs: skip-ci-check
    if: needs.skip-ci-check.outputs.should-skip != '1'
    runs-on: [homelab, self-hosted, linux, heavy]
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Gitleaks
        run: |
          docker run --rm -v "$PWD:/repo" ghcr.io/gitleaks/gitleaks:latest \
            detect --source /repo --no-banner --redact
