Comprehensive multi-repository analysis tool for Linux Foundation projects
Generate detailed reports on Gerrit projects, contributor activity, Jenkins jobs, GitHub CI/CD workflows, and development practices across repositories.
https://lfreleng-actions.github.io/project-reporting-tool/
# Install
pip install .
# Generate your first report
lf-releng-project-reporting generate \
--project my-project \
--repos-path ./repos- π Git Analytics - Commit activity, lines of code, contributor metrics across configurable time windows
- π INFO.yaml Reporting - Project metadata, committer activity, and lifecycle state tracking from info-master
- π Feature Detection - Automatic detection of CI/CD, documentation, dependency management, security tools
- π₯ Contributor Intelligence - Author and organization analysis with domain mapping
- π API Integration - GitHub, Gerrit, and Jenkins API support
- π― CI-Management Integration - Authoritative Jenkins job allocation using JJB definitions (99%+ accuracy)
- π Interactive Reports - JSON (data), Markdown (readable), HTML (interactive), ZIP (bundled)
- β‘ High Performance - Parallel processing with caching support
- Getting Started Guide - Complete installation and setup walkthrough
- Commands Reference - Full command-line reference with quick reference
- FAQ - Frequently asked questions
- Usage Examples - Real-world scenarios and patterns
- Configuration Guide - All configuration options (GitHub API, INFO.yaml, performance)
- Configuration Merging - How project configs inherit and override defaults
- Deployment Guide - Production deployment and operations
- CI/CD Integration - GitHub Actions, GitLab CI, and automation
- Performance Guide - Optimization, caching, and scaling
- Feature Discovery - Understanding automatic feature detection
- INFO.yaml Reporting - Project metadata and committer activity tracking
- Troubleshooting - Problem solving and debugging
- Developer Guide - Architecture, API reference, and contributing
- Template Development - Customizing Jinja2 templates and creating new output formats
- Testing Guide - Test suite documentation
- Migration Guide - Production migration from legacy system
- Template Audit Script -
python scripts/audit_templates.py- Comprehensive audit of all Jinja2 templates to verify field accesses match context builders, preventing runtime errors
# Install UV
curl -LsSf https://astral.sh/uv/install.sh | sh
# Install dependencies
uv sync
# Run the tool
uv run lf-releng-project-reporting generate --project my-project --repos-path ./repos# Install from source
pip install .
# Run the tool
# Note: repos-path should match the directory created by gerrit-clone-action
# which defaults to the Gerrit server hostname (e.g., ./gerrit.o-ran-sc.org)
lf-releng-project-reporting generate --project O-RAN-SC --repos-path ./gerrit.o-ran-sc.orgβ Detailed Setup Instructions
| Use Case | Command |
|---|---|
| Basic report (O-RAN-SC) | lf-releng-project-reporting generate --project O-RAN-SC --repos-path ./gerrit.o-ran-sc.org |
| Basic report (ONAP) | lf-releng-project-reporting generate --project ONAP --repos-path ./gerrit.onap.org |
| With caching | lf-releng-project-reporting generate --project O-RAN-SC --repos-path ./gerrit.o-ran-sc.org --cache --workers 8 |
| Check config | lf-releng-project-reporting generate --project O-RAN-SC --repos-path ./gerrit.o-ran-sc.org --dry-run |
| Get help | lf-releng-project-reporting --help |
Note: The
--repos-pathshould point to the directory created bygerrit-clone-action, which uses the Gerrit server hostname as the directory name (e.g.,./gerrit.o-ran-sc.orgfor O-RAN-SC,./gerrit.onap.orgfor ONAP).
reports/
<PROJECT>/
βββ report_raw.json # Complete dataset (canonical)
βββ report.md # Markdown report (readable)
βββ report.html # Interactive HTML (sortable tables)
βββ config_resolved.json # Applied configuration
βββ <PROJECT>_report_bundle.zip # Complete bundle
- name: Generate Report
run: |
uv run lf-releng-project-reporting generate \
--project "${{ matrix.project }}" \
--repos-path "./${{ matrix.server }}" \
--cache \
--quiet
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}- Python: 3.10+ (supports 3.10, 3.11, 3.12, 3.13)
- Dependencies: PyYAML, httpx, Jinja2, typer, rich
- Optional: GitHub token for API features (required for workflow status colors)
For full workflow status reporting (colored status indicators), you need a GitHub Personal Access Token (Classic) with these permissions:
Required Scopes:
- β
repo- Full repository access (orpublic_repofor public repositories) - β
actions:read- Read GitHub Actions workflow runs and status
Note: Fine-grained tokens are not supported as they cannot span organizations.
Setup:
# Set environment variable
export GITHUB_TOKEN=ghp_your_token_here
# OR for CI/production:
export CLASSIC_READ_ONLY_PAT_TOKEN=ghp_your_token_here
# Then run the tool
lf-releng-project-reporting generate --project my-project --repos-path ./reposCreate token: https://github.com/settings/tokens
Without a token: The tool detects workflows but shows them as grey (unknown status) instead of colored status indicators.
See also: Configuration Guide for detailed token setup
Some Jenkins servers require authentication to view job information. If you encounter a "returned 0 jobs" error, you need to provide Jenkins credentials.
Setup:
# Generate API token in Jenkins: User β Configure β API Token β Add new Token
export JENKINS_USER="your-username"
export JENKINS_API_TOKEN="your-api-token"
# Then run the tool
lf-releng-project-reporting generate --project my-project --repos-path ./reposCreate token: Log into your Jenkins instance β Your Username β Configure β API Token
Without credentials: The tool will fail with an error if Jenkins requires authentication.
See also: Troubleshooting Guide for detailed setup
| Topic | Document |
|---|---|
| Getting Started | docs/GETTING_STARTED.md |
| Commands | docs/COMMANDS.md |
| FAQ | docs/FAQ.md |
| Configuration | docs/CONFIGURATION.md |
| Usage Examples | docs/USAGE_EXAMPLES.md |
| Performance | docs/PERFORMANCE.md |
| Troubleshooting | docs/TROUBLESHOOTING.md |
| CI/CD Setup | docs/CI_CD_INTEGRATION.md |
| Developer Guide | docs/DEVELOPER_GUIDE.md |
- π― First time? Start with Getting Started Guide
- β‘ Slow? Add
--cache --workers 8for parallel processing - π Issues? Check Troubleshooting Guide
- β Questions? See FAQ
- π Need help? Run
lf-releng-project-reporting --help - π Developing templates? Run
python scripts/audit_templates.pyto verify all field accesses
python scripts/audit_templates.pyThis script performs a comprehensive audit of all Jinja2 templates to:
- Extract all field accesses from templates (e.g.,
repo.field,org.field) - Analyze context builders to see what fields they provide
- Identify mismatches that could cause "Undefined variable" errors at runtime
When to use:
- Before committing template changes
- After modifying context builders
- When debugging template rendering errors
- During code review to verify template correctness
Output:
- β Green checkmarks - All required fields present
β οΈ Warnings - Extra fields exist (safe, unused)- β Red errors - Missing fields that will cause runtime failures
Example output:
================================================================================
TEMPLATE FIELD ACCESS AUDIT
================================================================================
π html/sections/summary.html.j2
summary:
- active_count
- current_count
- repositories_analyzed
β
No critical issues found!
Extra fields are safe - they're unused.
- Documentation: Complete Index
- Issues: GitHub Issues
Apache-2.0 License - Copyright 2025 The Linux Foundation