Skip to content

fix(ci): preserve build jobs in release-production when skip_e2e#2176

Merged
senamakel merged 1 commit into
tinyhumansai:mainfrom
senamakel:fix/release-prod-skip-e2e-cascade
May 19, 2026
Merged

fix(ci): preserve build jobs in release-production when skip_e2e#2176
senamakel merged 1 commit into
tinyhumansai:mainfrom
senamakel:fix/release-prod-skip-e2e-cascade

Conversation

@senamakel
Copy link
Copy Markdown
Member

@senamakel senamakel commented May 19, 2026

Summary

  • Follow-up to chore(ci): make pretest optional for release-production #2174. When skip_e2e=true on the Release Production workflow, the pretest jobs are skipped — and GitHub Actions then transitively cascades that skipped status to every downstream job whose if: lacks an explicit status function, even those that only needs: [prepare-build, create-release].
  • Result observed in run 26079423305: create-release ran (it had always()) and pushed the v0.53.52 tag + 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.
  • Adds always() && needs.<X>.result == 'success' to every downstream job, matching the proven pattern from release-staging.yml.

Problem

The release-production.yml skip_e2e path opened in #2174 looked correct in isolation: pretests are gated on !inputs.skip_e2e, and create-release was relaxed to accept pretest success OR (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 of create-release (i.e. the pretests) was skipped, even though it doesn't needs: them directly. The only escape hatch is an explicit always() (or success()/failure()/cancelled()) in the if:.

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 ✓ (tag v0.53.52 pushed, draft release created)
  • All build jobs: SKIPPED
  • cleanup-failed-release also did not fire — its condition only catches failure/cancelled, not skipped — so the orphan tag and draft release survived.

Solution

Gate every job downstream of create-release on always() && needs.<X>.result == 'success':

  • build-desktop
  • build-cli-linux
  • build-docker
  • publish-updater-manifest
  • publish-release
  • tag-docker-latest
  • record-sentry-deploy

This matches release-staging.yml's always() usage for build-desktop / build-docker / record-sentry-deploy and ensures the transitive-skipped propagation no longer cancels the build matrix when skip_e2e=true.

cleanup-failed-release is untouched — its existing condition is the right shape for the failure/cancelled paths, and a future patch could add a skipped-aware branch separately if desired.

Submission Checklist

  • N/A: workflow-only change, no application code under test
  • N/A: workflow-only change, no application code on the diff coverage gate
  • N/A: behaviour-only change
  • N/A: workflow-only change, no feature IDs affected
  • N/A: workflow-only change, no runtime dependencies introduced
  • N/A: does not touch a release-cut surface tracked by the manual smoke checklist (control-plane CI input only)
  • N/A: no linked issue

Impact

  • CI/release pipeline only. No runtime/desktop/CLI impact.
  • Fixes the skip_e2e=true path of the Release Production workflow so the build matrix actually runs and the draft release receives artifacts before publish-release flips it out of draft.
  • No change to the default skip_e2e=false path — always() plus the explicit success check is equivalent to the previous behavior when no upstream is skipped.

Related

  • Closes:
  • Follow-up PR(s)/TODOs: orphan v0.53.52 commit on main and 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

  • Key: N/A
  • URL: N/A

Commit & Branch

  • Branch: fix/release-prod-skip-e2e-cascade
  • Commit SHA: de6449f

Validation Run

  • N/A: workflow-only change, no frontend formatter delta
  • N/A: workflow-only change, no TS surface touched
  • N/A: Focused tests — workflow-only change
  • N/A: Rust fmt/check — no Rust touched
  • N/A: Tauri fmt/check — no Tauri touched

Validation Blocked

  • command: N/A
  • error: N/A
  • impact: N/A

Behavior Changes

  • Intended behavior change: when skip_e2e=true on Release Production, the build matrix actually runs instead of being transitively cascade-skipped by the skipped pretest jobs.
  • User-visible effect: Release Production with skip_e2e=true now produces a complete release (desktop installers, CLI tarballs, Docker image, updater manifest, published GitHub Release) instead of just an orphan draft.

Parity Contract

  • Legacy behavior preserved: with skip_e2e=false, every downstream job's if: still evaluates the same way — always() && needs.<X>.result == 'success' is equivalent to the previous implicit success() when no upstream is skipped.
  • Guard/fallback/dispatch parity checks: mirrors the always() && … usage in release-staging.yml (build-desktop, build-docker, record-sentry-deploy).

Duplicate / Superseded PR Handling

  • Duplicate PR(s): N/A
  • Canonical PR: N/A
  • Resolution (closed/superseded/updated): N/A

Summary by CodeRabbit

Chores

  • Improved production release workflow robustness to ensure critical build and deployment jobs execute reliably during releases.

Review Change Stack

…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
@senamakel senamakel requested a review from a team May 19, 2026 06:26
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 19, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 6de21558-3cb7-44b6-9701-05d7dcc4f940

📥 Commits

Reviewing files that changed from the base of the PR and between ce227c4 and de6449f.

📒 Files selected for processing (1)
  • .github/workflows/release-production.yml

📝 Walkthrough

Walkthrough

This PR updates seven jobs in the production release workflow with always() conditions to prevent unintended skips when upstream jobs are skipped (particularly when skip_e2e=true). Each job continues to require successful upstream results, fixing a GitHub Actions transitive skip issue.

Changes

Release Workflow Skip-Transitivity Fix

Layer / File(s) Summary
Build job skip-transitivity gates
.github/workflows/release-production.yml
build-desktop, build-docker, and build-cli-linux jobs now include always() in their if: conditions while still requiring create-release success, preventing transitive skips when E2E is skipped.
Publish and post-publish job skip-transitivity gates
.github/workflows/release-production.yml
publish-updater-manifest, publish-release, tag-docker-latest, and record-sentry-deploy jobs are updated with always() while maintaining upstream success requirements, ensuring consistent execution even when earlier steps are skipped.

Possibly related PRs

  • tinyhumansai/openhuman#1956: Both PRs change GitHub Actions job if: conditions in release workflows to prevent downstream build jobs from being skipped when upstream pretest/E2E jobs are skipped (adding always() and adjusting dependency-result handling around the skip_e2e override).

  • tinyhumansai/openhuman#1887: Both PRs modify .github/workflows/release-production.yml job gating/if/needs logic around E2E/test execution (one adds a pretest gate; the other adjusts always() conditions to prevent unintended skips), so they overlap in the release pipeline's test-result dependency handling.

  • tinyhumansai/openhuman#1955: Both PRs adjust GitHub Actions release workflow if: gating around skip_e2e so that downstream build jobs like build-desktop/build-docker run (or don't) correctly when E2E is skipped, making the changes directly related at the workflow-job level.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Poem

A hop through the workflow so spry,
No more shall our builds skip and shy,
With always() bright,
Each job gets its flight,
When E2E tests can pass on by! 🐰✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title precisely describes the primary change: fixing CI behavior to preserve build jobs in the release-production workflow when skip_e2e is used, which is exactly what the changeset accomplishes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@senamakel senamakel merged commit 17e7854 into tinyhumansai:main May 19, 2026
24 of 25 checks passed
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