Skip to content

fix(ci): EKS authorization check fails on every PR that touches a HelmRelease #3175

Description

@devantler

🤖 Generated by the Agentic Engineer

Evidence

🔐 Validate EKS Authorization fails on the pull_request event for any PR that modifies a
HelmRelease, reporting unresolved Flux substitution in authorization resource for ~26 HelmReleases
across the platform — regardless of which one the PR touched.

Measured across the 12 most recent ci.yaml runs (2026-08-16):

Branch HelmRelease files changed EKS-auth job
codex/fix-default-deny-schema (#3170) 0 ✅ success (×3)
claude/homepage-groups (#3173) 0 ✅ success
claude/crossview-config-reload (#3171) 1 ❌ failure
renovate/docker.io-actualbudget-actual image bump in a HelmRelease ❌ failure (×4)

The correlation is exact and has no counterexample in the window: zero HelmRelease changes → pass;
any HelmRelease change → fail.
merge_group runs pass (pr-2723, pr-3170), and neither of those
carried a HelmRelease change either, so no run has yet shown this check passing over a changed
HelmRelease on any event.

On #3171 the diff is a single annotation added to one HelmRelease's postRenderer patch. Crossview
is not among the 26 resources reported unresolved — the failures are all unrelated HelmReleases
(dex, cilium, reloader, cert-manager, …), so the PR's own content is not what the validator is
objecting to.

Impact

This blocks a whole class of change from ever going green on a PR:

CI - Required Checks aggregates it, so affected PRs sit BLOCKED and cannot enqueue.

Suspected cause

The job runs the validator identically on pull_request and merge_group with no Flux substitution
variables available, so ${domain}-style references in HelmReleases cannot resolve. There is already
precedent in this repo for handling exactly that: validate-talos renders with placeholder values
standing in for env-expanded secrets
so a PR event can validate without secrets.

Expected behaviour

A PR that changes a HelmRelease can pass this check, without weakening what it verifies on the
merge-group/deploy path.

Candidate fixes

  1. Substitute placeholders for unresolvable Flux variables on the pull_request event, mirroring
    validate-talos.
  2. Have the validator treat an unresolved substitution in an unchanged resource as out of scope,
    so a PR is judged on its own diff.
  3. ❌ Do not simply drop the job from pull_request — that removes the pre-merge signal entirely.

Acceptance criteria

  • A PR touching only a HelmRelease passes the check.
  • A PR that genuinely breaks the authorization surface still fails it (negative control — without
    this, a fix could pass by disabling the check).
  • The Renovate HelmRelease PRs above go green without manual intervention.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    Status
    ✅ Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions