skip to content

Hardened Templates & Images

A platform team operates the safe pipeline template and the hardened base image so no team reinvents them. The hard part is adoption, drift, and the teams still building on last year's copy.

on this pageshow

questions

4

Your hardened base image is rebuilt monthly, but services pin it by digest. How do you make the rebuild reach them?

level: middleimportance: must knowfreq 60%

answer

  1. Immutability versus currency
  2. The supply side is the easy half
  3. Nothing consumes the new digest
  4. Turn silence into a build failure
  5. Rebuild is not redeploy

basics

~20 s

A digest names one immutable build, so a rebuild produces a new digest nobody consumes. Rebuilding is the supply side; you need a push mechanism: automated bump changes per repository, a build-time staleness failure, and retirement of the old digest.

solid answer

~50 s

Pinning by digest means a service is bound to one exact image build, so publishing a patched rebuild changes nothing for anyone until something moves the pin. Rebuilding monthly is the supply side of the problem; the distribution side needs three things. First, automation that opens a change per consuming repository whenever a new digest publishes, running that service's tests so the bump is a review-and-merge rather than a project. Second, a build-time freshness check that fails, or first warns, when the pinned base digest is older than an agreed maximum age — that converts silent staleness into a visible failure with an owner. Third, a retirement policy so the old digest stops being a comfortable place to sit. And remember a base bump only takes effect on a rebuild and a redeploy; services that are not rebuilt keep running the old image regardless.

go deeper

for a junior

Know that a digest names one exact image build and cannot move, so a patched rebuild is a different digest that nobody is referencing until someone updates the pin.

for a middle

Explain the push mechanisms and how they differ: automated bump changes per repository, a build-time maximum-age check that fails a stale pin, and retirement of the superseded digest.

for a senior

Demonstrate the rollout judgment: warn before failing, publish the date, keep the image interface stable, and measure base-layer age on what is deployed rather than what is merged.

for a principal

Own the tension between reproducibility and currency across an estate. Argue where the breakage budget goes, who absorbs the migration cost, and what the platform team owes teams in return for forcing monthly change.

## Why the rebuild does not arrive on its own An internal hardened base image line exists so that patching the operating system layer and the shared runtime happens once, for everyone, on a schedule. The platform team rebuilds monthly and publishes. Consumers, correctly, pin their build to a digest rather than a moving tag, because a digest is content-addressed: it names exactly one image and cannot be moved under them. Those two good practices collide. A rebuild with new patches is, by construction, different content, therefore a different digest, therefore something nobody is referencing. Currency and immutability pull in opposite directions, and nothing about pinning is wrong — what is missing is a mechanism that moves the pin. ## The three mechanisms that actually move it **1. Raise the change for them.** The platform team's automation watches for a new base digest and opens a change in every consuming repository that updates the pinned reference, runs that repository's own test suite, and carries the changelog in the description. The important design point is who does the work: if adopting the monthly rebuild costs a service team a planning conversation, it will not happen. If it costs one review of an already-green change, it will. Where a team's tests are trusted, allowing that change to merge automatically on green pushes adoption further. **2. Make staleness fail rather than sit.** A build-time check compares the age of the pinned base digest against a maximum age and warns, then fails, once it is exceeded. This is the crucial inversion. Without it, a stale pin has no symptom at all: builds are green, the service runs, and the only person who knows is whoever later reads a scan report. With it, staleness becomes a build failure that lands on the team that owns the service, at a time of your choosing, with a documented fix. Roll it out as a warning first with a published date on which it starts failing, so the deadline is predictable rather than an outage. **3. Retire the old image.** A digest that stays pullable forever is a comfortable place to stay. A retirement policy — the old digest becomes unavailable, or builds against it are refused, after the support window — closes the option. This is the sharpest of the three and needs the most warning, because it turns a currency problem into a build outage for anyone who ignored the first two mechanisms. ## Rebuild is not redeploy A common mistake in interviews is stopping at the pin. Updating the base digest in a repository patches the *next image the service builds*. The service running in production is still the old image until it is rebuilt and rolled out. If the point of the monthly line is patch currency, the metric has to be the age of the base layer in what is *deployed*, not what is committed. That usually means the automation ends in a deploy, or that services rebuild and redeploy on a cadence of their own. ## The breakage budget A monthly forced upgrade is a monthly opportunity to break several hundred builds, and the goodwill you spend is finite. Three things keep it affordable. Keep the image line boring: a stable interface — the same paths, the same user, the same entrypoint conventions — so a patch rebuild is genuinely a patch. Separate the cadence: routine patch rebuilds flow automatically, while a change that moves a major runtime version gets its own announced track with a longer window. And publish what changed each time, so a team whose tests fail can tell in a minute whether the cause is theirs or yours. If teams learn that the monthly bump is safe, they stop reviewing it carefully — which is fine, because that is the outcome you wanted. ## What to say about the tradeoff The honest framing is that immutability of a reference and currency of its content are in permanent tension, and you resolve it not by loosening the pin but by owning the movement of the pin. A floating tag looks like a shortcut, and it does deliver patches automatically, but it also means the content of a build changes without a recorded decision and the same build cannot be reproduced later. Most estates land on pinned digests plus aggressive, cheap, automated movement — with the staleness failure as the backstop for the repositories where the automation is ignored.

  • A team merges the base digest bump but the running workload is unchanged. Why?
    Because the bump only affects the next image the service builds. Until that build runs and the result is rolled out, production is still executing the previous image. Patch currency must therefore be measured on what is deployed, not on what is committed, which usually means the automation has to carry through to a release rather than stopping at a merged change.
  • How do you stop a monthly forced bump from being dismissed as noise?
    Keep the image interface stable so a patch rebuild really is a patch, and split cadences: routine patches flow automatically on green tests, while a runtime major version gets an announced track and a longer window. Publish a changelog per rebuild so a failing team can tell in a minute whether the break is yours or theirs. Predictability is what buys the next bump.
  • Why not just have everyone track a floating tag on the base image line?
    It does deliver patches without any push mechanism, but the content of a build then changes with no recorded decision, two builds of the same commit can differ, and an incident becomes hard to reconstruct. Most estates keep the digest pin for that reproducibility and instead invest in making the pin cheap and automatic to move.

saying these in an interview costs you the question

  • Assuming a rebuild automatically reaches digest-pinned consumers
  • Treating publishing the new image as the end of the job
  • Proposing a floating tag as the whole answer
  • Confusing bumping the pin with redeploying the workload
  • Forcing failures with no warning period or changelog

context

open as a page

What does a team lose by copy-pasting a shared CI pipeline template instead of referencing a versioned one?

level: juniorimportance: should knowfreq 52%

basics

~20 s

A copy stops receiving updates: security fixes made centrally never reach it, and the local edits made to it are invisible to the platform team. A versioned reference keeps one source of truth and makes adoption measurable.

open as a page

Your shared release template has a flag that skips the signing stage, and twelve services set it. What do you do?

level: seniorimportance: should knowfreq 44%

basics

~20 s

Find out why the hatch is used before removing it: it usually marks a gap in the paved road. Make every use attributed, dated and reported, close the gaps, then narrow the hatch to an approved exception and delete it.

open as a page

How do you get 40 teams onto a hardened shared pipeline when a written policy alone has not worked?

level: principalimportance: nice to knowfreq 34%

basics

~20 s

Make the hardened path the fastest route to production so complying costs less than not complying, absorb the migration work centrally, keep the off-road route available but expensive, and measure adoption by supported version rather than by mere presence.

open as a page