Skip to content

ci: an apt/PPA outage fails a leg the same way a defect does, and every PR re-derives that from a log #672

Description

@Yaraslaut

Filed after the third occurrence in one day of CI legs going red for reasons entirely outside this repository. I flagged the pattern on PR #661 after the second and said it would be worth a ticket if a third appeared. It has.

The three occurrences, all measured

1. 2026-09-21 ~07:30Z — PR #661, four legs. ubuntu-toolchain-r PPA returning 503:

E: Failed to fetch https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu/pool/main/g/gcc-16/libgcc-s1_16-…_amd64.deb   503  Service Unavailable
##[error]Process completed with exit code 100

Confirmed across all four failing jobs (503 counts 6, 4, 6, 4). Re-running the failed jobs later cleared them and the PR merged unchanged.

2. 2026-09-21 ~12:42Z — PR #665, seven legs. Launchpad again, different symptom:

lazr.restfulclient.errors.ServerError: HTTP Error 500: Internal Server Error
b'GPGKeyTemporarilyNotFoundError'
##[error]Process completed with exit code 1

Six of the seven show that; the seventh (Linux / Qt6 WebSockets) shows the 503 form instead. Same root, two symptoms.

3. Same window — PR #671, three legs, same shape.

The cost, which is not the outage

Each occurrence cost a diagnosis cycle on a PR that had nothing to do with it, and in each case the diagnosis was only possible because someone read a job log. Concretely, on #661 the sequence was: four legs red → hypothesis that the branch's timing-shaped test was at fault → log read → PPA outage → re-run → merged unchanged. The branch was never the problem, and nothing in the check list said so.

Worse, the failures are indistinguishable from real ones at the level anyone looks first. A red Valgrind memcheck and a red Linux / all optional features (gcc) look exactly like a change that broke Valgrind and GCC. On #665 the shape was actively misleading: the PR had just been rebased onto a changed include/morph/core/bridge.hpp specifically because the combination was untested, so seven red legs was the expected shape of a real regression. They were all apt.

Verification status: reproduced three times, cause read from logs; no fix designed

What I have is nine job logs across three PRs. What I have not done: checked whether the repository could detect this condition reliably, measured how often it happens over a longer window, or established whether GitHub's own retry behaviour already covers part of it. This is a report of a pattern, not a worked solution.

What would resolve it

The goal is to make "the environment failed" distinguishable from "the change failed" without a human reading a log. Options, none of them measured:

  • Retry the dependency-installation step with backoff. Cheapest, and it would have absorbed all three of these outright — apt-level transient failures are the well-trodden case for it. Risk: it hides a genuine and persistent packaging breakage behind three slow attempts.
  • Fail the step with a distinguishable marker — an annotation or a distinct exit path saying the failure was package installation, so a reader sees it in the check list rather than in the log.
  • Cache more aggressively so a Launchpad outage does not reach the runner at all. The Cache apt packages step already exists; on bank/gui + ci: clear the eleven bank-GUI sources' clang-tidy debt, and gate the Q_OBJECT header split that no build catches early (fixes #656, fixes #659) #665 it reported Cache not found for input keys: apt-valgrind-…, so the miss is part of the story.

What would change the verdict

Close as wontfix if the measured frequency is low enough that three in one day was an unlucky window rather than a rate — that is a question about a longer sample than I have. Re-open if a fourth occurrence costs another PR a diagnosis cycle.

Related

🤖 Generated with Claude Code

https://claude.ai/code/session_01VptDWG2fKr2vBnLSJcgzgW

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: ciSubsystem: cienhancementNew feature or requesttriage: validWell-framed; implement as written

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions