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.*) - Ignore Disabled Pipelines: Leave pipelines that are currently disabled in Jenkins out of DORA metrics, rankings and exports, including builds recorded while they were still active. Off by default. Their history is kept, so re-enabling a pipeline or unchecking the option brings its numbers back. A pipeline counts as disabled when Jenkins reports it as not buildable: disabled by hand, or a multibranch branch or pull request job kept after its branch was deleted.
- 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
Issues and pull requests are welcome. Read CONTRIBUTING.md first: it covers how to build and test, what a pull request needs, how releases happen, and the rules for AI-assisted contributions. Coding agents should also read AGENTS.md.
MIT





