From 7915c44773f3f6ed6b1cf00312da35ef8a2b9830 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 23 Jul 2026 17:17:10 -0700 Subject: [PATCH] fix(ci): allow sticky writer rebuild to finish (#113175) * fix(ci): allow sticky writer rebuild to finish * test: register iOS release tooling ownership --- .github/actions/setup-node-env/action.yml | 13 +++++++++++-- test/scripts/ci-workflow-guards.test.ts | 4 ++++ test/scripts/test-projects.test.ts | 10 ++++++++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/.github/actions/setup-node-env/action.yml b/.github/actions/setup-node-env/action.yml index 8876547c693d..4174972ba639 100644 --- a/.github/actions/setup-node-env/action.yml +++ b/.github/actions/setup-node-env/action.yml @@ -387,15 +387,22 @@ runs: append_pnpm_option_arg PNPM_CONFIG_NETWORK_CONCURRENCY network-concurrency append_pnpm_option_arg PNPM_CONFIG_STORE_DIR store-dir append_pnpm_option_arg PNPM_CONFIG_VIRTUAL_STORE_DIR virtual-store-dir + sticky_writer_rebuild="false" if [ "$STICKY_DISK" = "true" ] && [ "$STICKY_WRITER" = "true" ] && [ "$sticky_snapshot_matches" != "true" ]; then # Pnpm can trust stale hidden install metadata even with --force. Clear only # the writer-owned modules tree; the warmed store remains on the sticky disk. find "$GITHUB_WORKSPACE/node_modules" -mindepth 1 -maxdepth 1 -exec rm -rf -- {} + install_args+=(--force) + sticky_writer_rebuild="true" fi run_pnpm_install() { - if [ "$STICKY_DISK" = "true" ]; then + if [ "$sticky_writer_rebuild" = "true" ]; then + # A full relink exceeds the ordinary retry cap; restarting discards + # several minutes of progress even when the warmed store is healthy. + timeout --signal=TERM --kill-after=15s 15m \ + pnpm "${install_args[@]}" --config.fetch-retries=0 + elif [ "$STICKY_DISK" = "true" ]; then # Pnpm can keep retrying optional platform tarballs after the # required tree is linked. Retry the whole frozen transaction from # its warmed store instead of letting minute backoffs outlive this cap. @@ -425,7 +432,9 @@ runs: rm -f "$sticky_marker" fi install_attempts=2 - if [ "$STICKY_DISK" = "true" ]; then + if [ "$sticky_writer_rebuild" = "true" ]; then + install_attempts=1 + elif [ "$STICKY_DISK" = "true" ]; then install_attempts=3 fi install_status=1 diff --git a/test/scripts/ci-workflow-guards.test.ts b/test/scripts/ci-workflow-guards.test.ts index c89ff66caf00..09ee78437182 100644 --- a/test/scripts/ci-workflow-guards.test.ts +++ b/test/scripts/ci-workflow-guards.test.ts @@ -2160,6 +2160,7 @@ describe("ci workflow guards", () => { "Sticky dependency snapshot matches the install fingerprint and importer contents; skipping pnpm install", ); expect(installStep.run).toContain("timeout --signal=TERM --kill-after=15s 4m"); + expect(installStep.run).toContain("timeout --signal=TERM --kill-after=15s 15m"); expect(installStep.run).toContain('pnpm "${install_args[@]}" --config.fetch-retries=0'); const forceStickyWriterInstall = 'if [ "$STICKY_DISK" = "true" ] && [ "$STICKY_WRITER" = "true" ] &&\n' + @@ -2169,6 +2170,9 @@ describe("ci workflow guards", () => { 'find "$GITHUB_WORKSPACE/node_modules" -mindepth 1 -maxdepth 1 -exec rm -rf -- {} +'; expect(installStep.run).toContain(clearStickyModules); expect(installStep.run).toContain("install_args+=(--force)"); + expect(installStep.run).toContain('sticky_writer_rebuild="true"'); + expect(installStep.run).toContain('if [ "$sticky_writer_rebuild" = "true" ]; then'); + expect(installStep.run).toContain("install_attempts=1"); expect(installStep.run.indexOf(forceStickyWriterInstall)).toBeLessThan( installStep.run.indexOf(clearStickyModules), ); diff --git a/test/scripts/test-projects.test.ts b/test/scripts/test-projects.test.ts index 15db45f64303..c90e846271a5 100644 --- a/test/scripts/test-projects.test.ts +++ b/test/scripts/test-projects.test.ts @@ -2848,7 +2848,10 @@ describe("scripts/test-projects changed-target routing", () => { { config: "test/vitest/vitest.unit-fast-isolated.config.ts", forwardedArgs: [], - includePatterns: ["test/scripts/android-version.test.ts"], + includePatterns: [ + "test/scripts/android-version.test.ts", + "test/scripts/ios-release-plan.test.ts", + ], watchMode: false, }, { @@ -3006,7 +3009,10 @@ describe("scripts/test-projects changed-target routing", () => { { config: "test/vitest/vitest.unit-fast-isolated.config.ts", forwardedArgs: [], - includePatterns: ["test/scripts/android-version.test.ts"], + includePatterns: [ + "test/scripts/android-version.test.ts", + "test/scripts/ios-release-plan.test.ts", + ], watchMode: false, }, {