fix(ci): preserve build jobs in release-production when skip_e2e#2176
Conversation
…duction When `skip_e2e=true`, the pretest jobs report `skipped`, and GitHub Actions propagates that skipped status transitively to any downstream job whose `if:` lacks an explicit status function (`always()` etc.) — even jobs that don't directly `needs:` the pretests. As a result, the previous patch let `create-release` run but then silently skipped the entire build matrix (desktop / cli / docker / updater / publish-release / sentry / docker-latest), producing a draft GitHub Release with no artifacts. Mirror the staging workflow's pattern: gate every job downstream of `create-release` on `always() && needs.<X>.result == 'success'` so the transitive-skipped propagation no longer takes them out. Affected jobs: build-desktop, build-cli-linux, build-docker, publish-updater-manifest, publish-release, tag-docker-latest, record-sentry-deploy. Repro: https://github.com/tinyhumansai/openhuman/actions/runs/26079423305
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughThis PR updates seven jobs in the production release workflow with ChangesRelease Workflow Skip-Transitivity Fix
Possibly related PRs
Estimated code review effort🎯 2 (Simple) | ⏱️ ~8 minutes Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Comment |
Summary
skip_e2e=trueon the Release Production workflow, the pretest jobs are skipped — and GitHub Actions then transitively cascades thatskippedstatus to every downstream job whoseif:lacks an explicit status function, even those that onlyneeds: [prepare-build, create-release].create-releaseran (it hadalways()) and pushed thev0.53.52tag + commit, but the entire build matrix (desktop / cli / docker / updater / publish-release / sentry / docker-latest) silently skipped, leaving a broken release attempt with no artifacts.always() && needs.<X>.result == 'success'to every downstream job, matching the proven pattern fromrelease-staging.yml.Problem
The
release-production.ymlskip_e2epath opened in #2174 looked correct in isolation: pretests are gated on!inputs.skip_e2e, andcreate-releasewas relaxed to accept pretestsuccessOR (skip_e2e&&skipped). That part worked.But GitHub Actions has a documented behavior where a job's default success-check propagates transitively — a job with
if: needs.create-release.result == 'success'is still treated as skipped if any job upstream ofcreate-release(i.e. the pretests) was skipped, even though it doesn'tneeds:them directly. The only escape hatch is an explicitalways()(orsuccess()/failure()/cancelled()) in theif:.The staging workflow already uses
always() && …everywhere for exactly this reason; production was missing it.Concrete consequence in production run 26079423305:
Prepare build context✓Create GitHub release✓ (tagv0.53.52pushed, draft release created)cleanup-failed-releasealso did not fire — its condition only catchesfailure/cancelled, notskipped— so the orphan tag and draft release survived.Solution
Gate every job downstream of
create-releaseonalways() && needs.<X>.result == 'success':build-desktopbuild-cli-linuxbuild-dockerpublish-updater-manifestpublish-releasetag-docker-latestrecord-sentry-deployThis matches
release-staging.yml'salways()usage forbuild-desktop/build-docker/record-sentry-deployand ensures the transitive-skipped propagation no longer cancels the build matrix whenskip_e2e=true.cleanup-failed-releaseis untouched — its existing condition is the right shape for thefailure/cancelledpaths, and a future patch could add askipped-aware branch separately if desired.Submission Checklist
Impact
skip_e2e=truepath of the Release Production workflow so the build matrix actually runs and the draft release receives artifacts beforepublish-releaseflips it out of draft.skip_e2e=falsepath —always()plus the explicitsuccesscheck is equivalent to the previous behavior when no upstream is skipped.Related
v0.53.52commit onmainand any leftover draft release/tag from run 26079423305 need manual cleanup (out of scope for this PR).AI Authored PR Metadata (required for Codex/Linear PRs)
Linear Issue
Commit & Branch
Validation Run
Validation Blocked
Behavior Changes
skip_e2e=trueon Release Production, the build matrix actually runs instead of being transitively cascade-skipped by the skipped pretest jobs.skip_e2e=truenow produces a complete release (desktop installers, CLI tarballs, Docker image, updater manifest, published GitHub Release) instead of just an orphan draft.Parity Contract
skip_e2e=false, every downstream job'sif:still evaluates the same way —always() && needs.<X>.result == 'success'is equivalent to the previous implicitsuccess()when no upstream is skipped.always() && …usage inrelease-staging.yml(build-desktop, build-docker, record-sentry-deploy).Duplicate / Superseded PR Handling
Summary by CodeRabbit
Chores