What does the wrapper-validation action compare against, and why does it allow a set of checksums rather than one?
answer
- SHA-256 of each jar
- compared to set of published checksums
- one valid jar per Gradle release
- membership test, allowlist
- fail = unknown or modified
basics
~10 sIt computes the SHA-256 of each gradle-wrapper.jar and checks it against the list of checksums Gradle publishes for all its releases. Many valid jars exist (one per version), so it accepts any known-good one.
solid answer
~50 sThe validation action finds every `gradle-wrapper.jar` in the checkout, computes each one's SHA-256, and compares it to the **set** of known-good checksums that Gradle publishes — one per released wrapper version. It allows a set rather than a single value because there isn't one canonical wrapper jar: each Gradle release ships its own `gradle-wrapper.jar` with a distinct hash, and different sub-projects or pinned versions in the same repo may legitimately use different ones. A jar passes if its hash matches *any* published value; it fails if it matches *none*, which means it's either modified or from an unknown/unreleased build. The action fetches the authoritative checksum list from Gradle, so it stays current as new versions ship. The result is a hard pass/fail gate that distinguishes 'a genuine Gradle wrapper jar of some released version' from 'something else'.
code
bash · 3 lines# The essence of what the action automates
found=$(sha256sum gradle/wrapper/gradle-wrapper.jar | awk '{print $1}')
# PASS if $found is in Gradle's published wrapper-jar checksum list; FAIL otherwisego deeper
Know it hashes the jar with SHA-256 and checks it against Gradle's published list of valid jars.
Explain why it's a set/allowlist (one jar per release, multiple wrappers per repo) and the pass/fail membership semantics.
Discuss how the checksum set stays current and the boundary with single-value pinning used for the distribution.
Reason about trust in the source of the checksum list and how to keep validation authoritative across many repos.
## What gets hashed For each `gradle-wrapper.jar` in the repository checkout, the action computes a **SHA-256** digest — a fixed 256-bit fingerprint where any single byte change produces a completely different value. That fingerprint is what gets compared; it doesn't parse or execute the jar. ## What it compares against Gradle maintains and publishes the SHA-256 of the official wrapper jar for **every release**. The action retrieves this authoritative set of known-good checksums and asks: *does this jar's hash appear in the set?* ## Why a set, not a single value There is no one true wrapper jar. Consider: - Each Gradle version (8.5, 8.6, 8.7, …) ships its own `gradle-wrapper.jar` with a different hash. - A monorepo can have several wrappers pinned to different versions. - Over time a repo upgrades, so the 'correct' jar changes. So the only sensible check is membership: the jar is valid if its hash equals **any** officially published wrapper-jar checksum. This is an allowlist of genuine artifacts, not a single pinned value (that single-pin model is what `distributionSha256Sum` does for the distribution, a different artifact). ## Pass / fail semantics ```text hash(gradle-wrapper.jar) ∈ {published Gradle wrapper checksums} -> PASS otherwise -> FAIL (modified or unknown) ``` A failure means the jar is not a recognized official Gradle wrapper jar — it has been altered, corrupted, or built from something Gradle never released. Either way you should not run it. ## Keeping the list current Because the action pulls the checksum set from Gradle rather than bundling a frozen copy, brand-new Gradle releases are recognized without you upgrading the action — important so legitimate upgrades don't trip the gate.
- Why doesn't the action just pin one expected checksum like distributionSha256Sum does?Because many valid wrapper jars exist — one per Gradle release, possibly several in one repo. Pinning one value would reject legitimate versions; the action instead checks membership in Gradle's published set.
- What happens when a brand-new Gradle version is released?The action fetches the up-to-date checksum set from Gradle, so the new version's wrapper jar is recognized as valid without you changing anything.
saying these in an interview costs you the question
- Saying it compares against a single hardcoded checksum.
- Thinking it inspects or runs the jar's bytecode rather than just hashing it.