Build Discarder: How Jenkins Keeps Its Own History From Swallowing the Server
A complete, beginner-to-practitioner walkthrough of how Jenkins' build discarder (log rotation) automatically prunes old builds, artifacts, and logs — before they quietly fill up an entire disk.
Think about a home mailbox that nobody ever empties. At first it’s fine — a few letters, easy to manage. But after months of never throwing anything away, the mailbox is stuffed so full that new mail can’t even be delivered, and finding last week’s important letter means digging through years of junk. A Jenkins job that never cleans up after itself behaves exactly the same way: every single build leaves behind console logs, test reports, and build artifacts, and without a system to prune the old ones, that pile grows forever. The build discarder — often still called “log rotation” from Jenkins’ older terminology — is the automatic mail-emptying policy that keeps a job’s history manageable indefinitely.
1What Is the Build Discarder?
Let’s pin down exactly what gets discarded, and what stays behind.
Every time a Jenkins job runs, it produces a build record — a folder on disk containing the full console log, any archived artifacts, published test reports, and metadata about that specific run. Left completely unmanaged, a busy job running dozens of times a day will accumulate thousands of these build records over a year, consuming ever-increasing amounts of disk space and slowing down anything that has to scan a job’s full history.
The build discarder is a per-job (or, in some setups, globally-applied) policy that tells Jenkins how many old builds to keep, and for how long, before automatically deleting the rest. Once a build falls outside the configured retention window, Jenkins removes its logs, its stored artifacts, and its metadata — freeing up disk space without any manual intervention.
Think of a security camera system set to “keep the last 30 days of footage.” Nobody has to manually delete old recordings every night — the system quietly rolls old footage off as new footage comes in, guaranteeing storage never runs out while still preserving a useful, recent window of history.
Older Jenkins documentation and UI labels referred to this feature as “Discard Old Builds” under a “Log Rotation” heading, a naming convention borrowed from traditional Unix log-rotation tools that solve the exact same underlying problem — keeping ever-growing log files from consuming unlimited disk space.
2Architecture & Components of Retention Policy
A build discarder policy is made up of a small number of independently configurable limits, working together.
Max # of Builds to Keep
Once a job accumulates more builds than this number, the oldest ones are removed first, regardless of how recently they ran.
Max Days to Keep Builds
Builds older than this many days are removed, regardless of how many total builds currently exist.
Max # of Builds With Artifacts
A separate, often stricter limit specifically for how many builds should keep their archived artifacts, since artifacts (compiled binaries, packaged files) are frequently far larger than console logs.
Max Days to Keep Artifacts
A time-based equivalent for artifacts alone, allowing a team to keep lightweight build metadata and logs far longer than the much heavier binary artifacts.
These four settings can be combined freely. A very common real-world pattern is keeping build metadata and logs for a long time (they’re cheap) while discarding the much larger archived artifacts far sooner — giving teams a long historical record of “did this build pass or fail” without the storage cost of keeping every single compiled binary forever.
Per-Job vs. Organization-Wide Policy
While each individual job can define its own discarder settings, many organizations also apply a broader, shared default policy across all jobs to guarantee a minimum standard of housekeeping even for jobs whose owners never explicitly configured retention themselves.
3How Jenkins Decides What to Delete
Understanding the internal evaluation order clears up a lot of confusion about “why wasn’t this build cleaned up yet?”
After each build completes, Jenkins evaluates the job’s configured discarder policy against its full build history. It checks the count-based and time-based limits independently: if a build exceeds either threshold — too old, or beyond the maximum count — it becomes eligible for deletion. Jenkins then separately evaluates the artifact-specific limits, which can cause a build’s artifacts to be deleted even while the build’s log and metadata are retained a while longer.
flowchart TD
A[Build completes] --> B[Evaluate discarder policy for the job]
B --> C{Build exceeds max count or max age?}
C -- Yes --> D[Delete entire build record: logs, metadata, artifacts]
C -- No --> E{Artifacts exceed artifact-specific limit?}
E -- Yes --> F[Delete artifacts only, keep logs and metadata]
E -- No --> G[Retain build fully]
It’s important to understand that this cleanup process runs as part of the build lifecycle itself — typically evaluated right after a build finishes — rather than as some separate, occasional maintenance job running independently in the background. This means retention policy changes take effect gradually, applying naturally as new builds complete, rather than immediately purging the entire existing history the moment a setting is changed.
It’s similar to a store’s “first in, first out” inventory policy — old stock quietly gets moved out as new stock arrives, rather than the whole warehouse being reorganized in one dramatic sweep every time the inventory policy changes.
A build that has been explicitly marked to “keep forever” (often used for important releases) is excluded from discarder evaluation entirely, regardless of how old it is or how many newer builds exist — protecting historically significant builds from being swept away by routine cleanup.
4Data Flow & Lifecycle of a Build Record
Here’s the full journey a single build’s data takes, from creation to eventual disappearance.
Build Runs
A new build executes, producing a console log, possibly test reports, and possibly archived artifacts.
Build Record Created
Jenkins stores all of this output as a dedicated, numbered build record on disk, becoming part of the job’s permanent history — for now.
Ages Normally
As new builds accumulate, this record naturally becomes older relative to the job’s configured retention window.
Discarder Evaluation
After each newer build completes, Jenkins re-evaluates the entire history against the configured count and age limits.
Artifact Trim or Full Deletion
Depending on which limits are exceeded, either just the artifacts are removed, or the entire build record is deleted outright.
Disk Space Reclaimed
The freed space becomes available for future builds, keeping the job’s overall footprint bounded indefinitely rather than growing forever.
A subtle but important consequence of this lifecycle is that any external system relying on a specific old build’s artifacts (a download link, an audit reference, a rollback script) can silently break once that build is discarded — which is exactly why genuinely important builds, like production releases, are usually explicitly protected from automatic discarding rather than left to the default policy.
5Advantages, Disadvantages & Trade-offs
Automated retention is close to mandatory at scale, but the specific limits chosen involve real trade-offs.
Advantages
- Prevents disk space from growing without bound as a job accumulates builds over months or years.
- Requires zero manual intervention once configured — cleanup simply happens as part of the normal build lifecycle.
- Lets teams keep cheap metadata and logs longer while discarding much larger artifacts sooner.
- Reduces the time it takes to load and browse a job’s build history page in the Jenkins UI.
- Protects genuinely important builds (like releases) from being swept up by explicit “keep forever” marking.
Disadvantages / Trade-offs
- Setting limits too aggressively can delete historical data a team later wishes it still had for debugging or auditing.
- External systems referencing old build artifacts by number can break once those builds are discarded.
- Discarding is gradual, tied to new builds completing, so a sudden manual disk-space emergency isn’t solved instantly by changing the policy.
- Different teams often want different retention needs, making a single organization-wide default an imperfect fit for everyone.
- Long-term trend graphs (like test pass-rate history) become less useful if retention is set too short to preserve enough historical data points.
6Security Considerations
Retention policy intersects with security in a couple of specific, easy-to-overlook ways.
Build logs and artifacts can sometimes contain sensitive information — a stack trace with embedded configuration values, a build log that happened to print an environment variable, or an artifact that includes internal file paths. A sensible retention policy that eventually removes old builds also, as a side effect, limits how long that potentially sensitive information remains exposed and retrievable.
Some regulated industries have explicit legal requirements to retain build and audit records for a minimum period — meaning a discarder policy configured purely for disk-space convenience could inadvertently violate a compliance obligation if it’s set too aggressively.
Problem
Applying the exact same aggressive, short retention policy across every job in the organization without considering compliance-sensitive jobs that may have legal retention obligations.
Why It’s Harmful
It risks silently destroying records a regulator, auditor, or internal compliance process may later require, with no way to recover them once deleted.
Correct Approach
Identify jobs subject to compliance or audit requirements early, and give them explicitly longer (or indefinite) retention settings, separate from the organization’s general-purpose default policy.
It’s also worth remembering that discarding a build’s artifacts doesn’t retroactively revoke access to copies that may have already been downloaded or promoted elsewhere — retention policy manages Jenkins’ own storage, not every downstream copy that might already exist.
7Monitoring, Logging & Metrics
Keeping an eye on disk usage and cleanup behavior helps teams catch problems before they turn into an outage.
Disk Usage Trend Monitoring
Tracking overall Jenkins controller and agent disk usage over time helps confirm that retention policies are actually keeping growth bounded, rather than assuming they are and discovering otherwise during an outage.
Per-Job Storage Reporting
Identifying which specific jobs consume the most disk space — often a small number of jobs with very large artifacts — helps teams target retention tuning where it will have the biggest impact.
Discard Failure Alerts
In rare cases, a build’s files can fail to delete cleanly (due to file locks or permission issues); alerting on these failures prevents a silently growing exception to an otherwise working retention policy.
8Design Patterns & Anti-Patterns
Teams managing large numbers of jobs converge on a handful of proven retention strategies.
Tiered Retention
Keeping lightweight logs and metadata considerably longer than heavy archived artifacts, balancing useful historical visibility against actual storage cost.
Explicit “Keep Forever” for Releases
Manually marking official release builds to be permanently retained, ensuring the discarder policy never accidentally removes historically significant artifacts.
Organization-Wide Minimum Default
Setting a sensible, shared baseline retention policy applied automatically to every new job, so cleanup happens even for jobs whose creators never think to configure it themselves.
Problem
Leaving a job’s build discarder completely unconfigured, relying entirely on manual, ad-hoc disk cleanup whenever storage alerts start firing.
Why It’s Harmful
Disk space grows silently until it becomes an emergency, often discovered only when builds start failing due to insufficient space on the controller or agent.
Correct Approach
Configure a sensible retention policy proactively for every job — or apply an organization-wide default — rather than waiting for a disk-space crisis to force a reactive cleanup.
9Best Practices & Common Mistakes
A handful of small, consistent habits keep retention policy genuinely useful rather than a source of surprises.
Set separate, tighter limits specifically for artifacts than for overall build history, since artifacts are usually the single largest contributor to a job’s disk footprint.
Explicitly mark important release builds to be kept forever, rather than assuming a generous retention window will always be long enough.
Setting the retention window so short that useful trend graphs (like test pass-rate history) no longer have enough historical builds to show meaningful patterns.
Forgetting that a downstream system referencing a specific old build number by URL will break once that build’s artifacts are discarded, without any warning at discard time.
10Real-World & Industry Examples
Retention policy shows up in essentially every Jenkins installation that’s been running for more than a few weeks.
High-Frequency Continuous Integration Jobs
A job that builds on every single commit across an active team can easily produce hundreds of builds a week; without aggressive artifact retention limits, its storage footprint would grow far faster than almost any other job in the organization.
Long-Retention Compliance Pipelines
Regulated industries frequently configure specific release or audit-related jobs with intentionally long — sometimes indefinite — retention, explicitly exempting them from the shorter organization-wide default policy.
Shared Jenkins Controllers at Scale
Large organizations running a single shared Jenkins controller for hundreds of teams often enforce a mandatory minimum default retention policy platform-wide, ensuring no individual team’s neglected job can silently consume disproportionate shared disk space.
11Frequently Asked Questions
No — the discarder policy is evaluated as builds complete over time, so existing builds are gradually pruned as new ones finish, rather than an immediate, one-time bulk deletion the moment the setting is changed.
Yes — this is one of the most common configurations, since logs and metadata are typically much smaller than archived artifacts, so many teams keep logs considerably longer.
It’s excluded from the discarder policy entirely and will never be automatically deleted, regardless of its age or how many newer builds have since been created.
It can — trend graphs and history-based visualizations rely on retained build data, so setting retention too short can noticeably shorten how far back those graphs are able to show meaningful history.
Many organizations achieve this through shared pipeline templates, organization folders, or a globally-applied default configuration, so individual job owners don’t each need to configure retention manually themselves.
12Summary and Key Takeaways
The build discarder quietly solves one of the least glamorous but most important operational problems in any long-running Jenkins installation: keeping build history from growing without bound. By combining independent count-based and time-based limits — applied separately to overall build records and to heavier artifacts — teams can strike a balance between useful historical visibility and manageable disk consumption, all without any manual, recurring cleanup effort. The details that matter most are getting the balance right for each job’s actual needs, explicitly protecting genuinely important builds from automatic deletion, and staying aware of any compliance obligations that a generic, storage-driven policy might otherwise violate.
Key Takeaways
- Build discarder prevents unbounded growth — without it, every job’s disk footprint grows forever.
- Count and age limits work independently — a build can be discarded for exceeding either threshold.
- Artifacts can have their own, stricter limit — letting teams keep cheap logs longer than heavy binaries.
- Cleanup happens gradually — tied to new builds completing, not as an instant bulk purge when settings change.
- “Keep forever” protects important builds — releases and audit-relevant builds should be explicitly exempted.
- Retention intersects with compliance — a policy tuned purely for disk space can conflict with legal retention requirements.
- Discarded artifacts can break external references — anything linking to an old build number should account for eventual cleanup.