-
Notifications
You must be signed in to change notification settings - Fork 2
137 lines (114 loc) · 3.84 KB
/
Copy pathci.yml
File metadata and controls
137 lines (114 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
127
128
129
130
131
132
133
134
135
136
137
# =============================================================================
# coding-proxy: Continuous Integration Pipeline
# =============================================================================
# Trigger:
# - Pull Request (所有 PR)
# - Push to master / feature/* 分支
# - Push of version tags (v*) — 确保 release 前通过质量检查
#
# Architecture: Parallel Quality Gates
# Job 1 (lint): Ruff 静态分析
# Job 2 (format): Ruff format 格式校验
# Job 3 (test): pytest 单元/集成测试
# → 三者完全并行,最大化效率
#
# References:
# [1] https://docs.astral.sh/ruff/integrations/#github-actions
# [2] https://docs.pytest.org/en/stable/how-to/continuous_integration.html
# =============================================================================
name: CI
on:
pull_request:
branches: [master, "feature/*"]
push:
branches: [master, "feature/*"]
tags: ["v*"]
permissions:
contents: read
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
# ===========================================================================
# Job 1: LINT — Ruff static analysis
# ===========================================================================
lint:
name: Lint (Ruff)
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
persist-credentials: false
- name: Set up uv
uses: astral-sh/setup-uv@v4
with:
enable-cache: true
- name: Install dependencies
run: uv sync --all-extras --dev
- name: Run Ruff linter
run: uv run ruff check .
# ===========================================================================
# Job 2: FORMAT — Ruff format verification
# ===========================================================================
format:
name: Format Check (Ruff)
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
persist-credentials: false
- name: Set up uv
uses: astral-sh/setup-uv@v4
with:
enable-cache: true
- name: Install dependencies
run: uv sync --all-extras --dev
- name: Check formatting
run: uv run ruff format --check .
# ===========================================================================
# Job 3: TEST — Unit & integration tests
# ===========================================================================
test:
name: Test (pytest)
runs-on: ubuntu-latest
timeout-minutes: 10
strategy:
matrix:
python-version: ["3.12", "3.13", "3.14"]
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
persist-credentials: false
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Set up uv
uses: astral-sh/setup-uv@v4
with:
enable-cache: true
- name: Install dependencies
run: uv sync --all-extras --dev
- name: Run tests with coverage data collection
run: uv run pytest --cov=src/coding --cov-report=term-missing --cov-report=xml:coverage.xml --junitxml=junit.xml
- name: Upload coverage artifact
if: matrix.python-version == '3.12'
uses: actions/upload-artifact@v4
with:
name: coverage-data
path: coverage.xml
retention-days: 7
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results-py${{ matrix.python-version }}
path: junit.xml
retention-days: 7