Skip to content

release(runway): cherry-pick feat(ci): derive orchestrator version from release branch - #45224

Merged
sleepytanya merged 1 commit into
release/13.43.0from
runway-cherry-pick-13.43.0-1785924691
Aug 5, 2026
Merged

release(runway): cherry-pick feat(ci): derive orchestrator version from release branch#45224
sleepytanya merged 1 commit into
release/13.43.0from
runway-cherry-pick-13.43.0-1785924691

Conversation

@runway-github

@runway-github runway-github Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Description

The Runway orchestrator (runway-extension-release-and-submit.yml) took
a required version input that had to equal the release/X.Y.Z branch
semver. It therefore carried no information the branch did not already
provide, added a way for the two to disagree, and Runway does not send
it — the first real dispatch would have failed on a missing required
input.

This removes the input and derives the version from the branch with
.github/scripts/extract-semver.sh, the same script
publish-release-from-release-head.yml uses, so the orchestrator and
the publish workflow it calls cannot disagree about which version is
being released.

Two follow-on changes fall out of that:

  • execute_store_phases now defaults to true. The false default was
    a bootstrap safety measure from feat(ci): add Runway orchestrator starter and store submission CODEOWNERS #44017 for merging the orchestrator
    before Runway was wired; leaving it would mean a Runway dispatch that
    omits the input validates everything and then does nothing. false is
    still available for a validation-only run.
  • concurrency is keyed on github.ref instead of inputs.version,
    matching publish-release-from-release-head.yml. With the input gone
    the branch is the only version source, and one in-flight run per release
    branch is the same guarantee as one per version.

release_sha is unchanged and stays optional: it is an integrity check
against the Runway record, not a version source. The skip_*
break-glass inputs are unchanged.

Also here: the AMO reviewer artifact publish has never worked

Publish AMO reviewer artifacts to S3 has reported ✅ Published in
every release since it merged (#43785) while uploading nothing.
prd-va-mmc-extension-submission-amo-reviewer-source currently holds
zero objects. Two independent causes, both fixed here:

  • The step could never report failure. It is continue-on-error: true, and the summary branched on steps.amo-reviewer-s3.conclusion,
    which is always success once continue-on-error is applied. The ⏭ Skipped and ❌ Failed branches were unreachable and the exit 1 guard
    never fired. All three references now use .outcome.
  • apt-get install -y mtree installs a package that does not exist on
    Ubuntu.
    /usr/bin/mtree comes from mtree-netbsd, which is the
    NetBSD flavour compare_builds.sh needs for mtree -c -k sha256digest -p. Verified in ubuntu:24.04: it installs from the default repos, and
    the exact invocations return 0 on identical trees and non-zero on a
    modified file.

The run history behind this: v13.39.0 through v13.41.0 died instantly at
"Prepare all required actions" because
aws-actions/configure-aws-credentials was not on the org actions
allowlist — 0 seconds, nothing packaged, nothing uploaded. That
allowlist entry exists now, so v13.42.0 got one step further and failed
with E: Unable to locate package mtree (exit 100), which skipped the
AWS credential and upload steps. The Firefox bundle script push in the
same job is unaffected and has succeeded in all of those releases.

  • The job had no time budget for what this step does.
    timeout-minutes was 45 while the publish job already spends ~9 minutes
    on Sentry, attestations and the release itself, and packaging adds two
    full cold production MV2 builds (main and Flask) for the
    reproducible-build comparison. Raised to 90.

The upload leg itself was reviewed against the platform side and
matches: the amo-reviewer-publisher trust policy pins
sub=repo:MetaMask/metamask-extension:environment:release-branch, ref
under refs/heads/release/* and job_workflow_ref to this workflow
file, all of which this job satisfies; the role's s3:PutObject grant
on reviewer-source/* covers the keys the script writes; the bucket is
AES256 so no KMS grant is needed; and the object names match what the
amo-submission Lambda reads. Note for future refactors: moving this step
into a different workflow file would break the job_workflow_ref
condition, and the role has no ListBucket/GetObject, so an S3
pre-flight check is not possible with these permissions.

Still unproven: because packaging has never completed in CI, the
reproducible-build comparison in compare_builds.sh has never executed
there. The build command it runs is character-identical to this
workflow's own (yarn webpack:lavamoat:build:mv2 [--type flask] --zip --env production), TZ=UTC is set on both sides, and the comparison
keys on content digests only, so checkout-vs-archive mtime differences
are irrelevant. The next release is the first real test.

Changelog

CHANGELOG entry: null

Related issues

Fixes:
INFRA-3674

Manual testing steps

CI-only change; no extension build or UI is involved.

Orchestrator version derivation, verifiable by dispatch:

  1. On a release/X.Y.Z branch, dispatch Runway extension release and
    store submit
    with execute_store_phases=false (validation-only, cuts
    nothing and uploads nothing).
  2. Confirm Phase 0's summary reports Version: X.Y.Z matching the
    branch, with no version input in the dispatch form.
  3. Dispatch the same workflow from a non-release branch and confirm
    Phase 0 fails at Validate branch ref.
  4. A human dispatch fails at Phase 0's Runway sender check, so
    end-to-end verification of the default execute_store_phases=true path
    requires a Runway-initiated dispatch on a real release branch.

AMO reviewer artifacts, only exercisable by a real release:

  1. After the next production release, open the Publish release job
    summary. The AMO reviewer S3 (PRD) row can no longer be a false ✅ Published — if packaging or upload fails it now reads ❌ Failed and
    the job goes red.
  2. Confirm four objects appear under
    s3://prd-va-mmc-extension-submission-amo-reviewer-source/reviewer-source/X.Y.Z/
    (production and Flask source zips plus their approval notes).
  3. If the job does go red at that step, re-run failed jobs rather than
    re-dispatching: the tag and release creation ahead of it are idempotent
    and skip when already correct.

Pre-merge author checklist

Pre-merge reviewer checklist

  • I've manually tested the PR (e.g. pull and build branch, run the
    app, test code being changed).
  • I confirm that this PR addresses all acceptance criteria described
    in the ticket it closes and includes the necessary testing evidence such
    as recordings and or screenshots.

Made with Cursor


Co-authored-by: Cursor cursoragent@cursor.com 695f92f

…om release branch (#45101)

## **Description**

The Runway orchestrator (`runway-extension-release-and-submit.yml`) took
a required `version` input that had to equal the `release/X.Y.Z` branch
semver. It therefore carried no information the branch did not already
provide, added a way for the two to disagree, and Runway does not send
it — the first real dispatch would have failed on a missing required
input.

This removes the input and derives the version from the branch with
`.github/scripts/extract-semver.sh`, the same script
`publish-release-from-release-head.yml` uses, so the orchestrator and
the publish workflow it calls cannot disagree about which version is
being released.

Two follow-on changes fall out of that:

- `execute_store_phases` now defaults to `true`. The `false` default was
a bootstrap safety measure from #44017 for merging the orchestrator
before Runway was wired; leaving it would mean a Runway dispatch that
omits the input validates everything and then does nothing. `false` is
still available for a validation-only run.
- `concurrency` is keyed on `github.ref` instead of `inputs.version`,
matching `publish-release-from-release-head.yml`. With the input gone
the branch is the only version source, and one in-flight run per release
branch is the same guarantee as one per version.

`release_sha` is unchanged and stays optional: it is an integrity check
against the Runway record, not a version source. The `skip_*`
break-glass inputs are unchanged.

### Also here: the AMO reviewer artifact publish has never worked

`Publish AMO reviewer artifacts to S3` has reported `✅ Published` in
every release since it merged (#43785) while uploading nothing.
`prd-va-mmc-extension-submission-amo-reviewer-source` currently holds
**zero objects**. Two independent causes, both fixed here:

- **The step could never report failure.** It is `continue-on-error:
true`, and the summary branched on `steps.amo-reviewer-s3.conclusion`,
which is always `success` once `continue-on-error` is applied. The `⏭
Skipped` and `❌ Failed` branches were unreachable and the `exit 1` guard
never fired. All three references now use `.outcome`.
- **`apt-get install -y mtree` installs a package that does not exist on
Ubuntu.** `/usr/bin/mtree` comes from `mtree-netbsd`, which is the
NetBSD flavour `compare_builds.sh` needs for `mtree -c -k sha256digest
-p`. Verified in `ubuntu:24.04`: it installs from the default repos, and
the exact invocations return 0 on identical trees and non-zero on a
modified file.

The run history behind this: v13.39.0 through v13.41.0 died instantly at
"Prepare all required actions" because
`aws-actions/configure-aws-credentials` was not on the org actions
allowlist — 0 seconds, nothing packaged, nothing uploaded. That
allowlist entry exists now, so v13.42.0 got one step further and failed
with `E: Unable to locate package mtree` (exit 100), which skipped the
AWS credential and upload steps. The Firefox bundle script push in the
same job is unaffected and has succeeded in all of those releases.

- **The job had no time budget for what this step does.**
`timeout-minutes` was 45 while the publish job already spends ~9 minutes
on Sentry, attestations and the release itself, and packaging adds two
full cold production MV2 builds (main and Flask) for the
reproducible-build comparison. Raised to 90.

The upload leg itself was reviewed against the platform side and
matches: the `amo-reviewer-publisher` trust policy pins
`sub=repo:MetaMask/metamask-extension:environment:release-branch`, `ref`
under `refs/heads/release/*` and `job_workflow_ref` to this workflow
file, all of which this job satisfies; the role's `s3:PutObject` grant
on `reviewer-source/*` covers the keys the script writes; the bucket is
`AES256` so no KMS grant is needed; and the object names match what the
amo-submission Lambda reads. Note for future refactors: moving this step
into a different workflow file would break the `job_workflow_ref`
condition, and the role has no `ListBucket`/`GetObject`, so an S3
pre-flight check is not possible with these permissions.

Still unproven: because packaging has never completed in CI, the
reproducible-build comparison in `compare_builds.sh` has never executed
there. The build command it runs is character-identical to this
workflow's own (`yarn webpack:lavamoat:build:mv2 [--type flask] --zip
--env production`), `TZ=UTC` is set on both sides, and the comparison
keys on content digests only, so checkout-vs-archive mtime differences
are irrelevant. The next release is the first real test.

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:
[INFRA-3674](https://consensyssoftware.atlassian.net/browse/INFRA-3674)

## **Manual testing steps**

CI-only change; no extension build or UI is involved.

Orchestrator version derivation, verifiable by dispatch:

1. On a `release/X.Y.Z` branch, dispatch **Runway extension release and
store submit** with `execute_store_phases=false` (validation-only, cuts
nothing and uploads nothing).
2. Confirm Phase 0's summary reports `Version: X.Y.Z` matching the
branch, with no `version` input in the dispatch form.
3. Dispatch the same workflow from a non-release branch and confirm
Phase 0 fails at **Validate branch ref**.
4. A human dispatch fails at Phase 0's Runway sender check, so
end-to-end verification of the default `execute_store_phases=true` path
requires a Runway-initiated dispatch on a real release branch.

AMO reviewer artifacts, only exercisable by a real release:

5. After the next production release, open the **Publish release** job
summary. The `AMO reviewer S3 (PRD)` row can no longer be a false `✅
Published` — if packaging or upload fails it now reads `❌ Failed` and
the job goes red.
6. Confirm four objects appear under
`s3://prd-va-mmc-extension-submission-amo-reviewer-source/reviewer-source/X.Y.Z/`
(production and Flask source zips plus their approval notes).
7. If the job does go red at that step, re-run failed jobs rather than
re-dispatching: the tag and release creation ahead of it are idempotent
and skip when already correct.

<!--
## **Screenshots/Recordings**

### **Before**

### **After**
-->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask
Extension Coding
Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [ ] I've included tests if applicable
- [ ] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

Made with [Cursor](https://cursor.com)

[INFRA-3674]:
https://consensyssoftware.atlassian.net/browse/INFRA-3674?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
@runway-github
runway-github Bot requested review from a team, HowardBraham and itsyoboieltr as code owners August 5, 2026 10:11
@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.

@metamask-ci metamask-ci Bot added the team-bots Bot team (for MetaMask Bot, Runway Bot, etc.) label Aug 5, 2026
@sonarqubecloud

sonarqubecloud Bot commented Aug 5, 2026

Copy link
Copy Markdown

@metamask-ci

metamask-ci Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor
Builds ready [e195261] [reused from f576b8f]
⚡ Performance Benchmarks (Total: 🟢 9 pass · 🟡 9 warn · 🔴 4 fail)

Baseline (latest main): 171ed20 | Date: 7/28/2026 | Pipeline: 30996434803 | Baseline logs

Metricschrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 openAccountMenuToAccountListLoaded(p95) [CI log]🔴 [CI log]
onboardingNewWallet
[Sentry log · main/release]
🔴 longTaskMaxDuration(p95) [CI log]🔴 [CI log]

Regressions (🔴 4 failures)

Interaction Benchmarks · Samples: 5
Benchmarkchrome-webpackfirefox-webpack
loadNewAccount
[Sentry log · main/release]
🟡 [CI log]
🟡 load_new_account
🟡 [CI log]
🟡 load_new_account
confirmTx
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
bridgeUserActions
[Sentry log · main/release]
🟡 [CI log]🟡 [CI log]
🔴 bridge_load_asset_picker

📈 Results compared to the previous 5 runs on main

  • loadNewAccount/load_new_account: +18%
  • loadNewAccount/total: +18%
  • bridgeUserActions/bridge_load_page: +22%
  • bridgeUserActions/bridge_load_asset_picker: +41%
  • bridgeUserActions/longTaskCount: +11%
  • bridgeUserActions/longTaskTotalDuration: +35%
  • bridgeUserActions/longTaskMaxDuration: +14%
  • bridgeUserActions/tbt: +32%
  • bridgeUserActions/inp: +15%
  • loadNewAccount/load_new_account: +28%
  • loadNewAccount/total: +28%
  • loadNewAccount/inp: -24%
  • loadNewAccount/fcp: -51%
  • loadNewAccount/lcp: +1160%
  • confirmTx/confirm_tx: +10%
  • confirmTx/longTaskCount: -100%
  • confirmTx/longTaskTotalDuration: -100%
  • confirmTx/longTaskMaxDuration: -100%
  • confirmTx/tbt: -100%
  • confirmTx/total: +10%
  • confirmTx/inp: -24%
  • confirmTx/lcp: +1138%
  • bridgeUserActions/bridge_load_page: +182%
  • bridgeUserActions/bridge_load_asset_picker: +1274%
  • bridgeUserActions/longTaskCount: -100%
  • bridgeUserActions/longTaskTotalDuration: -100%
  • bridgeUserActions/longTaskMaxDuration: -100%
  • bridgeUserActions/tbt: -100%
  • bridgeUserActions/total: +201%
  • bridgeUserActions/inp: +154%
  • bridgeUserActions/fcp: -47%
  • bridgeUserActions/lcp: +1134%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 loadNewAccount/FCP: p75 1.8s
  • 🟡 bridgeUserActions/FCP: p75 1.8s
  • 🟡 confirmTx/FCP: p75 1.8s
  • 🟡 bridgeUserActions/INP: p75 264ms
Startup Benchmarks · Samples: 100
Benchmarkchrome-webpackfirefox-webpack
startupStandardHome
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
startupPowerUserHome
[Sentry log · main/release]
🟡 [CI log]

📈 Results compared to the previous 5 runs on main

  • startupStandardHome/numNetworkReqs: -14%
  • startupStandardHome/uiStartup: -13%
  • startupStandardHome/load: -13%
  • startupStandardHome/domContentLoaded: -13%
  • startupStandardHome/domInteractive: -34%
  • startupStandardHome/firstReactRender: -13%
  • startupStandardHome/initialActions: -50%
  • startupStandardHome/loadScripts: -13%
  • startupStandardHome/setupStore: -19%
  • startupStandardHome/numNetworkReqs: -13%
  • startupStandardHome/fcp: -30%
  • startupStandardHome/lcp: -13%
  • startupPowerUserHome/uiStartup: +15%
  • startupPowerUserHome/firstReactRender: +13%
  • startupPowerUserHome/initialActions: +11%
  • startupPowerUserHome/setupStore: +273%
  • startupPowerUserHome/inp: +23%
  • startupPowerUserHome/lcp: +14%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 startupPowerUserHome/INP: p75 232ms
  • 🟡 startupPowerUserHome/LCP: p75 3.3s
User Journey Benchmarks · Samples: 5 · mock API 🔴 4

⚠️ Missing data: chrome/webpack/userJourneyTransactions

Benchmarkchrome-webpackfirefox-webpack
onboardingImportWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 doneButtonToHomeScreen
🔴 total
🔴 [CI log]
🔴 total
onboardingNewWallet
[Sentry log · main/release]
🔴 [CI log]
🔴 total
🔴 [CI log]
🔴 total
assetDetails
[Sentry log · main/release]
🟢 [CI log]🟢 [CI log]
solanaAssetDetails
[Sentry log · main/release]
🟢 [CI log]🟡 [CI log]
importSrpHome
[Sentry log · main/release]
🟡 [CI log]🟢 [CI log]
sendTransactions
[Sentry log · main/release]
🟡 [CI log]
swap
[Sentry log · main/release]
🟢 [CI log]

📈 Results compared to the previous 5 runs on main

  • onboardingImportWallet/doneButtonToHomeScreen: -40%
  • onboardingImportWallet/openAccountMenuToAccountListLoaded: +156%
  • onboardingNewWallet/srpButtonToPwForm: -13%
  • onboardingNewWallet/skipBackupToMetricsScreen: -11%
  • onboardingNewWallet/longTaskCount: -38%
  • onboardingNewWallet/longTaskTotalDuration: -24%
  • onboardingNewWallet/longTaskMaxDuration: +11%
  • solanaAssetDetails/assetClickToPriceChart: +44%
  • solanaAssetDetails/longTaskCount: -100%
  • solanaAssetDetails/longTaskTotalDuration: -100%
  • solanaAssetDetails/longTaskMaxDuration: -100%
  • solanaAssetDetails/tbt: -100%
  • solanaAssetDetails/total: +44%
  • solanaAssetDetails/inp: +11%
  • importSrpHome/homeAfterImportWithNewWallet: +15%
  • importSrpHome/longTaskCount: +13%
  • importSrpHome/total: +14%
  • importSrpHome/inp: +22%
  • importSrpHome/cls: -15%

🌐 Core Web Vitals — 🟢 good · 🟡 needs improvement · 🔴 poor (web.dev thresholds)

  • 🟡 importSrpHome/INP: p75 376ms
  • 🟡 solanaAssetDetails/FCP: p75 2.1s
  • 🟡 solanaAssetDetails/LCP: p75 2.8s
  • 🟡 sendTransactions/FCP: p75 2.0s
  • 🟡 sendTransactions/LCP: p75 2.6s
Dapp Page Load Benchmarks · Samples: 100
Benchmarkchrome-webpack
dappPageLoad
[Sentry log · main/release]
🟢 [CI log]
Bundle size diffs [🚨 Warning! Bundle size has increased!]
  • background: 4.52 KiB (0.03%)
  • ui: 32.88 KiB (0.19%)
  • common: 0 Bytes (0%)
  • other: 0 Bytes (0%)
  • contentScripts: 476 Bytes (0.02%)
  • zip: 11.49 KiB (0.05%)

@sleepytanya
sleepytanya merged commit 3b20760 into release/13.43.0 Aug 5, 2026
75 checks passed
@sleepytanya
sleepytanya deleted the runway-cherry-pick-13.43.0-1785924691 branch August 5, 2026 14:53
@github-actions github-actions Bot locked and limited conversation to collaborators Aug 5, 2026
@metamaskbot metamaskbot added the release-13.43.0 Issue or pull request that will be included in release 13.43.0 label Aug 6, 2026
@gauthierpetetin

Copy link
Copy Markdown
Contributor

No release label on PR. Adding release label release-13.43.0 on PR, as PR was cherry-picked in branch 13.43.0.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

release-13.43.0 Issue or pull request that will be included in release 13.43.0 risk:high team-bots Bot team (for MetaMask Bot, Runway Bot, etc.)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants