ci: run independent release steps in parallel#4042
Open
Piotr1215 wants to merge 1 commit into
Open
Conversation
E2E Ginkgo Tests
|
The release publish job runs every setup step (tool installs, QEMU, Buildx) and both post-build uploads in sequence, even though none of them depend on each other. On the large-8_32 runner that serial setup burns a couple of minutes before goreleaser can even start. Group the independent steps with the GitHub Actions parallel-steps feature (GA 2026-06-25): the tag fetch and tool installs run concurrently and the block's implicit wait-all completes them before get_version and goreleaser consume them; the two release/ uploads run concurrently after the build. The goreleaser spine, the docker logins (serialized to avoid a config.json write race), and the version/homebrew-check steps keep their existing order. actionlint (v1.7.x) has no schema for the new keys yet and reports the parallel: steps as missing a run/uses section, so a scoped ignore for the release workflow is added to .github/actionlint.yaml; remove it once actionlint ships native support. Verified on a real large-8_32 runner before making this change: a parallel block of uses: setup actions leaves every tool on PATH after the block. Identical artifacts and the wall-clock drop confirm on the first real release.
Piotr1215
force-pushed
the
devops-1029/parallel-release-steps
branch
from
July 7, 2026 16:34
aee330b to
05bca5e
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What issue type does this pull request address? (keep at least one, remove the others)
/kind enhancement
What does this pull request do? Which issues does it resolve? (use
resolves #<issue_number>if possible)References DEVOPS-1029 (Linear). This is the vcluster pilot of a three-repo effort (vcluster, vcluster-pro, loft-enterprise); the final PR in the chain carries the
Closes.Please provide a short message that should be published in the vcluster release notes
No release note. Internal CI/release-pipeline change only; no user-facing behavior changes.
What else do we need to know?
Summary
The release
publishjob runs every setup step (tool installs, QEMU, Buildx) and both post-build uploads in sequence, even though none of them depend on each other. On thelarge-8_32runner that serial setup burns a couple of minutes before goreleaser can start. This groups the genuinely independent steps with the GitHub Actions parallel-steps feature (GA 2026-06-25) so they overlap, while every real ordering is preserved.Key Changes
.github/workflows/release.yaml,publishjob:parallel:block. The block's implicit wait-all guarantees all tools are on PATH and tags are fetched beforeget_versionand goreleaser consume them.release/uploads (upload-artifactand the release-asset attach) run inside aparallel:block. Both only readrelease/, so they are independent; the implicit wait-all still surfaces any upload failure (release-blocking, exactly as before).~/.docker/config.jsonwrite race), the version/semver/homebrew-downgrade steps, and the best-effort vcluster-docs notify steps (still serial, stillcontinue-on-error)..github/actionlint.yaml: a scopedpaths:ignore for.github/workflows/release.yaml. actionlint (v1.7.x) has no schema for the new keys yet and flags eachparallel:step as missing arun/usessection; the ignore suppresses only that one message, only for that one file. Remove it once actionlint ships native support.Validation
I verified the feature on a real
large-8_32runner with a throwaway probe before writing this change:parallel:block ofuses:setup actions leaves every tool on PATH after the block (env propagation across concurrentuses:steps works);uses:action plus an explicitwaitalso lands its tool on PATH;actionlint .github/workflows/release.yamlis clean with the scoped ignore, and the workflow is valid YAML.Known trade-off: actionlint cannot parse a
parallel:block, so it skips validation of the steps inside the two blocks (the action-pinning check among them) until it ships support for the syntax. The steps moved are stable and already pinned; the ignore is intentionally narrow and time-boxed.Dependencies
None. Independent of the vcluster-pro and loft-enterprise PRs in the same DEVOPS-1029 chain.
TODO
.github/actionlint.yamlignore once actionlint recognizesbackground/parallel/wait.E2E Tests
Additional test suites
Note
Low Risk
Internal release workflow timing only; release ordering for goreleaser, docker logins, and blocking uploads is preserved, with a temporary reduction in actionlint coverage inside the parallel blocks.
Overview
The release
publishjob now uses GitHub Actionsparallel:blocks so work that does not depend on other steps in the same group can overlap onlarge-8_32runners.Setup (before
get_version/ goreleaser): tag fetch plus tool installs (Go, Just, Cosign, Syft, QEMU, Buildx, Helm) run concurrently inside oneparallel:block, with the block’s implicit wait-all preserving the prior guarantee that tags and PATH are ready before version resolution and the build.Post-goreleaser uploads:
upload-artifactand the release-asset attach step run in a secondparallel:block; both still only readrelease/and failures remain release-blocking via wait-all.Unchanged: checkout/disk cleanup, semver/homebrew checks, serial Docker Hub/ghcr logins, the goreleaser step, and best-effort vcluster-docs notifies.
.github/actionlint.yaml: adds a file-scoped ignore for actionlint’s false “missing run/uses” errors onparallel:inrelease.yamluntil actionlint supports the syntax (DEVOPS-1029).Reviewed by Cursor Bugbot for commit aee330b. Bugbot is set up for automated code reviews on this repo. Configure here.