-
Notifications
You must be signed in to change notification settings - Fork 6
215 lines (182 loc) · 5.65 KB
/
actions.yml
File metadata and controls
215 lines (182 loc) · 5.65 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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
name: CI
on:
pull_request:
paths-ignore:
- "**.md"
- "docs/**"
- ".gitignore"
push:
branches: [develop, main]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
lint:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
python-version: "3.13"
- name: Cache uv
uses: actions/cache@v4
with:
path: ~/.cache/uv
key: ${{ runner.os }}-uv-pre-commit
restore-keys: |
${{ runner.os }}-uv-
- name: Cache pre-commit environments
uses: actions/cache@v4
with:
path: ~/.cache/pre-commit
key: ${{ runner.os }}-pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Lint / format with pre-commit
run: |
uv venv
uv pip install pre-commit
uv run pre-commit run -a
pyright:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
python-version: "3.13"
- name: Cache uv
uses: actions/cache@v4
with:
path: ~/.cache/uv
key: ${{ runner.os }}-uv-pyright-${{ hashFiles('requirements-dev.lock') }}
restore-keys: |
${{ runner.os }}-uv-pyright-
${{ runner.os }}-uv-
- name: Typecheck with Pyright
env:
SETUPTOOLS_SCM_WRITE_TO_SOURCE: "1"
run: |
uv venv
uv pip install -r requirements-dev.lock
uv pip install -e .
uv run pyright
test:
runs-on: ubuntu-latest
timeout-minutes: 15
services:
# Maps host port 5432 → container; test steps use DATABASE_URL=...@127.0.0.1:5432/...
# GitHub waits for healthcheck success before running job steps (see options below).
postgres:
image: postgres:16
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
ports: ["5432:5432"]
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
--shm-size=256mb
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
python-version: "3.13"
- name: Cache uv
uses: actions/cache@v4
with:
path: ~/.cache/uv
key: ${{ runner.os }}-uv-test
restore-keys: |
${{ runner.os }}-uv-
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends pandoc
# Fully pinned tree (requirements-dev.in → requirements-dev.lock).
- name: Install dependencies
env:
SETUPTOOLS_SCM_WRITE_TO_SOURCE: "1"
run: |
uv venv
uv pip install -r requirements-dev.lock
uv pip install -e .
# Same DATABASE_URL as pytest; 127.0.0.1 avoids occasional localhost → IPv6 quirks on runners.
- name: Verify PostgreSQL connection
env:
DATABASE_URL: postgres://postgres:postgres@127.0.0.1:5432/postgres
SECRET_KEY: for-testing-only
DJANGO_SETTINGS_MODULE: config.test_settings
run: |
uv run python <<'PY'
import django
django.setup()
from django.db import connection
connection.ensure_connection()
with connection.cursor() as cursor:
cursor.execute("SELECT 1")
host = connection.settings_dict.get("HOST") or ""
name = connection.settings_dict.get("NAME") or ""
print(f"PostgreSQL OK (host={host!r}, database={name!r})")
PY
- name: Test with pytest
env:
DATABASE_URL: postgres://postgres:postgres@127.0.0.1:5432/postgres
SECRET_KEY: for-testing-only
DJANGO_SETTINGS_MODULE: config.test_settings
run: |
uv run pytest --cov --cov-report=html --cov-fail-under=90 --cov-report=xml --junitxml=junit.xml -v
- name: Upload HTML coverage report
if: always()
uses: actions/upload-artifact@v4
with:
name: coverage-html
path: htmlcov/
retention-days: 30
- name: Upload XML coverage report
if: always()
uses: actions/upload-artifact@v4
with:
name: coverage-xml
path: coverage.xml
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: pytest-results
path: junit.xml
compose-smoke:
runs-on: ubuntu-latest
timeout-minutes: 20
env:
COMPOSE_FILE: docker-compose.yml:docker-compose.ci.yml
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Create .env for CI
run: |
cp .env.example .env
echo "DATABASE_URL=postgres://boost:boost@db:5432/boost_dashboard" >> .env
echo "SECRET_KEY=ci-only-secret-key" >> .env
echo "DEBUG=True" >> .env
- name: Build images
run: make build
- name: Start stack and wait for health
run: docker compose up -d --wait
- name: Run migrations
run: docker compose exec -T web python manage.py migrate --noinput
- name: Health check
run: make health
- name: Tear down
if: always()
run: make down