name: deploy-test

# 并发治理（Gitea 1.26+ 支持）：同一 ref 多次 push 时只保最新，老的自动 cancel。
# AI 高频合并 develop 节奏下避免：① runner 队列堆积 ② 多个 ssh 同时撞 PM2 reload / docker compose
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

# L2 Test 环境自动部署：push develop → https://ffworkspace.test.faradayfuturecn.com
#
# 定位：永远可看的整体效果环境，PM/设计/其他开发随时点开看现状
# 不跑 E2E（高频合并 develop 会拖死 CI），E2E 全部留 L3 兜底
# 部署后只跑健康检查 + smoke 200
#
# 独立机器 170.106.161.71，与 UAT (43.153.69.73) 完全分离（2026-04 PR #272 拆出），端口段 5xxx
#
# Schema 同步策略：用 prisma db push（不走 migration history）
# - test 环境数据可丢，schema 跟 prisma/schema 直接同步
# - 跳过 deploy.sh 的 migrate-deploy 步骤（test 不应跑 migration history）

permissions:
  contents: read

on:
  push:
    branches:
      - develop
  workflow_dispatch:

jobs:
  # 合并后只跑 deploy：服务器上的 deploy.sh 会先 build（先到 .next.tmp 再切换），
  # build 失败 → deploy.sh 非零退出 → SSH 失败 → 本 job 红 → post-deploy-health 不跑。
  # 服务器 build 本身就是真门禁，CI runner 不必重复 build。
  # 其它检查（lint/contract/migration-count/integration）已在 PR 阶段覆盖。
  deploy:
    runs-on: ubuntu-latest
    timeout-minutes: 20
    steps:
      # 用 composite action setup-deploy-ssh —— 必须先 checkout 才能 lookup 路径下的 action
      - name: Checkout
        uses: actions/checkout@v4

      # secret 命名规范：FFWORKSPACE_TEST_CI_KEY_170_106_161_71
      # = ffworkspace-test 目录 / CI 用途 / IP 170.106.161.71（机器换 IP/换机器时同步重命名 secret）
      - name: Setup deploy SSH
        uses: ./.gitea/actions/setup-deploy-ssh
        with:
          ssh_key: ${{ secrets.FFWORKSPACE_TEST_CI_KEY_170_106_161_71 }}
          hosts: '170.106.161.71'

      - name: Deploy to Test server (独立机器 170.106.161.71)
        run: |
          DEPLOY_HOST="170.106.161.71"
          ssh $DEPLOY_SSH_OPTS ubuntu@"$DEPLOY_HOST" bash -s <<'DEPLOY_SCRIPT'
          set -e
          export NVM_DIR="$HOME/.nvm"
          [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

          cd /srv/apps/ffworkspace-test

          echo "=== 拉最新 develop ==="
          # 用 git switch -C 而不是 git reset --hard：reset 只移 commit 指针、不切 branch 名，
          # 历史多次撞到"当前 branch 是 PR 分支但 commit 已经是 develop"的诡异 detached 状态。
          # -C / -B 等价于 create-or-reset，明确表达"切到 develop"语义。详见 #273 评论 2。
          git fetch origin develop --prune
          git switch -C develop origin/develop

          echo "=== 同步 /usr/local/bin/ffoa-deploy symlink（防 stale binary）==="
          # backend 调 /usr/local/bin/ffoa-deploy 执行部署；symlink 指向仓库脚本，
          # git pull 后立刻生效。历史上是 plain cp → 改了脚本不部署、员工 push 全挂。
          # 详见 .learnings/2026-05-19-ffoa-deploy-binary-stale-symlink-fix.md
          DEPLOY_SCRIPT_PATH=/srv/apps/ffworkspace-test/scripts/internal-app-platform/deploy-container.sh
          # 先校验 target 存在——`ln -sfn` 不校验，dangling symlink 要等 webhook 触发才暴露。
          # 万一未来脚本被重命名/移动，这里立刻报错而不是把烂账留给员工。
          if [[ ! -f "$DEPLOY_SCRIPT_PATH" ]]; then
            echo "FATAL: deploy-container.sh 不在 $DEPLOY_SCRIPT_PATH" >&2
            exit 1
          fi
          sudo ln -sfn "$DEPLOY_SCRIPT_PATH" /usr/local/bin/ffoa-deploy

          echo "=== 同步 schema (db push, test 环境标准做法) ==="
          (cd backend && npm install && npm run db:push)

          echo "=== 跑 deploy.sh，跳过 migrate（已用 db push 同步） ==="
          CI=true bash scripts/deploy/deploy.sh test deploy --skip-migrate
          DEPLOY_SCRIPT

  post-deploy-health:
    needs: deploy
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup deploy SSH
        uses: ./.gitea/actions/setup-deploy-ssh
        with:
          ssh_key: ${{ secrets.FFWORKSPACE_TEST_CI_KEY_170_106_161_71 }}
          hosts: '170.106.161.71'

      - name: Smoke test from public internet
        run: |
          set -e
          TEST_URL="https://ffworkspace.test.faradayfuturecn.com"

          echo "=== Frontend / ==="
          STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$TEST_URL/")
          echo "status=$STATUS"
          [ "$STATUS" = "200" ] || { echo "❌ frontend"; exit 1; }

          echo "=== Backend /api/v1/health ==="
          curl -fsS "$TEST_URL/api/v1/health" | grep -q '"status":"healthy"' || { echo "❌ backend health"; exit 1; }

          echo "✅ Public smoke test passed"

      - name: On-server smoke (含 NEXT_PUBLIC_API_URL 校验，防止前端 build 期 env 漂移)
        run: |
          DEPLOY_HOST="170.106.161.71"
          ssh $DEPLOY_SSH_OPTS ubuntu@"$DEPLOY_HOST" \
            'cd /srv/apps/ffworkspace-test && bash scripts/ops/smoke-test.sh test'
