Skip to content

[INFRA-1333] feat(plane-enterprise): global.deterministicRender for GitOps (3.11.6) - #369

Merged
pratapalakshmi merged 2 commits into
masterfrom
fix/infra-1333-deterministic-renders
Nov 4, 2026
Merged

pratapalakshmi merged 2 commits into
masterfrom
fix/infra-1333-deterministic-renders

Conversation

@pratapalakshmi

@pratapalakshmi pratapalakshmi commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

What

  • Was: every helm template of the same values differed. The migrator, Plane AI migrator, Argus migrator and MinIO bucket Jobs are named …-<YYYYMMDD-HHMMSS>, and Argus stamps timestamp: now on its pods outside the forceRedeploy gate. ArgoCD shows such releases as permanently out of sync; a customer on 3.10.2 reported it.
  • Now: opt-in global.deterministicRender (default false). When on:
    • each of those Jobs is named after a hash of its own rendered spec, so identical values give identical names and any spec change still gives a new Job (needed anyway, because Job specs are immutable). The MinIO bucket Job also hashes the doc-store Secret and chart version, because its bucket name lives in that Secret, not its spec;
    • Argus uses the shared plane.podAnnotations (checksum/config, timestamp only with forceRedeploy), plus checksum/argus-config, because argus-env is not in the shared checksum.
  • Each Job's spec moves into a named template so the name can hash it. With the flag off, output is byte-identical to before.

Where to look

  1. 🔴 templates/_helpers.tpl — plane.jobRunSuffix (hash vs clock) and plane.argusPodAnnotations (+ checksum/argus-config)
  2. 🟡 templates/workloads/{migrator,pi-migrator,argus-migrator}.job.yaml, minio.stateful.yaml — spec moved into a define, name uses the suffix; the spec text is unchanged. MinIO's suffix also hashes the doc-store Secret + chart version
  3. 🟡 templates/workloads/argus.deployment.yaml — annotations via the helper
  4. ⚪ values.yaml, README.md (GitOps paragraph + parameter row), Chart.yaml (3.11.6)

Watch out for:

  • Opt-in, not the default. With hash names, re-rendering identical values no longer reruns migrations, and a failed Job isn't retried until it's deleted. Mutable image tags without forceRedeploy also stop triggering migrations. Keeping the clock by default leaves every existing release and the re-run helm upgrade advice in the README unchanged.
  • The hash covers the full spec, not just the image. A partial hash would let a spec change keep the same name, and helm upgrade would then fail with field is immutable.

Blast Radius

  • Every existing release (flag off): manifests identical to master apart from the clock values, verified for defaults, the OpenShift example and forceRedeploy=true.
  • Releases that turn the flag on: on the first upgrade, the clock-named Jobs are pruned and hash-named Jobs created (migrations run once). After that, Jobs rerun only on spec changes, and Argus pods stop restarting on every render.

Proof

Important

Confidence: Medium — render behaviour verified for every mode; no live ArgoCD or helm upgrade on a cluster

  • Ran: helm lint. With Argus, Pi and MinIO enabled:
    • flag off vs master: identical after normalising the clock (default, OpenShift example, forceRedeploy=true), with the same 4 clock-named Jobs;
    • flag on: two renders identical, zero clock values;
    • an Argus-only setting change: the Argus migrator is renamed and Argus pods get a new checksum/argus-config; no line outside Argus changes and checksum/config is untouched;
    • env.docstore_bucket change: the MinIO bucket Job is renamed; a chart-version-only change renames all three Jobs; with doc_store_existingSecret renders stay stable;
    • planeVersion bump: the three migrators get new names, while the MinIO bucket Job keeps its name because its spec doesn't reference the version;
    • changing only services.web.replicas: the migrator name is unchanged;
    • flag + forceRedeploy: new names on every render;
    • Argus annotations checked for all four flag combinations.
  • Try it: helm template r charts/plane-enterprise --set license.licenseDomain=x --set global.deterministicRender=true | grep -E '^ name: r-.*migrate-' twice → same names.
  • Not verified: a live ArgoCD sync and a helm upgrade that switches the flag on, on a cluster.

Rollout

Links

  • Work item: INFRA-1333 (parent INFRA-1362)
  • DRI / session: Goutham Pratapa · human-driven · Claude Code session 4bcdb3ae-69e7-478b-a774-390cc9f4ecf2

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added an opt-in deterministic rendering setting for GitOps deployments. When enabled, unchanged values produce stable manifests, and selected Job names change when their specifications change.
    • Failed Jobs are not retried by rerendering unchanged values; delete the Job or enable force redeployment to trigger another run.
  • Documentation
    • Documented the new setting and its behavior in the chart documentation.
  • Chores
    • Updated the enterprise chart version to 3.11.5.

@coderabbitai

coderabbitai Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Walkthrough

The chart adds the default-off global.deterministicRender setting. When enabled, selected Job names use hashes of their rendered specs, and Argus pod annotations use shared annotations. The chart version changes from 3.11.4 to 3.11.5.

Changes

Deterministic rendering

Layer / File(s) Summary
Setting and rendering helpers
charts/plane-enterprise/values.yaml, charts/plane-enterprise/templates/_helpers.tpl, charts/plane-enterprise/README.md, charts/plane-enterprise/Chart.yaml
Adds the default-off setting and helpers for hash-based Job suffixes and Argus pod annotations. The README documents stable rendering, rerun behavior, and the setting. The chart version changes to 3.11.5.
Workload naming and annotations
charts/plane-enterprise/templates/workloads/argus-migrator.job.yaml, charts/plane-enterprise/templates/workloads/argus.deployment.yaml, charts/plane-enterprise/templates/workloads/migrator.job.yaml, charts/plane-enterprise/templates/workloads/minio.stateful.yaml, charts/plane-enterprise/templates/workloads/pi-migrator.job.yaml
The migrator, Plane AI migrator, Argus migrator, and MinIO bucket Jobs derive suffixes from their rendered specs. Argus deployment and migration pod annotations use the shared helper. When deterministic rendering is disabled, timestamp-based naming and annotations remain in use.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Feature

Possibly related issues

  • makeplane/helm-charts#357: This PR adds opt-in spec-based names for the four Jobs that the issue identifies as causing Argo CD and Flux drift.

Possibly related PRs

Suggested reviewers: akshat5302, 4krajesh

Merge Risk: Moderate · up to 0c5bd

Resolve the deterministic-mode configuration gaps before merging: changing the MinIO bucket can leave uploads targeting a nonexistent bucket, and Argus configuration changes can leave workloads using old settings. The feature is opt-in and disabled by default.

Pre-merge checks: Passed 4
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Title check Passed The title names the primary change: an opt-in global.deterministicRender setting for GitOps in the plane-enterprise chart. The changeset adds that setting, the helpers that derive hash-based Job nam…
Full details: Title check

Explanation

The title names the primary change: an opt-in global.deterministicRender setting for GitOps in the plane-enterprise chart. The changeset adds that setting, the helpers that derive hash-based Job names, and the Argus annotation change. The version bump to 3.11.6 is a minor detail. The title follows the expected conventional format and is specific. Note that the chart version in Chart.yaml changes to 3.11.5 in the summary, so the title's 3.11.6 does not match the file-level change.

Finishing Touches
Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

A rabbit checks the rendered chart,
And watches Job names match their part.
A spec hash keeps each name in place,
While Argus annotations leave no trace.
The rabbit hops through stable YAML with delight.

CodeRabbit Verify

  • Run CodeRabbit Verify to test the changes in this pull request.
Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between 8b01e61 and 0c5bdcd.

Files selected for processing: 9
  • charts/plane-enterprise/Chart.yaml
  • charts/plane-enterprise/README.md
  • charts/plane-enterprise/templates/_helpers.tpl
  • charts/plane-enterprise/templates/workloads/argus-migrator.job.yaml
  • charts/plane-enterprise/templates/workloads/argus.deployment.yaml
  • charts/plane-enterprise/templates/workloads/migrator.job.yaml
  • charts/plane-enterprise/templates/workloads/minio.stateful.yaml
  • charts/plane-enterprise/templates/workloads/pi-migrator.job.yaml
  • charts/plane-enterprise/values.yaml

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

@makeplane

makeplane Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

@pratapalakshmi pratapalakshmi changed the title [INFRA-1333] feat(plane-enterprise): global.deterministicRender for GitOps (3.11.4) [INFRA-1333] feat(plane-enterprise): global.deterministicRender for GitOps (3.11.5) Nov 2, 2026

@coderabbitai coderabbitai Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Fix comments: Fix CodeRabbit comments on this PR

…itOps (3.11.4)

Every render differed, so ArgoCD showed releases as permanently out of sync:
the migrator, Plane AI migrator, Argus migrator and MinIO bucket Jobs are
named after the render time, and Argus stamps a `timestamp` pod annotation
outside the forceRedeploy gate every other workload uses.

Add global.deterministicRender (default false). When on, each of those Jobs is
named after a hash of its own rendered spec. Identical values give an identical
name, and any spec change (image, config checksum, chart version) gives a new
Job, which Job immutability requires anyway. Argus moves onto the shared
plane.podAnnotations. forceRedeploy still renames the Jobs on every render.

Each Job's spec moves into a named template so its name can hash it. With the
flag off, renders are byte-identical to before apart from the clock.
…Jobs when their own config changes (3.11.6)

With global.deterministicRender on, two Jobs could keep their name when their
input changed:

- Argus: argus-env is not in plane.configChecksum, and the per-render timestamp
  is gone in this mode, so an Argus-only setting changed nothing in the Argus
  pod template or the migrator spec. argusPodAnnotations now adds
  checksum/argus-config (a hash of argus-env) in deterministic mode only.
  Adding argus-env to configChecksum instead would roll every workload.
- MinIO bucket Job: the bucket name and credentials come from the doc-store
  Secret, not the Job spec. Its run suffix now hashes that Secret and the chart
  version, so the README's "reruns on image, config or chart version" holds.

Default-mode renders are unchanged (diffed against master with the clock
normalised). Version 3.11.6: master took 3.11.5 in #372.
@pratapalakshmi
pratapalakshmi force-pushed the fix/infra-1333-deterministic-renders branch from 0c5bdcd to 9cbe8a2 Compare November 3, 2026 11:56
@pratapalakshmi pratapalakshmi changed the title [INFRA-1333] feat(plane-enterprise): global.deterministicRender for GitOps (3.11.5) [INFRA-1333] feat(plane-enterprise): global.deterministicRender for GitOps (3.11.6) Nov 3, 2026
@pratapalakshmi
pratapalakshmi merged commit bc8ccb5 into master Nov 4, 2026
1 check passed
@pratapalakshmi
pratapalakshmi deleted the fix/infra-1333-deterministic-renders branch November 4, 2026 08:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants