Repository navigation
131 lines (109 loc) · 3.98 KB
/
Copy pathci.yml
File metadata and controls
131 lines (109 loc) · 3.98 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
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
# Cancel in-progress runs when a newer commit is pushed to the same branch
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
# Central GitHub Actions and gh-aw source validation; Python checks stay local.
automation-validation:
name: Validate GitHub automation
permissions:
contents: read
uses: DevOpsDerek/workflows/.github/workflows/validate-agentic-workflows.yml@dac4b81c298cb3ea6821ea312efa5375f42d5ccb
# Parse a side-effecting script without running it or sending email.
python-syntax:
name: Python syntax (no execution)
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Parse SMTP report script
uses: DevOpsDerek/workflows/.github/actions/check-python-syntax@dac4b81c298cb3ea6821ea312efa5375f42d5ccb
with:
python-version: "3.12.8"
source-path: 06_automation/send_report.py
lint:
name: Lint (ruff)
permissions:
contents: read
uses: DevOpsDerek/workflows/.github/workflows/lint-python-ruff.yml@35ec3f531b5eb0f0f42f232f23e1dc5735e36c35
with:
python-version: "3.12.8"
ruff-version: "0.11.13"
# ── Job 2: Test matrix ───────────────────────────────────────────────────────
test:
name: Test (Python ${{ matrix.python-version }} / ${{ matrix.os }})
needs: lint
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false # Run all matrix combinations even if one fails
matrix:
os: [ubuntu-latest, macos-latest]
python-version: ["3.9", "3.11", "3.12"]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
# Cache pip downloads to speed up subsequent runs
- name: Cache pip
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('requirements*.txt') }}
restore-keys: |
${{ runner.os }}-pip-${{ matrix.python-version }}-
- name: Install dependencies
run: |
pip install --upgrade pip
pip install -r requirements.txt
pip install -r requirements-dev.txt
- name: Run tests with coverage
run: |
python -m pytest tests/ \
--tb=short \
--cov=. \
--cov-report=term-missing \
--cov-report=xml
- name: Upload coverage report
# Only upload from one matrix entry to avoid duplicates
if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage.xml
# ── Job 3: Exercise smoke test ───────────────────────────────────────────────
exercises:
name: Exercise solutions (Python ${{ matrix.python-version }})
needs: lint
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.9", "3.12"]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
pip install --upgrade pip
pip install -r requirements.txt
pip install -r requirements-dev.txt
- name: Run exercise solution tests only
run: |
python -m pytest tests/test_exercises.py -v --tb=short