chore(ci): pin all GitHub Actions to full-length commit SHAs - #2508
Conversation
PR Summary by Qodochore(ci): pin GitHub Actions to full-length commit SHAs Description
Diagram
High-Level Assessment
Files changed (21)
|
Site previewPreview: https://f878ef73-site.fullsend-ai.workers.dev Commit: |
Code Review by Qodo
1. Renovate skips root workflows
|
|
🤖 Finished Review · ✅ Success · Started 2:30 PM UTC · Completed 2:40 PM UTC |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
ReviewFindingsMedium
Low
Previous runReviewFindingsMedium
Low
Previous run (2)ReviewFindingsMedium
Low
Previous run (3)ReviewFindingsMedium
Low
Labels: PR modifies CI workflow files for supply chain security hardening. Previous run (4)ReviewFindingsMedium
Low
Previous run (5)ReviewFindingsMedium
Low
Labels: PR modifies CI workflow files for supply chain security hardening. |
| }, | ||
| "packageRules": [ | ||
| { | ||
| "description": "Ignore fullsend self-references (own reusable workflows and actions)", |
There was a problem hiding this comment.
[low] API contract
matchPackagePatterns is deprecated in Renovate v38+ in favor of matchPackageNames (which now accepts regex patterns natively). While matchPackagePatterns still works today via internal migration, Renovate logs a deprecation warning and may drop support in a future major release.
Suggested fix: Replace "matchPackagePatterns": ["^fullsend-ai/"] with "matchPackageNames": ["/^fullsend-ai\\//"] (Renovate regex pattern syntax uses leading/trailing slashes).
f64eecd to
fc41cf3
Compare
|
🤖 Finished Review · ✅ Success · Started 2:55 PM UTC · Completed 3:04 PM UTC |
waynesun09
left a comment
There was a problem hiding this comment.
Review Squad — 4 findings (MEDIUM+)
Agents: 4 (claude-coder, claude-researcher, gemini-code-review, cursor-code-review)
Models: Claude, Gemini, Codex
[HIGH] Unpinned google-github-actions/auth@v3 in composite action
File: .github/actions/setup-gcp/action.yml:20 (not in this diff — file-level comment below)
This composite action references google-github-actions/auth@v3 with a floating tag, but the same action was SHA-pinned in e2e.yml to 7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 # v3.0.0. Since setup-gcp is called by 6+ reusable workflows (review, triage, retro, code, fix, prioritize), it has a wider attack surface than the single e2e.yml reference that was pinned.
Orgs with SHA-pinning enforcement (like openkaiden) will reject workflows that transitively call this unpinned action.
Suggestion: Pin to google-github-actions/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 # v3.0.0
| version: 3 | ||
|
|
||
| files: | ||
| - pattern: "internal/scaffold/fullsend-repo/.github/workflows/*.yml" |
There was a problem hiding this comment.
[high] .pinact.yaml does not cover composite action files
The files section only covers scaffold workflows. It does not include .github/actions/*/action.yml, so pinact won't lint composite actions for unpinned third-party references. The setup-gcp action already has an unpinned google-github-actions/auth@v3 (line 20) that pinact should catch.
Suggestion: Add a pattern for composite actions:
files:
- pattern: "internal/scaffold/fullsend-repo/.github/workflows/*.yml"
- pattern: ".github/actions/*/action.yml"| @@ -34,7 +34,7 @@ jobs: | |||
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |||
There was a problem hiding this comment.
[medium] actions/checkout pinned to v6.0.2 while all other main workflows use v7.0.0
This pre-existing pin was not updated by this PR. Every other workflow in .github/workflows/ now uses actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0.
Suggestion: Either upgrade to v7.0.0 for consistency or add a comment explaining why v6.0.2 is intentionally retained here.
| - name: Checkout repository | ||
| if: steps.route.outputs.stage != '' && steps.pr-check.outputs.skipped != 'true' | ||
| uses: actions/checkout@v6 | ||
| uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 |
There was a problem hiding this comment.
[medium] Scaffold workflows pin actions/checkout to v6.0.3 while main workflows use v7.0.0
All three scaffold workflows (dispatch.yml, prioritize-scheduler.yml, repo-maintenance.yml) use actions/checkout@df4cb1c0... (v6.0.3), while main .github/workflows/ files use v7.0.0. These templates render into customer repos, so the divergence may be intentional for compatibility.
Suggestion: If intentional, add a comment documenting why. Otherwise, update to v7.0.0 — Renovate will keep them synced going forward.
Pin google-github-actions/auth to SHA in setup-gcp composite action, upgrade actions/checkout from v6 to v7.0.0 in sandbox-images.yml and scaffold workflows to match the rest of the repo, and add composite action glob to .pinact.yaml so pinact catches unpinned refs there. Addresses review feedback from waynesun09 on #2508. Assisted-by: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Ralph Bean <rbean@redhat.com>
|
Pushed 9aa8f24. Pinned |
|
🤖 Finished Review · ✅ Success · Started 8:24 PM UTC · Completed 8:37 PM UTC |
|
|
||
| - name: Authenticate to Google Cloud (WIF) | ||
| uses: google-github-actions/auth@v3 | ||
| uses: google-github-actions/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 # v3.0.0 |
There was a problem hiding this comment.
[low] logic error
The PR pins google-github-actions/auth to SHA 7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 with comment v3.0.0. If this SHA corresponds to v3.0.0 rather than the latest v3.x patch, future patch fixes would be missed until Renovate bumps it.
Suggested fix: Verify the SHA corresponds to the latest v3.x tag.
waynesun09
left a comment
There was a problem hiding this comment.
Review Squad — 2 findings (MEDIUM+)
Agents: 4 (claude-coder, claude-researcher, gemini-code-review, cursor-code-review)
Models: Claude, Gemini, Codex
[HIGH] functional-tests.yml missing from PR branch — 6 unpinned third-party actions
functional-tests.yml exists on main but is absent from the pin-actions-to-sha branch (merged after the branch was cut). It still contains 6 unpinned third-party actions using mutable tags:
actions/checkout@v6.0.2(line 29)actions/setup-go@v5(line 33)actions/setup-python@v6.2.0(line 37)astral-sh/setup-uv@v7.6.0(line 42)google-github-actions/auth@v2(line 145)actions/upload-artifact@v4(line 171)
Orgs with SHA-pinning enforcement (openkaiden) will reject this workflow. The auth@v2 reference is especially sensitive since it handles WIF credentials.
Suggestion: Rebase onto current main and pin these 6 actions to full-length SHAs.
Flagged by: claude-coder, claude-researcher, gemini-code-review (3/4 agents)
waynesun09
left a comment
There was a problem hiding this comment.
Inline finding posted separately — see below.
|
|
||
| files: | ||
| - pattern: "internal/scaffold/fullsend-repo/.github/workflows/*.yml" | ||
| - pattern: ".github/actions/*/action.yml" |
There was a problem hiding this comment.
[medium] .pinact.yaml files: missing .github/workflows/*.yml pattern
The files: key in pinact v3 replaces the default scan paths when present. This config covers scaffold workflows and composite actions, but not the 14+ main workflow files under .github/workflows/. Future unpinned actions added to those files won't be caught by pinact run.
Suggestion: Add the missing pattern:
files:
- pattern: ".github/workflows/*.yml"
- pattern: "internal/scaffold/fullsend-repo/.github/workflows/*.yml"
- pattern: ".github/actions/*/action.yml"Flagged by: gemini-code-review, verified against pinact v3 docs
Organizations with SHA-pinning enforcement policies reject workflows that reference actions by tag alone. Pin every third-party action to its full commit SHA (with the version preserved as a YAML comment) so dispatched workflows pass the policy check. - Add .pinact.yaml to configure pinact (ignores fullsend-ai/* self-refs) - Pin all third-party actions in .github/workflows/ and internal/scaffold/fullsend-repo/.github/workflows/ - Extend renovate.json to scan scaffold workflow files and keep SHA pins current, while ignoring fullsend-ai self-references Closes #2385 Assisted-by: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Ralph Bean <rbean@redhat.com>
|
Rebased on main and pushed 0b6dea8. That picks up Also addressed the other findings:
Scaffold checkout versions were already at v7.0.0 from 216182b. |
|
🤖 Finished Review · ✅ Success · Started 9:36 PM UTC · Completed 9:48 PM UTC |
Resolve conflict in functional-tests.yml: keep both SHA-pinned actions from this branch and the changes-check step with skip conditionals added on main. Assisted-by: Claude claude-opus-4-6 <noreply@anthropic.com> Signed-off-by: Ralph Bean <rbean@redhat.com>
|
🤖 Finished Review · ✅ Success · Started 2:57 PM UTC · Completed 3:08 PM UTC |
|
Merge queue ejection here was the e2e |
|
🤖 Finished Retro · ✅ Success · Started 6:15 PM UTC · Completed 6:24 PM UTC |
Retro: PR #2508 — Pin GitHub Actions to SHATimeline: Human-authored PR by ralphbean to SHA-pin all third-party GitHub Actions across 22 files. The fullsend review agent ran 4 times across 3 push cycles. It found 2 medium and 1 low finding — a protected-path flag (expected), 3 unpinned actions in Review quality gap: The review bot's findings were valid but shallow. The human reviewer caught all the issues that required looking beyond the diff — checking whether the PR achieved its stated goal of pinning "all" actions. The bot's inline comment about deprecated Rework: 3 commits total (1 initial + 2 fix rounds). The 2 fix rounds were driven entirely by human review findings, not bot findings. Existing issue overlap: #2384 (validate external tool config against execution model) covers the 1 proposal filed — intent-scoped completeness checking for the review agent. Proposals filed
|
Pin google-github-actions/auth to SHA in setup-gcp composite action, upgrade actions/checkout from v6 to v7.0.0 in sandbox-images.yml and scaffold workflows to match the rest of the repo, and add composite action glob to .pinact.yaml so pinact catches unpinned refs there. Addresses review feedback from waynesun09 on fullsend-ai#2508. Assisted-by: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Ralph Bean <rbean@redhat.com>
chore(ci): pin all GitHub Actions to full-length commit SHAs
…mmit SHAs PR fullsend-ai#2508 pinned actions in .github/workflows/ and .github/actions/setup-gcp/ but missed the root action.yml composite action. Repos with strict SHA-pinning policies (e.g. openkaiden/kaiden) reject the unpinned tag refs, failing the Triage job with: "actions/setup-go@v6, actions/cache/restore@v4, and actions/upload-artifact@v7 are not allowed because all actions must be pinned to a full-length commit SHA" Pin all five remaining tag refs to match the SHAs already used in the workflow files: - actions/setup-go@v6 → v6.4.0 SHA (×2) - actions/cache/restore@v4 → v4.3.0 SHA - actions/cache/save@v4 → v4.3.0 SHA - actions/upload-artifact@v7 → v7.0.1 SHA Assisted-by: Claude Signed-off-by: Wayne Sun <gsun@redhat.com>
The pinact config and pre-commit hook only covered .github/workflows/, .github/actions/, and the scaffold workflow directory. The root action.yml was never scanned, which allowed unpinned tag refs to slip through in PR #2508 (fixed by #2621). Add action.yml to both .pinact.yaml file patterns and the pre-commit hook's file regex so unpinned refs are caught automatically. Assisted-by: Claude claude-opus-4-6 <noreply@anthropic.com> Signed-off-by: Ralph Bean <rbean@redhat.com>
Summary
.github/workflows/andinternal/scaffold/fullsend-repo/.github/workflows/to full-length commit SHAs, preserving versions as YAML comments.pinact.yamlconfig (ignoresfullsend-ai/*self-references)renovate.jsonto scan scaffold workflow files and keep SHA pins currentContext
Organizations with SHA-pinning enforcement policies (like openkaiden) reject workflows that reference actions by tag alone. This caused dispatch failures (example run).
Self-references (
fullsend-ai/fullsend/.github/workflows/reusable-*.yml@v0,fullsend-ai/fullsend/.github/actions/mint-token@v0) are intentionally left unpinned — they use floating tags that track releases.Test plan
pinact run --fix=falsereturns exit 0 for both.github/workflows/and scaffold filesmake lintpasses (including GitHub Actions workflow linter)go test ./internal/scaffold/...passes (render tests, workflow alignment tests)internal/clitest failures confirmed unrelatedCloses #2385
🤖 Generated with Claude Code