A Jenkins plugin that tracks all four DORA metrics, pipeline analytics, rankings, and performance trends. No external infrastructure required.
DORA Metrics (All 4)
- Deployment Frequency with DORA band rating (Elite/High/Medium/Low)
- Lead Time for Changes (commit to deploy)
- Mean Time to Restore (failure to recovery)
- Change Failure Rate (% failed deployments)
Pipeline Rankings and Stage Analytics
- Slowest pipelines by average duration
- Most failing pipelines by failure rate
- Most improved (month-over-month duration change)
- Flakiest pipelines (pass-fail-pass pattern detection)
- Slowest and most failing stages across all pipelines
Per-Job Metrics
- Per-job DORA Metrics tab on every job page
- Stage breakdown with duration and run counts
Dashboard
- Interactive Chart.js trend charts (build volume, duration over time)
- Sparkline trends on each DORA metric card
- Date range picker (7d / 30d / 90d / 180d / 1y / custom date range)
- Collapsible sections with chevron indicators
- Job drill-down links (click any pipeline to see its per-job metrics)
- CSV and JSON export
- Permission-aware: users only see jobs they have access to
Configuration
- Production job pattern (regex)
- Excluded job pattern (regex)
- Folder-based job selection
- Branch filtering (main/master or custom)
- Customizable DORA band thresholds
- Cloud storage export (S3-compatible, HTTP endpoint) with Jenkins Credentials
Permission-Aware Dashboard
Rankings only show jobs the current user has access to. Users with limited permissions see a filtered view.
REST API
GET /dora-api/overview?days=30 All 4 DORA metrics
GET /dora-api/pipelines?days=30&limit=10 Pipeline rankings
GET /dora-api/trends?days=90&job=my-pipeline Time-series trend data
GET /dora-api/export?days=90&format=csv CSV/JSON bulk export
The plugin uses a RunListener to automatically capture build data after every pipeline completes. Data is stored in an embedded SQLite database at JENKINS_HOME/pipeline-dora-metrics/metrics.db. No external database setup required.
Data captured per build:
- Job name, build number, timestamp, duration, result
- Trigger type (user, SCM, timer, upstream)
- Branch name (from environment variables)
- Stage-level duration and result for each pipeline stage
- SCM commit data for lead time calculation
Storage: ~200 bytes per build with stages. 100 builds/day for a year is approximately 7MB.
| Scale | Builds/day | Storage/year |
|---|---|---|
| Small team (10 jobs) | 50 | ~3.5MB |
| Medium (50 jobs) | 200 | ~14MB |
| Large (200 jobs) | 1000 | ~70MB |
| Enterprise (1000 jobs) | 5000 | ~350MB |
Navigate to Manage Jenkins > System and scroll to the Pipeline DORA Metrics section.
Job Filtering:
- Production Job Pattern: Regex to match production jobs (e.g.,
production/.*or.*-prod.*). Default:.*(all jobs) - Excluded Job Pattern: Regex to exclude jobs (e.g.,
.*-test.*|.*sandbox.*) - Production Folders: Comma-separated Jenkins folder paths (e.g.,
production,deploy/prod) - Production Branch Pattern: Regex for branches that count as production (e.g.,
main|master|release/.*)
DORA Thresholds: Customize the Elite/High/Medium/Low band boundaries for each metric to match your team's standards.
io.jenkins.plugins.dorametrics/
├── collectors/
│ ├── BuildDataCollector # RunListener - captures builds, stages, commits
│ └── JobRenameListener # ItemListener - tracks job renames/moves
├── dora/
│ └── DoraCalculator # Computes all 4 DORA metrics (SQL-optimized)
├── export/
│ ├── ExportStorageConfig # Describable base for storage backends
│ ├── S3ExportConfig # S3-compatible storage (AWS, B2, MinIO)
│ └── HttpExportConfig # HTTP endpoint export
├── rankings/
│ └── PipelineRanker # Pipeline and stage rankings (SQL aggregates)
├── store/
│ ├── MetricsStore # SQLite database
│ ├── MetricsExporter # Builds snapshots, delegates upload to config
│ └── MetricsMaintenanceTask # Scheduled cleanup and export
├── ui/
│ ├── DoraApiAction # REST API at /dora-api/ (auth-protected)
│ ├── DoraDashboardAction # Dashboard UI at /dora-metrics/
│ ├── DoraDashboardLink # Manage Jenkins sidebar link
│ └── JobMetricsAction # Per-job metrics tab
├── util/
│ └── DurationFormatter # Shared duration formatting
└── DoraGlobalConfiguration # Plugin settings
- All API endpoints require Jenkins READ permission
- Dashboard rankings filtered by Item.READ (users only see jobs they can access)
- Export credentials managed through Jenkins Credentials plugin (encrypted, auditable)
- SQL queries use parameterized statements (no SQL injection)
- CSV export protects against CSV injection attacks
- SQL ORDER BY clauses are whitelisted (not user-controlled)
v1.1 (Planned)
- Additional export backends (GCS, Azure Blob) and IAM role support for S3
- Historical build import (backfill metrics from existing Jenkins build history)
- Grafana dashboard template (JSON) that consumes the REST API
v1.2 (Planned)
- Month-over-month comparison view (side-by-side metrics)
- DORA band progression chart (track your team's improvement over time)
- Stage failure heatmap visualization
- Webhook notifications when DORA bands change (Slack, Teams, email)
v2.0 (Future)
- Multi-controller aggregation (combine metrics across Jenkins instances)
- Team/group-level DORA metrics (assign jobs to teams)
- GitHub Actions and GitLab CI support (beyond Jenkins)
- Connection pooling with HikariCP for enterprise scale
- Fork the repository
- Create a feature branch
- Write tests for new functionality
- Run
mvn test(all 87 tests must pass) - Submit a pull request
MIT





