PyMedPhys CI/CD Workflows#
Overview#
PyMedPhys uses GitHub Actions for continuous integration and deployment. The workflow architecture follows a modular design with separated concerns for better visibility and maintainability.
Workflow Architecture#
graph TD
A[Push/PR Event] --> B[ci.yml]
B --> C[pre-commit.yml]
B --> D[lint.yml]
B --> E[type-check.yml]
B --> F[unit-tests.yml]
B --> G[integration-tests.yml]
B --> H[mosaiq-db-tests.yml]
B --> I[docs.yml]
J[Schedule] --> K[deps.yml]
J --> L[security.yml]
M[Release] --> N[release.yml]
N --> D
N --> E
N --> F
N --> G
O[Issue Comment] --> P[claude-assistant.yml]
O --> Q[claude.yml]
style B fill:#f9f,stroke:#333,stroke-width:4px
style D fill:#bbf,stroke:#333,stroke-width:2px
style E fill:#bbf,stroke:#333,stroke-width:2px
style F fill:#bbf,stroke:#333,stroke-width:2px
Workflow Structure#
Core Workflows (Run on All PRs)#
ci.yml - Main Orchestrator#
Coordinates all CI checks based on file changes, labels, and event types.
Triggers: Push to main, pull requests, workflow_call
Jobs:
changes: Detects file changes using path filterspre-commit: Auto-formatting and basic checkslint: Code quality (always runs)type-check: Static type checking (always runs)unit-tests: Fast unit tests (always runs)integration-tests: Extended tests (conditional)mosaiq-db-tests: Database tests (conditional)docs-check/publish: Documentation (conditional)cypress-e2e: E2E tests (main only)summary: Generates comprehensive report
pre-commit.yml#
Runs pre-commit hooks for code formatting and basic checks.
Features:
Auto-fixes issues on PRs
Commits fixes automatically with bot account
Caches pre-commit environments
lint.yml#
Dedicated linting workflow for code quality.
Jobs:
ruff: Fast Python linter and formatterpylint: Comprehensive Python linting
Always runs on PRs for early issue detection
type-check.yml#
Static type checking for type safety.
Jobs:
pyright: Primary type checkermypy: Secondary checker (optional/non-blocking)
Always runs on PRs to ensure type safety
unit-tests.yml#
Fast unit tests with smart matrix strategy.
Features:
Full OS matrix on main (Ubuntu, Windows, macOS)
Quick mode for PRs (Ubuntu + latest supported Python version)
Excludes slow tests for rapid feedback
JUnit XML report generation
Extended Workflows (Conditional)#
integration-tests.yml#
Comprehensive testing beyond unit tests.
Test Types:
doctests: Documentation code examplesslow-tests: Long-running integration testsstackoverflow: Example code validationwheel-build: Package build verificationpropagate: Propagation script tests
Triggers: Main branch or
full-testlabel
mosaiq-db-tests.yml#
SQL Server integration tests for Mosaiq database functionality.
Service: SQL Server 2022 container
Triggers: Database code changes or
databaselabelFeatures: Automatic retries for connection stability
docs.yml#
Builds and deploys documentation to GitHub Pages.
Modes:
docs-check: Build verification on PRs with doc changesdocs-publish: Deploy to GitHub Pages on main
Deployment: docs.pymedphys.com
Release & Maintenance#
release.yml#
Handles PyPI package publishing with quality gates.
Quality Checks: Runs lint, type-check, unit, and integration tests
Features:
TestPyPI dry-run capability
PyPI trusted publishing (no API tokens)
Automatic release asset upload
Installation verification
security.yml#
Enhanced security scanning and vulnerability detection.
Scans:
secrets-scan: API key exposure detectiondependency-audit: pip-audit for vulnerabilitiespython-security: Bandit security lintingcontainer-scan: Trivy filesystem scanninggithub-actions-security: Workflow security patterns
Schedule: Weekly + on main pushes + PR changes
deps.yml#
Automated dependency updates.
Schedule: Weekly (Mondays)
Features:
Creates PR with uv lock updates
Includes changelog in PR description
Runs tests before creating PR
AI Assistance#
claude.yml#
Claude Code integration for automated code assistance.
Triggers: Comments with
@claudementionCapabilities: Code review, issue analysis, PR creation
Tools: File operations, git, uv package management
claude-assistant.yml#
Claude chatbot for issue discussions.
Triggers: Comments with
!claudementionFeatures:
Rate limiting protection
Security filtering
Context-aware responses
Composite Actions#
actions/setup-project/action.yml#
Standardized project setup for all workflows.
Features:
Python setup with configurable version
uv package manager with caching
Optional Node.js setup
PyMedPhys data caching
Dependency installation with extras
PR Workflow#
For a typical pull request:
Always Run:
├── pre-commit # Auto-formatting
├── lint # Ruff + Pylint
├── type-check # Pyright
└── unit-tests # Quick mode (Ubuntu + latest supported Python version)
Conditional:
├── mosaiq-db-tests # If database files changed
├── docs-check # If documentation changed
└── security # If Python/config files changed
Main Branch Workflow#
On merge to main:
Everything from PR workflow, plus:
├── unit-tests # Full matrix (all OS + Python versions)
├── integration-tests # All extended tests
├── cypress-e2e # Browser tests (if present)
├── docs-publish # Deploy to GitHub Pages
└── security # Full security scan
Required Secrets#
Secret |
Description |
Used By |
|---|---|---|
|
Claude AI API access |
claude.yml, claude-assistant.yml |
|
GitHub API access (automatic) |
All workflows |
|
Bot app ID for auto-commits |
pre-commit.yml (optional) |
|
Bot private key |
pre-commit.yml (optional) |
Environments#
Environment |
Description |
Protection Rules |
|---|---|---|
|
PyPI publishing |
Required reviewers, main branch only |
|
Claude API access |
Rate limiting recommended |
Branch Protection Settings#
Required status checks for merge:
✅
pre-commit✅
lint✅
type-check✅
unit-tests
Labels for Manual Triggers#
full-test- Run integration tests on a PRdatabase- Force database tests to runskip-ci- Skip CI checks (use sparingly)
Testing Workflows Locally#
# Install act
brew install act # or appropriate for your OS
# Test CI workflow
act push -W .github/workflows/ci.yml
# Test with specific inputs
act push -W .github/workflows/unit-tests.yml \
--input python-matrix='["3.12"]' \
--input quick=true
# Test PR workflow
act pull_request -W .github/workflows/ci.yml
Local Development Commands#
# Install with dev dependencies
uv sync --frozen --extra dev --extra tests
# Run all pre-commit hooks
uv run pre-commit run --all-files
# Run specific checks matching CI
uv run ruff check
uv run ruff format --check
uv run pyright
uv run pytest -m "not slow"
uv run pymedphys dev lint
# Run slow tests locally
uv run pytest -m slow
# Build docs locally
uv run pymedphys dev docs
Security Considerations#
Never commit secrets: Use GitHub Secrets
Review permissions: Minimum required for each workflow
Enable Dependabot: Keep actions updated
Audit third-party actions: Pin to commit SHAs
Rotate keys periodically: Especially API keys
Review security alerts: Weekly scan results
Limit workflow triggers: Avoid
pull_request_targetmisuse
Version Compatibility#
Python: 3.10, 3.12 (tested in CI)
Node.js: 20.x (for Cypress and build tools)
uv: Latest version (auto-updated)
GitHub Actions: Ubuntu 22.04, Windows 2022, macOS 12/13/14
SQL Server: 2022 Latest (for Mosaiq tests)