skip to content

How would you standardise what a `helm upgrade` starts from across many teams and pipelines?

level: principalimportance: should knowfreq 34%

answer

  1. Choose a source of truth, not a flag
  2. File-driven in automation, reuse for triage
  3. Reuse makes the release record authoritative
  4. Detect drift, do not merely forbid
  5. Name the emergency path explicitly

basics

~20 s

Make every automated upgrade pass the complete values file and forbid reuse flags there, so the repository is the only description of a release. Allow --reset-then-reuse-values for interactive triage, and audit releases by diffing their stored values against the committed file.

solid answer

~50 s

The decision is not really about flags; it is about where a release's configuration lives. If pipelines always pass the full values file and never reuse, the repository is the single description of every release: any engineer can reconstruct it, review it, and diff it. If reuse is allowed in automation, the authoritative configuration becomes the release record itself — invisible in code review, un-diffable, and steadily accumulating fossilised chart defaults under `--reuse-values`. I would standardise on file-driven upgrades with `--reset-values` stated explicitly, ban reuse flags from CI, and permit `--reset-then-reuse-values` only for interactive incident work with a follow-up to reconcile the file. Then I would make it detectable rather than merely forbidden: a periodic job comparing each release's stored user-supplied values against the committed file, and a rendered-manifest diff before promotion, so an out-of-band `--set` shows up as drift instead of as an outage six months later.

go deeper

for a junior

You are not expected to set this standard, but know which side you are on: pass the values file every time, and treat a reuse flag as something you ask about rather than copy from someone's shell history.

for a middle

Be able to argue why automation should pass the complete file: reproducibility, reviewable diffs, and chart upgrades that actually deliver their new defaults. Know what reuse costs in each of those.

for a senior

Show how you would migrate a legacy release onto the file-driven path without reverting settings nobody remembers, and how you would prove afterwards that the file describes the release.

for a principal

Own the tradeoff and the enforcement. Name the emergency path, decide where exceptions live and when they expire, and make drift between stored values and committed files something you measure rather than assume.

### Frame it as a source-of-truth question Every `helm upgrade` starts from something. Either it starts from a file in your repository, or it starts from the values recorded on the previous revision. Those are two different sources of truth, and an organisation that has not chosen one ends up with both. The flags — the default, `--reset-values`, `--reuse-values`, `--reset-then-reuse-values` — are just how each team happens to express its unstated choice, which is why the argument keeps recurring at the level of syntax when it is really about ownership. ### The case for file-driven, always When every upgrade passes the complete values file, four properties come free. Reproducibility: any engineer can recreate the release from the repository alone, on a new cluster, in a disaster. Reviewability: a configuration change is a diff a human approved, not a flag someone typed at 02:00. Determinism: the same commit plus the same chart version yields the same render, so promotion between environments means comparing files rather than comparing clusters. And upgradability: new chart versions actually deliver their new defaults, instead of being masked by defaults that an earlier reuse run promoted into overrides. The cost is real and worth naming. Someone has to keep the file complete, including the parts an operator once fixed by hand. Emergency changes are slower, because the fast path is a pull request. Teams with a chart that is difficult to configure will feel that cost first, and will route around it with `--set` unless you make the fast path acceptable. ### The case for allowing reuse, honestly stated Reuse exists because operators are sometimes handed a release without its file: an inherited estate, a chart installed years ago, a vendor's install instructions that were a single command line. In that world `--reset-then-reuse-values` is genuinely the safest thing available, because the alternative — guessing at a file — risks reverting settings nobody remembers. Recognising this is the difference between a policy people follow and a policy people bypass silently. What I would not accept is reuse inside automation. A pipeline that upgrades with `--reuse-values` has made the release record the authority, and that record is not reviewable, not diffable in a pull request, and grows a layer of stale chart defaults with every run. It also fails the disaster test: if the namespace is lost, the configuration is lost with it. ### The standard I would set * **Automation** passes the complete values file and states `--reset-values` explicitly, so a reader of the pipeline sees the intent rather than inferring it from the absence of a flag. * **Interactive work** may use `--reset-then-reuse-values`, never `--reuse-values`, and owes a follow-up change that reconciles the file. Give that follow-up a ticket, not a promise. * **Bare `--set` in production** is the one thing I would treat as an incident-only action, because it silently narrows the override set on releases whose pipeline is not yet file-driven, and because it leaves no artefact anyone can review. * **Onboarding a legacy release** has a documented path: capture the stored values, prune the entries that merely restate chart defaults, verify by comparing rendered output, commit, and switch that release to the file-driven path. ### Make it detectable, not just forbidden A rule nobody can check is a preference. Two cheap controls make this one real. First, a scheduled job that reads each release's stored user-supplied values and compares them with the committed file, reporting differences as drift — this catches the out-of-band `--set` weeks before the next full-file deploy "reverts" it and causes the outage. Second, a rendered-manifest comparison in the promotion path: render the candidate and compare against the manifests the current revision was created from, so an unexpected diff blocks the change rather than surprising it. Where releases are driven by a controller reconciling from a repository, this question largely dissolves, because every apply supplies the full set by construction — which is itself an argument for that model when a team is choosing. ### How I would decide, and what I would concede I would set the file-driven default centrally, allow per-team exceptions with an owner and an expiry, and measure adoption by the drift report rather than by policy documents. I would concede the emergency path explicitly, because pretending it does not exist is how organisations end up with undocumented reuse everywhere. The goal is not flag purity: it is that at any moment, someone can answer "what is this release configured with, and where is that written down" without reading a cluster.

  • A team says passing the full file is too slow for hotfixes. What do you offer them?
    A fast path that still leaves an artefact: a pre-approved change that edits only a narrow set of keys and merges automatically, so the fix goes through the file in minutes. Alongside it, an explicit break-glass command with `--reset-then-reuse-values` that opens a follow-up to reconcile the file. Refusing to name an emergency path just moves it out of sight.
  • How would you detect that a release has drifted from its committed values file?
    Compare the release's stored user-supplied values with the file on a schedule and report differences. That catches an out-of-band `--set` immediately, rather than at the next full-file deploy when it looks like an unexplained revert. Pair it with a rendered-manifest comparison before promotion so an unexpected change blocks rather than surprises.
  • Would you ever mandate --reuse-values for a fleet of releases?
    Only as a transitional measure for releases whose values files genuinely do not exist yet, and with an end date. It freezes each release's current computed configuration, which is safe in the short term and corrosive over time: chart upgrades stop delivering new defaults and the stored map fills with fossils. The exit is capturing and committing files, then switching those releases to file-driven upgrades.

saying these in an interview costs you the question

  • Answering only with a flag preference and no source-of-truth argument
  • Allowing reuse flags inside automated pipelines
  • Assuming a policy holds without any drift detection
  • Denying that an emergency path exists
  • Ignoring the cost of keeping values files complete
  • Believing a successful upgrade proves the release matches the repository

context