CI: pre-install Rust + iOS targets to fix rustup-during-podbuild race

Build was failing with:
  component download failed for rust-std-aarch64-apple-ios-sim:
  could not rename downloaded file from '.../9362b66...partial' to
  '.../9362b66...': No such file or directory

One of the iOS pods (likely reown_walletkit's yttrium FFI or similar)
invokes rustup mid-build to fetch iOS targets. When the pod build runs
multiple targets in parallel, multiple rustup processes race on the
same .partial download file — one finishes/renames, the next looks
for the .partial that's no longer there.

Fix: add a workflow step that runs before pod install + flutter build:
  - Install rustup if missing (idempotent — self-hosted runner persists).
  - Wipe any stale *.partial files (debris from previous racing).
  - rustup target add the three iOS triples serially.

That way the pod's mid-build rustup invocation finds everything already
installed and just no-ops.
This commit is contained in:
jwinterm
2026-05-19 11:11:14 -04:00
parent 8f583b14ea
commit 1c844c58cf
2 changed files with 31 additions and 0 deletions
+18
View File
@@ -75,6 +75,24 @@ jobs:
fi
pod --version
- name: Install Rust + iOS targets (if missing)
run: |
if ! command -v rustup >/dev/null; then
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable --no-modify-path
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
export PATH="$HOME/.cargo/bin:$PATH"
fi
# Clean any partial downloads from a previously crashed install — those
# are the source of the 'could not rename .partial → final: No such
# file or directory' race that breaks parallel pod builds.
rm -rf "$HOME/.rustup/downloads"/*.partial 2>/dev/null || true
# Pre-install iOS targets serially so the pod build doesn't try to
# do it under concurrency.
rustup target add aarch64-apple-ios
rustup target add aarch64-apple-ios-sim
rustup target add x86_64-apple-ios
rustup show
- name: Install Go + gomobile (if missing)
run: |
if ! command -v go >/dev/null; then
@@ -79,6 +79,19 @@ jobs:
fi
pod --version
- name: Install Rust + iOS targets (if missing)
run: |
if ! command -v rustup >/dev/null; then
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable --no-modify-path
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
export PATH="$HOME/.cargo/bin:$PATH"
fi
rm -rf "$HOME/.rustup/downloads"/*.partial 2>/dev/null || true
rustup target add aarch64-apple-ios
rustup target add aarch64-apple-ios-sim
rustup target add x86_64-apple-ios
rustup show
- name: Install Go + gomobile (if missing)
run: |
if ! command -v go >/dev/null; then