-
Notifications
You must be signed in to change notification settings - Fork 53.9k
126 lines (119 loc) · 3.84 KB
/
Copy pathci.yml
File metadata and controls
126 lines (119 loc) · 3.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
name: CI
on:
pull_request:
branches: [main]
concurrency:
group: ci-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
changes:
name: 🔎 Change Detection
runs-on: ubuntu-latest
outputs:
frontend: ${{ steps.filter.outputs.frontend }}
steps:
- name: 📥 Checkout
uses: actions/checkout@v5
- name: 🧭 Filter paths
id: filter
uses: dorny/paths-filter@v3
with:
filters: |
frontend:
- 'apps/dsa-web/**'
ai-governance:
name: ai-governance
runs-on: ubuntu-latest
steps:
- name: 📥 Checkout
uses: actions/checkout@v5
- name: 🐍 Setup Python
uses: actions/setup-python@v6
with:
python-version: '3.11'
- name: 🤖 Check AI governance assets
run: python scripts/check_ai_assets.py
backend-gate:
name: backend-gate
runs-on: ubuntu-latest
needs: [ai-governance]
steps:
- name: 📥 Checkout
uses: actions/checkout@v5
- name: 🐍 Setup Python
uses: actions/setup-python@v6
with:
python-version: '3.11'
cache: 'pip'
cache-dependency-path: |
requirements.txt
.github/requirements-ci.txt
- name: 📦 Install dependencies
run: |
python -m pip install --upgrade pip
for attempt in 1 2 3; do
if python -m pip install -r .github/requirements-ci.txt; then
break
fi
if [ "$attempt" -eq 3 ]; then
echo "Dependency install failed after ${attempt} attempts." >&2
exit 1
fi
echo "Dependency install attempt ${attempt} failed, retrying in 15s..." >&2
sleep 15
done
- name: ✅ Python syntax check
run: ./scripts/ci_gate.sh syntax
- name: ✅ Flake8 critical checks
run: ./scripts/ci_gate.sh flake8
- name: ✅ Local deterministic checks
run: ./scripts/ci_gate.sh deterministic
- name: ✅ Offline test suite
run: ./scripts/ci_gate.sh offline-tests
docker-build:
name: docker-build
runs-on: ubuntu-latest
needs: [backend-gate]
steps:
- name: 📥 Checkout
uses: actions/checkout@v5
- name: 🐳 Build image
run: |
docker build -t stock-analysis:test -f docker/Dockerfile .
docker run --rm stock-analysis:test python -c "print('✅ Docker OK')"
- name: 🔍 Docker smoke imports
run: |
docker run --rm stock-analysis:test python -c "
from src.config import get_config; print('✅ config')
from src.storage import DatabaseManager; print('✅ storage')
from src.notification import NotificationService; print('✅ notification')
from data_provider import DataFetcherManager; print('✅ data_provider')
from src.analyzer import GeminiAnalyzer; print('✅ analyzer')
from src.patches.eastmoney_patch import eastmoney_patch; print('✅ patch')
from bot.dispatcher import CommandDispatcher; print('✅ bot')
from api.app import app; print('✅ api')
print('✅ All Docker imports OK')
"
web-gate:
name: web-gate
runs-on: ubuntu-latest
needs: [changes, ai-governance]
if: needs.changes.outputs.frontend == 'true'
defaults:
run:
working-directory: apps/dsa-web
steps:
- name: 📥 Checkout
uses: actions/checkout@v5
- name: 🟢 Setup Node
uses: actions/setup-node@v6
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: apps/dsa-web/package-lock.json
- name: 📦 Install
run: npm ci
- name: 🔎 Lint
run: npm run lint
- name: 🏗️ Build
run: npm run build