DEVEX-1653: re-land rt_mode with transitive-skip fix#141
Conversation
… fix) Adds the rt_mode boolean input plus rt-path jobs (compute-rt-tag, gated build execution) to enable Template A callers to route through the _compute-rt-tag composite in encodium/actions. Fixes the transitive-skip cascade discovered when merging Batch 1 Template A PRs immediately post-#137: tag-and-release has `needs: [build]`, and build's own needs include compute-rt-tag (skipped on main-path). GitHub Actions' default `success()` gate on job-if propagates that transitive skipped-status through the needs chain, silently skipping tag-and-release even when build itself succeeded — resulting in empty image_tag output → downstream integration-deploy helm apply crashing on malformed YAML (`image: ghcr.io/…:` with nothing after the colon). Fix: gate tag-and-release with `if: !cancelled() && !inputs.rt_mode`. !cancelled() explicitly overrides the implicit success() gate on the transitive skipped need, restoring the intended semantics: run whenever the workflow wasn't cancelled AND we're on the non-rt path. Verified against license_api/rp_api/catalog_api/vin_decoder_service post-merge canary before Batches 3/4 landed. Refs DEVEX-1653, #137 (original), #140 (revert).
PR SummaryMedium Risk Overview On the non-rt path,
Reviewed by Cursor Bugbot for commit c26ef1b. Bugbot is set up for automated code reviews on this repo. Configure here. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit c26ef1b. Configure here.
| # (all main-builds emitted empty image_tag → helm apply crash). | ||
| tag-and-release: | ||
| name: Github Tag and Release | ||
| if: ${{ !cancelled() && !inputs.rt_mode }} |
There was a problem hiding this comment.
Release job ignores build result
Medium Severity
The new tag-and-release if uses !cancelled(), which disables GitHub Actions’ implicit success() gate on needs, but it never checks needs.build.result. After a failed or skipped build, the job can still run and push a tag or create a release without successful images.
Reviewed by Cursor Bugbot for commit c26ef1b. Configure here.


Re-lands #137 (reverted in #140) with the fix for the transitive-skip cascade in
tag-and-release.What broke
#137 added rt_mode support to the shared
build-php-v1orchestrator. Immediately after merging #137 and Batch 1 Phase 3 PRs (license_api, internal_api, rp_api, catalog_api, vin_decoder_service), all four main-builds that reached integration-deploy FAILED at helm apply with:Because
image_tagwas empty, helm renderedimage: ghcr.io/encodium/<repo>:with nothing after the colon → malformed YAML.Root cause
tag-and-releasewas silently SKIPPED on all main-path runs, even though its conditionif: !inputs.rt_modeandbuilditself both evaluate correctly.The mechanism:
tag-and-releasehasneeds: [build].buildin turn hasneeds: [calculate-tag, compute-rt-tag]. On the main-path,compute-rt-tagis skipped (it's the rt-path branch). GitHub Actions' defaultsuccess()gate on any job-if propagates the transitive skipped state through the needs chain — so tag-and-release inherits "one of my transitive needs was skipped, so I skip too" behavior even though its own direct need (build) succeeded.The parallel non-
needsjob (calculate-tag) is unaffected because it has no transitive skipped ancestors.Fix
Add
!cancelled()to tag-and-release's condition:!cancelled()explicitly overrides the implicit success() gate, restoring intended semantics: run whenever the workflow wasn't cancelled AND we're on the non-rt path. Well-known idiom for this exact class of transitive-skip bug.Test plan
Post-merge, canary against license_api by pushing an empty commit to main (or letting the next merge fire). Expected: Build.yaml runs cleanly, tag-and-release actually fires this time, emits a clean
vX.Y.Ztag, integration-deploy consumes it, helm apply succeeds.Only after canary passes do we resume merging the remaining 10 Phase 3 PRs (Batches 3/4).
Refs DEVEX-1653, #137 (original), #140 (revert).