ci: API 分層檢查 + LLM 測試移至 Nightly

CI 強化:
- 新增 API Layer Check (#96): services/repositories/models 分層規則
- LLM 測試移至 nightly-llm.yaml (CPU 推理 ~300s/測試)

分層規則:
- services 禁止引用 api/routers
- repositories 禁止引用 services
- models 禁止引用業務層

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-03-26 19:10:30 +08:00
parent a9f8ad56c1
commit 00e2c94a8e
2 changed files with 58 additions and 7 deletions

View File

@@ -96,6 +96,27 @@ jobs:
fi
echo "✅ ADR 檢查通過"
# Phase 14.2 #96: 後端分層檢查 (輕量版 import-linter)
- name: API Layer Check
run: |
echo "🔍 檢查後端分層規則..."
# 檢查 1: services 層禁止引用 api/routers 層 (反向依賴)
if grep -rE "from src\.(api|routers)" apps/api/src/services/ 2>/dev/null; then
echo "❌ 分層違規: services 禁止引用 api/routers 層"
exit 1
fi
# 檢查 2: repositories 層禁止引用 services 層
if grep -rE "from src\.services" apps/api/src/repositories/ 2>/dev/null; then
echo "❌ 分層違規: repositories 禁止引用 services 層"
exit 1
fi
# 檢查 3: models 層禁止引用業務層
if grep -rE "from src\.(services|api|routers)" apps/api/src/models/ 2>/dev/null; then
echo "❌ 分層違規: models 禁止引用業務層"
exit 1
fi
echo "✅ 後端分層檢查通過"
# ==================== Test ====================
test:
name: Test
@@ -282,14 +303,15 @@ jobs:
uv sync
uv run pytest tests/test_action_parsing.py -v --tb=short || echo "⚠️ 部分測試失敗"
- name: Prompt Validation Test
working-directory: apps/api
env:
PYTHONPATH: ${{ github.workspace }}/apps/api
OLLAMA_URL: http://192.168.0.188:11434
# 🔴 LLM 測試移至 Nightly (2026-03-26)
# 原因: CPU 推理需 300+ 秒/測試,不適合每次 commit
# 完整測試: .github/workflows/nightly-llm.yaml
- name: LLM Test (Skip - See Nightly)
run: |
echo "📝 Prompt 品質驗證..."
uv run pytest tests/test_prompt_validation.py::test_prompt_quality_report -v --tb=short || echo "⚠️ Prompt 驗證略過"
echo "⏭️ LLM 測試已移至 Nightly workflow"
echo " - test_model_regression.py"
echo " - test_prompt_validation.py"
echo " 原因: CPU 推理 ~300s/測試"
# ==================== OpenAPI Validation ====================
openapi-validate:

View File

@@ -1 +1,30 @@
# Core module
# ADR-027: Incident-Approval 同步架構 (2026-03-26)
from .constants import (
APPROVAL_TO_INCIDENT_STATUS,
APPROVAL_TTL_SECONDS,
DECISION_TTL_SECONDS,
INCIDENT_ACTIVE_STATUSES,
INCIDENT_TTL_SECONDS,
REDIS_KEY_APPROVAL,
REDIS_KEY_DECISION,
REDIS_KEY_INCIDENT,
REDIS_KEY_PENDING,
)
from .unit_of_work import UnitOfWork
__all__ = [
# Constants (ADR-027)
"INCIDENT_TTL_SECONDS",
"APPROVAL_TTL_SECONDS",
"DECISION_TTL_SECONDS",
"REDIS_KEY_INCIDENT",
"REDIS_KEY_APPROVAL",
"REDIS_KEY_PENDING",
"REDIS_KEY_DECISION",
"APPROVAL_TO_INCIDENT_STATUS",
"INCIDENT_ACTIVE_STATUSES",
# Unit of Work (ADR-027)
"UnitOfWork",
]