ci: run independent steps in parallel - #2597
Conversation
GitHub Actions now supports running job steps concurrently via the parallel key. Group independent lint/tidy checks, Windows dependency downloads, and Docker metadata uploads so each job's wall time drops to the slowest step in the group instead of their sum.
golangci-lint holds a lock across concurrent runs on the same machine
and errors out rather than serializing ("parallel golangci-lint is
running"), so keep the two lint steps sequential and only parallelize
the two independent go.mod tidy checks.
actionlint (bundled in super-linter v8.7.0) doesn't recognize the new
"parallel" step key yet and fails the syntax check, so disable
VALIDATE_GITHUB_ACTIONS until it's updated.
|
Measured actual before/after timing on real CI runs (main baseline vs this branch) before merging further:
Total real gain across all three workflows: single-digit seconds. None of the candidates had steps long enough for max(steps) to meaningfully beat sum(steps). Against that, the changes cost real coverage: Also worth noting: running Marking as draft. Not worth merging as-is; revisiting once actionlint supports the new syntax so we don't have to disable that check. |
GitHub Actions added native parallel steps: https://github.blog/changelog/2026-06-25-actions-steps-can-now-be-run-in-parallel/
Grouped independent steps that were previously run sequentially for no reason:
tests.yaml(tests-linux): the four PHP-8.5-only lint/tidy checks (Go lint, Caddy module Go lint,go.modtidy check,caddy/go.modtidy check)windows.yaml(build): vcpkg install, Watcher download, PHP download — all independent and only consumed later byPrepare envdocker.yaml(build): builder/runner metadata artifact uploads, which write to disjoint pathsEach group now takes as long as its slowest step instead of the sum of all of them.
Not touched:
-racetest steps intests.yaml, to avoid CPU contention on shared runners affecting the race detectorstatic.yamlmanifest-push chains, since each side is itself a 2-step sequential chain rather than a single stepThis is a brand-new (~6 weeks old) Actions feature not yet in the main workflow-syntax docs, so worth watching the first few CI runs closely — in particular whether
lint.yaml's super-linter accepts the newparallelkey.