Skip to content

feat(#26): approved actions registry and supply chain hardening docs#36

Merged
ms280690 merged 1 commit into
issue-29-governance-observabilityfrom
issue-26-supply-chain-hardening
May 29, 2026
Merged

feat(#26): approved actions registry and supply chain hardening docs#36
ms280690 merged 1 commit into
issue-29-governance-observabilityfrom
issue-26-supply-chain-hardening

Conversation

@ms280690
Copy link
Copy Markdown
Collaborator

Summary

  • Creates docs/approved-actions.md — authoritative list of all nine external actions used in this repo, with pinned SHAs, versions, purposes, and 2026-05-21 review dates
  • Adds security review checklist for approving new actions before use
  • Documents the process for adding a new publisher to the org allowlist
  • Documents Renovate SHA update policy (pinDigests: true, no manual edits)
  • Links the doc from the Supply chain hardening row in README

Acceptance criteria status (closes #26)

Notes

Closes #26

🤖 Generated with Claude Code

Documents all nine external action references currently in use with
pinned SHAs, versions, purposes, and review dates. Includes:
- Security review checklist for approving new actions
- Step-by-step process for adding a new publisher to the org allowlist
- Renovate SHA update policy (pinDigests: true, no manual SHA edits)
- Current org allowlist patterns (ossf/*, reviewdog/*, zizmorcore/*,
  opentofu/*, terramate-io/* — GitHub-owned via github_owned_allowed)

Satisfies the docs/approved-actions.md acceptance criterion for #26.
Remaining open item: Renovate github-actions manager (tracked in #8).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@ms280690 ms280690 merged commit 2f39323 into issue-29-governance-observability May 29, 2026
8 checks passed
ms280690 added a commit that referenced this pull request May 29, 2026
* Add OpenSSF Scorecard and dependency review workflows (#29)

scorecard.yml:
- Runs weekly (Monday 06:00 UTC), on push to main, and on workflow_dispatch
- Publishes results to the OpenSSF database (public repo, OIDC-signed)
- Uploads SARIF to GitHub Security tab and as a retained artifact
- Target score >= 8.0/10 per issue #29 acceptance criteria

dependency-review.yml:
- Triggers on PRs touching any supported lockfile format
- Reusable via workflow_call with fail-on-severity and deny-licenses inputs
- Posts a summary comment on the PR via comment-summary-in-pr: always
- Default deny list: GPL-2.0, GPL-3.0, AGPL-3.0

Also brings .pre-commit-config.yaml forward from issue-25 branch so
local hooks work while that PR is pending merge.

All action references SHA-pinned per #25 authoring standards.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Address PR review comments on scorecard and dependency-review workflows

scorecard.yml:
- Remove redundant workflow-level permissions: read-all; job-level block
  is definitive (job permissions override, not merge, workflow-level)
- Add if: always() to SARIF upload so results are captured even on
  transient Scorecard failures

dependency-review.yml:
- Raise fail-on-severity default from critical to high — CVSS 8.x
  findings should not pass silently in a security-focused org library
- Add pdm.lock, mix.lock, Package.resolved to lockfile path filter
- Expose comment-summary-in-pr as a workflow_call input (default:
  on-failure) so callers can control PR comment verbosity; avoids
  requiring pull-requests: write for callers that don't want comments

Note: upload-artifact v7.0.1 SHA (043fb46d) is confirmed correct —
v7.0.1 is the current latest release of actions/upload-artifact.
The || fallback pattern on inputs.* is intentional and necessary:
inputs.default is only applied on workflow_call; pull_request-triggered
runs receive an empty string from the inputs context, requiring the
fallback to supply the default value.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Improve workflow descriptions, job names, and README documentation

scorecard.yml / dependency-review.yml:
- Add workflow-level description comments (line 2)
- Add job-level description comments
- Capitalise job display names for consistency with Actions Quality Gate

README.md:
- Add OpenSSF Scorecard and Dependency Review to workflows table
- Add usage examples for both workflows including workflow_call inputs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Add CI self-test workflow that dogfoods repo's own actions

ci.yml calls workflow-lint.yml via workflow_call and runs the
storage-optimizer composite action on every push and PR. Serves
as both a test harness and a reference implementation for consuming
repos. Also adds ci.yml to README workflows table.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Restructure: convert reusable workflows to composite actions, single ci.yml

Each workflow capability is now a standalone composite action following
the same pattern as storage-optimizer and terramate-opentofu-setup:

- .github/actions/actionlint/  — actionlint via reviewdog
- .github/actions/zizmor/      — zizmor static security analysis
- .github/actions/scorecard/   — OpenSSF Scorecard + SARIF upload
- .github/actions/dependency-review/ — dependency-review-action with inputs

Deleted reusable workflows: workflow-lint.yml, scorecard.yml,
dependency-review.yml. All logic moved into composite actions above.

ci.yml updated to one job per composite action, all running in parallel.
scorecard skips pull_request; dependency-review runs only on pull_request.
schedule trigger added to ci.yml (weekly Monday 06:00 UTC) for scorecard.

README rewritten to reflect composite-action-first structure with
per-action usage examples and required permissions documented.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Rename actionlint action to github-actionlint; update CONTRIBUTING.md

Rename .github/actions/actionlint/ → .github/actions/github-actionlint/
to make it explicit the action is specific to GitHub Actions workflows.
Update ci.yml and README references accordingly.

CONTRIBUTING.md:
- Update description from "workflows" to "composite actions" to match
  the new repo structure
- Rewrite "Adding a new workflow" → "Adding a new action" to reflect
  composite-action-first approach: create action.yml, add ci.yml job,
  update README table

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Add terramate-opentofu-setup job to ci.yml

Verifies both tools install correctly. Terramate stack steps
(generate, init, list) are no-ops in this repo since no stacks
are defined. OPENTOFU_VERSION and TERRAMATE_VERSION set via
job-level env to match the action defaults.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Fix terramate-opentofu-setup job: fetch-depth: 0 for --changed flag

terramate --changed diffs against git history; shallow clone (depth 1)
has only one commit so the flag errors. Full history required.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Fix scorecard job: require refs/heads/main, not just non-pull_request

ossf/scorecard-action hard-requires the default branch and fails with
"Only the default branch main is supported" on feature branches.
Added github.ref == 'refs/heads/main' guard so the job is skipped
on workflow_dispatch from feature branches and only runs on push
to main and the weekly schedule.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Fix scorecard action: guard SARIF uploads against missing file

When scorecard-action fails (e.g. wrong branch), scorecard-results.sarif
is not produced. The if: always() upload steps then error with
"Path does not exist". Add a check-sarif step that sets an output,
and gate both upload steps on that output so they skip cleanly
rather than error when the file is absent.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Address PR review findings: inputs, scorecard, dependabot, CODEOWNERS

terramate-opentofu-setup/action.yml:
- Fix declared inputs being dead code: replace env.OPENTOFU_VERSION /
  env.TERRAMATE_VERSION with inputs.opentofu_version / inputs.terramate_version
  so callers using `with:` actually get their version honoured

ci.yml:
- Remove env: block from terramate-opentofu-setup job (now uses input defaults)
- Gate storage-optimizer job to workflow_dispatch only — running docker prune
  on a throwaway ephemeral runner wastes CI minutes with zero benefit

scorecard/action.yml:
- Expose publish_results as an input (default: true) so private-repo callers
  can set it to false without forking the action
- Replace check-sarif shell probe + output variable with if-no-files-found: ignore
  on upload-artifact and hashFiles() gate on upload-sarif — removes a step and
  eliminates the shell-subprocess failure mode
- Add required permissions (id-token: write, security-events: write) to description

CONTRIBUTING.md:
- Add migration guide from the deleted workflow_call / workflow-lint.yml pattern
  to the equivalent composite action calls

.github/dependabot.yml: add github-actions ecosystem, weekly schedule,
  7-day cooldown to throttle supply-chain-attack-via-rapid-update vectors
.github/CODEOWNERS: require @sparkgeo/security-team review for .github/ changes
README.md: document publish_results input on scorecard action

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* perf: cancel stale runs, parallelize cleanup, skip push CI for non-workflow changes

- Add concurrency group to ci.yml: cancels in-flight runs when new push
  arrives on same ref — avoids burning extra runner minutes on stale jobs
- Add paths filter on push trigger: skip CI for doc/README-only pushes to
  main; scorecard still runs weekly via schedule so coverage unchanged
- Parallelize storage-optimizer cleanup: run all rm -rf and docker prune
  in background with & + wait instead of sequentially — saves ~20-30s on
  workflow_dispatch

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(#26): add docs/approved-actions.md and link from README (#36)

Documents all nine external action references currently in use with
pinned SHAs, versions, purposes, and review dates. Includes:
- Security review checklist for approving new actions
- Step-by-step process for adding a new publisher to the org allowlist
- Renovate SHA update policy (pinDigests: true, no manual SHA edits)
- Current org allowlist patterns (ossf/*, reviewdog/*, zizmorcore/*,
  opentofu/*, terramate-io/* — GitHub-owned via github_owned_allowed)

Satisfies the docs/approved-actions.md acceptance criterion for #26.
Remaining open item: Renovate github-actions manager (tracked in #8).

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <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