--- # ci-sync: 2026-05-30T01:28:40Z # 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