Skip to content

ci: consolidate action pins — one SHA per action, no moving tags - #49

Open
noahgift wants to merge 1 commit into
mainfrom
ci/consolidate-action-pins
Open

ci: consolidate action pins — one SHA per action, no moving tags#49
noahgift wants to merge 1 commit into
mainfrom
ci/consolidate-action-pins

Conversation

@noahgift

Copy link
Copy Markdown
Contributor

The fleet asks GitHub for six different actions/checkout refs, and each is a separate cache entry on each of 16 runners. Measured 2026-08-17:

ref resolves to uses
@v7 (tag) v7.0.1 31
@df4cb1c0… v6.0.3 20
@de0fac2e… v6.0.2 13
@v6, @v5 (tags) 4
@34e11487… ← this file v4.3.1 6

16 runners × 6 refs ≈ 96 downloads of one action, which is why CI spent the afternoon failing on:

Failed to download action 'https://codeload.github.com/actions/checkout/tar.gz/...'
429 (Too Many Requests) ... after 3 attempts

This is not an API rate limit

gh api rate_limit read core 106/5000, graphql 0/5000 while it was happening. codeload.github.com is a different endpoint with no published limit — so "we're inside our documented budget" and "we're being 429'd" are both true simultaneously, and nothing in rate_limit will ever show it. The amplification is ours.

Why this file first

Every repo consumes it, and it was pinning the oldest checkout in the fleet — v4.3.1, three majors behind everything else.

actions/checkout         34e11487 (v4.3.1)  ->  3d3c42e5 (v7.0.1)
actions/upload-artifact  @v4 (moving tag)   ->  ea165f8d (v4.6.2)

v7.0.1 is not a leap into the unknown: 31 uses across the fleet already run @v7, which resolves to exactly this commit today and passes. For those it becomes a no-op that removes a moving tag; for this file it is the upgrade it had been missing.

Supply chain, not just bandwidth

No moving tags remain in this workflow. A moved tag is both a re-download and an unaudited change.

Follow-up

Per-repo pins still need consolidating onto the same SHA — mechanical, sequenced after the open dependabot bumps rather than colliding with them.

A shared runner-level cache (ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE, confirmed present in runner 2.336.0) would remove the 16× multiplier too, but its seeding convention isn't recoverable from the binary and needs an empirical test first.

🤖 Generated with Claude Code

The fleet asks GitHub for SIX different `actions/checkout` refs, and each one
is a separate cache entry on each of 16 runners. Measured 2026-08-17:

  @v7          (tag)      31 uses    -> v7.0.1 today
  @df4cb1c0…              20         -> v6.0.3
  @de0fac2e…              13         -> v6.0.2
  @v6, @v5     (tags)      4
  @34e11487…   THIS FILE   6         -> v4.3.1

16 runners x 6 refs is ~96 downloads of one action, which is why CI spent the
afternoon failing on

  Failed to download action 'https://codeload.github.com/actions/checkout/...'
  429 (Too Many Requests) ... after 3 attempts

That is NOT an API rate limit — `gh api rate_limit` read core 106/5000 and
graphql 0/5000 at the time. codeload is a different endpoint with no published
limit, so being inside the documented budget and being 429'd are both true at
once. The amplification is ours.

This file is the highest-leverage single place: every repo consumes it, and it
was pinning the OLDEST checkout in the fleet — v4.3.1, three majors behind.

  actions/checkout        34e11487 (v4.3.1) -> 3d3c42e5 (v7.0.1)
  actions/upload-artifact @v4 (moving tag)  -> ea165f8d (v4.6.2)

v7.0.1 is not a leap into the unknown: 31 uses across the fleet already run
`@v7`, which resolves to exactly this commit today and passes. For those it is
a no-op that removes a moving tag; for this file it is the upgrade it had been
missing.

No moving tags remain in this workflow. A moved tag is both a re-download and
an unaudited change, so pinning is a supply-chain fix as much as a bandwidth
one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.

1 participant