#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" CLIENT_DIR="$ROOT_DIR/client" MODE="${1:-attached}" ISSUE_ID="${QA_ISSUE_ID:-qg6-qa-governance-upgrade}" REPORT_DIR="${VISUAL_MATRIX_REPORT_DIR:-$ROOT_DIR/artifacts/qa-flow/${ISSUE_ID}-visual-matrix-$(date +%Y%m%d-%H%M%S)}" SUMMARY_BASE_URL="${E2E_BASE_URL:-}" mkdir -p "$REPORT_DIR" usage() { cat < 说明: local 准备本地临时库和服务后运行 PC + 移动视觉矩阵。 attached 复用当前 E2E_BASE_URL 运行视觉矩阵。 live 默认使用 https://oa.hyinda.com 运行公网视觉矩阵。 可选环境变量: QA_ISSUE_ID 输出 issue-id,默认 qg6-qa-governance-upgrade VISUAL_MATRIX_REPORT_DIR 摘要报告目录 VISUAL_MATRIX_SCOPE=full|mobile attached 默认 full;live 默认 mobile,避免无凭据时写入公网测试数据 E2E_BASE_URL attached 模式目标地址 USAGE } write_summary() { local exit_code="$?" if [[ "$MODE" == "help" || "$MODE" == "-h" || "$MODE" == "--help" ]]; then return "$exit_code" fi if [[ -f "$REPORT_DIR/summary.json" ]]; then return "$exit_code" fi local scope="${VISUAL_MATRIX_SCOPE:-}" if [[ -z "$scope" ]]; then if [[ "$MODE" == "live" ]]; then scope="mobile" else scope="full" fi fi local notes="移动 320/360/375/390/393/414/430;企业微信 iOS/Android UA 和普通移动 UA。" if [[ "$scope" == "full" ]]; then notes="PC 1440x960;移动 320/360/375/390/393/414/430;企业微信 iOS/Android UA 和普通移动 UA。" fi local status="PASS" if [[ "$exit_code" -ne 0 ]]; then status="FAIL" fi QA_REPORT_DIR="$REPORT_DIR" \ QA_ISSUE_ID="$ISSUE_ID" \ QA_BASE_URL="$SUMMARY_BASE_URL" \ QA_MODE="visual-matrix-${MODE}" \ QA_STATUS="$status" \ QA_SUMMARY_NOTES="$notes" \ node "$ROOT_DIR/scripts/qa/write-qa-summary.mjs" >/dev/null 2>&1 || true return "$exit_code" } trap write_summary EXIT run_attached() { local base_url="${1:-}" local scope="${2:-full}" if [[ -z "$base_url" ]]; then echo "[visual-matrix][ERROR] attached 模式需要 E2E_BASE_URL" >&2 exit 2 fi if [[ "$scope" != "full" && "$scope" != "mobile" ]]; then echo "[visual-matrix][ERROR] VISUAL_MATRIX_SCOPE 只能是 full 或 mobile" >&2 exit 2 fi SUMMARY_BASE_URL="$base_url" local specs=(tests/e2e/r6-mobile-unified-design-rollout.spec.ts) if [[ "$scope" == "full" ]]; then specs=(tests/e2e/project-wide-visual.spec.ts "${specs[@]}") fi echo ">>> [visual-matrix] baseURL=$base_url issue=$ISSUE_ID scope=$scope" ( cd "$CLIENT_DIR" E2E_BASE_URL="$base_url" \ E2E_MODE=local \ QA_ISSUE_ID="$ISSUE_ID" \ QA_VISUAL_OUTPUT_DIR="$ROOT_DIR/output/playwright/${ISSUE_ID}/project-wide" \ QA_VISUAL_ARTIFACT_DIR="$REPORT_DIR/project-wide" \ MOBILE_VISUAL_OUTPUT_DIR="${ISSUE_ID}/mobile-matrix" \ npx playwright test "${specs[@]}" --workers=1 --reporter=list ) } case "$MODE" in help|-h|--help) usage ;; local) QA_ISSUE_ID="$ISSUE_ID" \ VISUAL_MATRIX_REPORT_DIR="$REPORT_DIR" \ bash "$ROOT_DIR/scripts/qa/run-web-gates.sh" qg6-visual-matrix-local ;; attached) run_attached "${E2E_BASE_URL:-}" "${VISUAL_MATRIX_SCOPE:-full}" ;; live) run_attached "${E2E_BASE_URL:-https://oa.hyinda.com}" "${VISUAL_MATRIX_SCOPE:-mobile}" ;; *) usage >&2 exit 2 ;; esac