CI Pipeline¶
The Revel backend uses GitHub Actions for continuous integration. Every pull request (and manual dispatch) triggers the pipeline to verify code quality, type safety, translations, and test coverage.
Pipeline Stages¶
1. Code Quality (make check)¶
The make check command runs six checks in sequence:
| Check | Tool | What It Does |
|---|---|---|
| Format | ruff | Auto-formats code to match project style (ruff format .) |
| Lint | ruff | Catches code quality issues and anti-patterns |
| Type check | mypy (strict) | Validates type annotations across the entire codebase |
| Migration check | Django | Verifies no migrations are missing (makemigrations --check) |
| i18n check | custom | Ensures every _() string is extracted and every .po entry is translated (no empty msgstr / fuzzy) — no .mo involved |
| File length | custom | Ensures no source file exceeds 1,000 lines |
Run Locally First
Always run make check before pushing. It catches the same issues CI will flag, saving you a round-trip.
Local vs CI Behavior
Locally, make check auto-fixes formatting and lint issues (ruff format . and ruff check . --fix). In CI, formatting is checked with ruff format --check . (read-only) and linting with ruff check . (no --fix). Both will fail if any changes are needed. This means running make check locally may modify files. Review and commit any changes before pushing.
2. Tests¶
CI runs the full pytest suite in parallel with a 90% branch coverage requirement:
Any drop below 90% coverage fails the pipeline.
3. Lockfile Consistency¶
CI verifies that uv.lock is consistent with pyproject.toml. If you've changed dependencies, make sure to run uv sync and commit the updated lockfile.
CI Environment¶
Docker Services¶
The CI environment uses docker-compose-ci.yml with only the services needed for testing:
| Service | Purpose |
|---|---|
| PostgreSQL (with PostGIS) | Database |
| Redis | Cache and Celery broker |
| ClamAV | File malware scanning |
No Observability Stack in CI
The observability services (Loki, Tempo, Prometheus, Grafana, Pyroscope) are not started in CI. The environment variable FEATURE_OBSERVABILITY=False disables all observability instrumentation during test runs.
Commit Conventions¶
Recommended
The project follows Conventional Commits for commit messages, though this is not enforced by a pre-commit hook.
Common prefixes:
| Prefix | Usage |
|---|---|
feat: | New feature |
fix: | Bug fix |
refactor: | Code restructuring without behavior change |
test: | Adding or updating tests |
docs: | Documentation changes |
chore: | Maintenance tasks (deps, config, CI) |
dev: | Developer tooling and experience improvements |
Example:
feat(events): add waitlist support for sold-out tiers
Allows users to join a waitlist when all tickets for a tier are sold out.
Waitlisted users are notified automatically when spots open up.
Quick Checklist¶
Before opening a pull request, verify locally:
-
make check: format + lint + mypy + migration-check + i18n-check + file-length -
make test: all tests pass with 90%+ coverage - No file exceeds 1,000 lines