Teach the shared actions about Rust

Merged
JE
2mo ago
+72-49

Rust arms for the shared composite actions, so an SDK that grows a rust/ crate and a conformance/runner/rust runner can call them without forking. Pure additions: for every existing language each action does exactly what it did.

What changes

  • conformance-run: language: rust runs cargo run --release --locked in conformance/runner/rust, after a Set up Rust step (dtolnay/rust-toolchain, new optional rust-toolchain input, default stable, mirroring ruby-version). The summary parser already understands the Go runner's Passed: N, Failed: M, Total: T line; the Rust runner prints the same line, so no new parsing branch.
  • service-drift: rust) target=rs-generate-services — the rs- prefix follows the abbreviation rule in MAKEFILE-CONVENTION.md (go-, ts-, rb-, swift-, kt-).
  • rubric-check: --include="*.rs" on every source grep; rust in the 4A.3 (rs-generate), 4B.1 (tests/*.rs or #[test] under rust/), 4B.3 (conformance/runner/rust) and 4C.2 (release-rust.yml) loops; clippy satisfies 4B.6 alongside typecheck/go vet/rubocop. A repo without Rust scores exactly as before; one with Rust can only gain.
  • The language / profile inputs reach the scripts through env: instead of ${{ inputs.* }} expansion inside run: — same values, and zizmor's template-injection findings on these three actions go from 11 to none. The setup steps conformance-run already had are SHA-pinned at the commit their floating major currently resolves to (setup-go@v5 → v5.6.0, setup-node@v4 → v4.4.0, setup-ruby@v1 → v1.321.0, setup-java@v5 → v5.7.0, gradle/actions@v5 → v5.0.2), so the resolved code is unchanged today and moves through Dependabot from here on.

Consumer reach

None of these three actions is referenced by a real SDK: hey-sdk, fizzy-sdk and basecamp-sdk all inline their own conformance, drift and rubric jobs (make audit-check, scripts/check-*-service-drift.sh). They are referenced by seed/.github/workflows/test.yml.tmpl, so an SDK generated after this merges gets the Rust arms; existing SDKs see nothing.

Deliberately not here

  • release-github.yml.tmpl languages: …,rust and a rust matrix entry in test.yml.tmpl — listing a language before release-rust.yml.tmpl and the seed/rust/** scaffold exist would make a freshly seeded SDK wait on a workflow it does not have. Those land together with the Rust templates, extracted from basecamp-sdk's crate.
  • A Swatinem/rust-cache step: the action caches nothing for the other languages either; add it when the runner build time warrants it.
  • Cross-runner exclusion manifests (conformance/manifests/<lang>.json) are a basecamp-sdk convention the action does not know about.

Gates

No workflows run in this repo. Locally: zizmor actions/conformance-run actions/service-drift actions/rubric-check no findings; actionlint does not lint composite actions, shellcheck on the extracted run: blocks reports nothing new.

Companion to #9 (release-orchestrate). Part of the Rust seed work.