Skip to content

Conversation

@savannahostrowski
Copy link
Member

@savannahostrowskisavannahostrowski commented Dec 6, 2025

Both Android and iOS tests are quite flaky right now. Based on the convo in Discord, it seems like allowing failures is the best option.

@savannahostrowski
Copy link
MemberAuthor

I know the convo over Discord was specifically about Android but I've also been seeing this for iOS as well, so I've included it.

@savannahostrowskisavannahostrowski changed the title Temporarily allow failures iOS/AndroidTemporarily allow CI failures for iOS/AndroidDec 6, 2025
@mhsmith
Copy link
Member

mhsmith commented Dec 7, 2025

It looks like the Android issue was fixed by #142289, as there have been no Android failures on the main and 3.x branches since that was merged. So I don't think that needs to be an allowed failure now.

On the same branches, iOS has failed about 5 times in the last 2 days because of missing simulator images on the runners. @freakboy3742: did you have any possible solution to this?

Co-authored-by: Hugo van Kemenade <[email protected]>
@hugovkhugovk changed the title Temporarily allow CI failures for iOS/AndroidTemporarily allow CI failures for iOSDec 7, 2025
@freakboy3742
Copy link
Contributor

On the same branches, iOS has failed about 5 times in the last 2 days because of missing simulator images on the runners. @freakboy3742: did you have any possible solution to this?

The only solution I'm aware of at this point is to switch back to the macOS-14 runner; AFAIK the macOS-14 image isn't subject to the problem that is causing issues for macOS-15 and macOS-26 runners. The downside is that tests would be run on iOS 17, which is a little old at this point - that isn't ideal.

Is anyone aware of a way to get notifications when these failures occur? Or even search recent history for failures? I'm trying to get a sense of how frequent these issues are, if only to report to GitHub as part of the litany of macOS-15 image issues they've been working on.

The thing that is confusing is that we don't appear to see this mode of failure with BeeWare tests (or cibuildwheel tests either, to the best of my knowledge)...

@freakboy3742
Copy link
Contributor

Is anyone aware of a way to get notifications when these failures occur? Or even search recent history for failures?

Based on a manual search of failures of the Tests task on main, there's been 4 iOS test failures since Dec 29 (the last 100 CI runs), excluding 2 runs that were mass failures across multiple other platforms. 3 of those failures were in the last 24 hours. They're all failing for the same reason - a disk image that is meant to have multiple simulators installed is reporting having no simulators installed.

I do wonder if the increased frequency might be related to rolling out a new macOS-15 image version. Either way, I've posted an update on the GitHub Actions issue tracking the problem.

@hugovk
Copy link
Member

hugovk commented Dec 8, 2025

since Dec 29 (the last 100 CI runs)

I'm pretty sure we've had more than 100 runs in ~11 months :)

Or even search recent history for failures?

Here's a script that wraps the gh CLI:

Details
#!/usr/bin/env python3"""Check recent CPython build.yml workflow runs for iOS build failures.uv run check-ios-failures.py"""# /// script# requires-python = ">=3.10"# dependencies = ["prettytable", "rich"]# ///importargparseimportdatetimeasdtimportjsonimportshleximportsubprocessfromprettytableimportPrettyTable, TableStylefromrich.progressimporttrackdefosc8_link(url: str, text: str) ->str: returnf"\033]8;{url}\033\\{text}\033]8;\033\\"defrun_gh(cmd: str) ->str: result=subprocess.run( ["gh", *shlex.split(cmd)], capture_output=True, text=True, check=True, ) returnresult.stdoutdefget_recent_runs(repo: str, days_back: float) ->list[dict]: cutoff=dt.datetime.now(dt.timezone.utc) -dt.timedelta(days=days_back) cutoff_str=cutoff.strftime("%Y-%m-%dT%H:%M:%SZ") limit=int(150*days_back) output=run_gh( f"run list --repo {repo} --workflow build.yml "f"--limit {limit} --json databaseId,conclusion,createdAt,displayTitle" ) runs=json.loads(output) iflen(runs) >=limit: print(f"Warning: fetched {limit} runs, results may be incomplete") return [rforrinrunsifr["createdAt"] >=cutoff_str] defget_job_failures(repo: str, run_id: int) ->tuple[bool, bool]: """Return (ios_failed, other_failed)."""output=run_gh(f"run view {run_id} --repo {repo} --json jobs") data=json.loads(output) ios_failed=Falseother_failed=Falseforjobindata.get("jobs", []): name=job.get("name", "") ifname=="All required checks pass": continueifjob.get("conclusion") =="failure": if"ios"inname.lower(): ios_failed=Trueelse: other_failed=Truereturnios_failed, other_failedclassFormatter( argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter, ): passdefmain() ->None: parser=argparse.ArgumentParser( description="Check recent CPython build.yml runs for iOS build failures", formatter_class=Formatter, ) parser.add_argument( "-d", "--days", type=float, default=2, help="number of days to look back" ) parser.add_argument( "-r", "--repo", default="python/cpython", help="GitHub repository" ) parser.add_argument( "-m", "--markdown", action="store_true", help="output tables in markdown format" ) args=parser.parse_args() style=TableStyle.MARKDOWNifargs.markdownelseTableStyle.SINGLE_BORDERprint(f"Fetching build.yml runs from the last {args.days} days...") runs=get_recent_runs(args.repo, args.days) total=len(runs) failures= [rforrinrunsifr["conclusion"] =="failure"] num_failures=len(failures) print(f"\nTotal runs: {total}") print(f"Failures: {num_failures}") ios_failure_runs= [] forrunintrack(failures, description="Checking failed runs..."): run_id=run["databaseId"] ios_failed, other_failed=get_job_failures(args.repo, run_id) ifios_failed: full_title=run["displayTitle"] title=full_title[:30] +"…"iflen(full_title) >30elsefull_titleios_failure_runs.append((run_id, run["createdAt"], title, other_failed)) ios_only=sum(1for*_, otherinios_failure_runsifnotother) ios_plus_other=sum(1for*_, otherinios_failure_runsifother) # Summary tabletable=PrettyTable() table.set_style(style) table.field_names= ["Metric", "Count"] table.align["Metric"] ="l"table.align["Count"] ="r"table.add_row(["Total runs", total]) table.add_row(["Failed runs", num_failures]) table.add_row(["iOS + other failures", ios_plus_other]) table.add_row(["iOS only failures", ios_only]) print(f"\nSUMMARY (last {args.days} days)") print(table) ifios_failure_runs: table=PrettyTable() table.set_style(style) table.field_names= ["Run ID", "Title", "Created", "Other failures"] table.align["Title"] ="l"table.align["Other failures"] ="l"forrun_id, created_at, title, other_failedinios_failure_runs: url=f"https://github.com/{args.repo}/actions/runs/{run_id}"link=f"[{run_id}]({url})"ifargs.markdownelseosc8_link(url, str(run_id)) table.add_row([link, title, created_at, "yes"ifother_failedelse"iOS only"]) print("\nRuns with iOS failures:") print(table) if__name__=="__main__": main()

Here's 7 days' results:

MetricCount
Total runs778
Failed runs173
iOS + other failures32
iOS only failures19

Runs with iOS failures:

Run IDTitleCreatedOther failures
20016982627gh-142207: remove assertions i…2025-12-08T04:45:09ZiOS only
20010300639[3.14] gh-141732: Fix `Excepti…2025-12-07T21:04:17Zyes
20010297873gh-141732: Fix `ExceptionGroup…2025-12-07T21:04:08ZiOS only
20009409862gh-141732: Fix `ExceptionGroup…2025-12-07T19:46:24ZiOS only
20006669592gh-138122: Don't sample partia…2025-12-07T15:53:51ZiOS only
19997546915gh-68443: Replace debug level-…2025-12-07T02:13:47Zyes
19994600519gh-141388: Improve support for…2025-12-06T21:36:34Zyes
19994299998GH-142363: Contrast and gradie…2025-12-06T21:09:42ZiOS only
19994299461gh-142236: Fix incorrect keywo…2025-12-06T21:09:39ZiOS only
19991348547GH-64532: Include parent's req…2025-12-06T16:43:06ZiOS only
19990985400gh-142349: Implement PEP 8102025-12-06T16:10:32Zyes
19978475806[3.14] Introduce `build-python…2025-12-05T23:04:53ZiOS only
19976984734gh-142083: Clarify documentati…2025-12-05T21:50:42Zyes
19976791392gh-142083: Clarify documentati…2025-12-05T21:41:28Zyes
19970993664gh-81554: Add add_reader suppo…2025-12-05T17:35:59Zyes
19968999614[3.14] gh-140482: Avoid changi…2025-12-05T16:18:44ZiOS only
19968754175Add explanation comments for t…2025-12-05T16:09:23Zyes
19966117964gh-142276: Watch attribute loa…2025-12-05T14:32:23ZiOS only
19965535904gh-131372: Include LDVERSION a…2025-12-05T14:10:53ZiOS only
19956754205[3.14] gh-142214: Fix two regr…2025-12-05T08:08:19Zyes
19951049962spam2025-12-05T02:50:52Zyes
19947235648GH-139862: Remove color from…2025-12-04T23:24:34Zyes
19942618634Firmament2 rollup: tokenizer/A…2025-12-04T20:16:07Zyes
19942260019Firmament2 rollup: tokenizer/A…2025-12-04T20:03:02Zyes
19942007907Firmament2 rollup: tokenizer/A…2025-12-04T19:53:03Zyes
19941519174Firmament2 rollup: tokenizer/A…2025-12-04T19:34:09Zyes
19941260940Firmament2 rollup: tokenizer/A…2025-12-04T19:24:33Zyes
19941135626Firmament2 rollup: tokenizer/A…2025-12-04T19:19:59Zyes
19940690692Firmament2 rollup: tokenizer/A…2025-12-04T19:03:52Zyes
19940228017Firmament2 rollup: tokenizer/A…2025-12-04T18:47:26Zyes
19937252907gh-141794: Reduce size of comp…2025-12-04T17:04:21Zyes
19909113149gh-139871: Optimize bytearray …2025-12-03T21:16:48ZiOS only
19906338327gh-141976: Check stack bounds …2025-12-03T19:32:28ZiOS only
19875900577gh-142029: Raise `ModuleNotFou…2025-12-02T22:40:54Zyes
19863859746gh-129483: Make `TestLocalTime…2025-12-02T15:23:59ZiOS only
19862295675gh-140677 Add heatmap visualiz…2025-12-02T14:35:18Zyes
19858003358[3.14] Revert "gh-119452: Fix …2025-12-02T12:06:28ZiOS only
19855055657gh-142186: make PY_UNWIND avai…2025-12-02T10:16:28Zyes
19852792972Document None for timeout argu…2025-12-02T08:57:12ZiOS only
19850261887GH-142050: Jit stencils on Win…2025-12-02T07:09:10ZiOS only
19849646399Gh-142174: Explicitly disallow…2025-12-02T06:38:33Zyes
19849594509Gh-142174: Explicitly disallow…2025-12-02T06:35:50Zyes
19849291625gh-140947: fix contextvars han…2025-12-02T06:20:51Zyes
19846833554gh-81554: Add add_reader suppo…2025-12-02T04:12:15Zyes
19841987508gh-140677 Add heatmap visualiz…2025-12-02T00:14:51Zyes
19838324252gh-140677 Add heatmap visualiz…2025-12-01T21:35:35Zyes
19836858095gh-142048: Fix quadratically i…2025-12-01T20:41:51Zyes
19836186393gh-139914: Fix another stack a…2025-12-01T20:16:53ZiOS only
19834719150gh-54872: Remove default OPT=-…2025-12-01T19:22:37Zyes
19831639606gh-81554: Add add_reader suppo…2025-12-01T17:29:48Zyes
19831279870gh-142155: Fix infinite recurs…2025-12-01T17:17:20ZiOS only

@colesburycolesbury merged commit 9d39c02 into python:mainDec 8, 2025
48 checks passed
@freakboy3742
Copy link
Contributor

since Dec 29 (the last 100 CI runs)

I'm pretty sure we've had more than 100 runs in ~11 months :)

🤦 Sorry - November 29.

Here's a script that wraps the gh CLI:

Thanks for that. The "iOS + other" failures have a lot of "real" problems; but it looks like it shakes out to a 2-4% failure rate.

On that basis, it feels like it might be worth trying the macos-14 runner fix to see if that makes things better.

@hugovkhugovk changed the title Temporarily allow CI failures for iOSgh-140189: Temporarily allow CI failures for iOSDec 13, 2025
@bedevere-appbedevere-appbot mentioned this pull request Dec 13, 2025
4 tasks
hugovk added a commit to hugovk/cpython that referenced this pull request Dec 13, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@savannahostrowski@mhsmith@freakboy3742@hugovk@colesbury