Skip to content

ci: use partial clone for extension dependencies #181

Merged
Florian Ruppel (fruppel) merged 1 commit into
mainfrom
fix/setup-extension-partial-clone-deps
Jul 20, 2026
Merged

ci: use partial clone for extension dependencies #181
Florian Ruppel (fruppel) merged 1 commit into
mainfrom
fix/setup-extension-partial-clone-deps

Conversation

@fruppel

Copy link
Copy Markdown
Contributor

Problem

Since 2026-07-18, Downstream workflows (e.g. in shopware/Rufus) fail in 30–50 % of runs while cloning SwagCommercial:

fatal: unable to access 'https://github.com/shopware/SwagCommercial.git/': Failed sending HTTP request
##[error]cloning SwagCommercial failed after 3 attempts

Failure rate per hour (Downstream workflow, shopware/Rufus):

Period Runs Failed
Jul 18, 21h 14 6
Jul 20, 08h 22 7
Jul 20, 09h 32 11

All failures have the identical signature: the connection is rejected immediately (all 3 retry attempts fail within ~0.2 s each). SwagCommercial is simply the first dependency in the clone loop, so it always takes the hit. The pattern (instant connection failures, correlated with run volume, self-hosted runners behind shared NAT egress) points to throttling of the runner egress IPs, driven by the volume of full-history clones (~140 MB packed per clone, 30+ runs/hour).

Change

Clone dependencies with --filter=blob:none (partial clone, lazy blobs):

  • All branches/refs remain available, so the .auto branch resolution and the subsequent git checkout keep working unchanged (verified: branch checkout on a partial clone lazy-fetches the needed blobs transparently, using the same auth extraheader).
  • Historic blobs are no longer transferred, cutting per-clone traffic to a fraction and reducing both the throttling pressure and the failure window.

Notes

  • Composer path-type repos are unaffected (working tree is fully materialized).
  • vcs-type repos on the cloned path may lazy-fetch blobs on demand; the per-repo auth header set in the clone loop persists for the job, so those fetches authenticate fine.
  • This does not fully rule out the throttling issue — if failures persist, the retry/backoff should be extended and the egress IP situation raised with GitHub support.

Dependency repos (e.g. SwagCommercial) are currently cloned with full
history, which transfers the entire pack on every CI run. Since 2026-07-18
the Downstream workflows fail in 30-50% of runs while cloning
SwagCommercial ('Failed sending HTTP request'), likely due to throttling
of the runner egress IPs caused by the clone volume.

Clone with --filter=blob:none instead: all refs stay available for the
.auto branch checkout, but historic blobs are only fetched on demand,
cutting the transfer size to a fraction.
@fruppel
Florian Ruppel (fruppel) merged commit 76353d7 into main Jul 20, 2026
9 checks passed
@fruppel
Florian Ruppel (fruppel) deleted the fix/setup-extension-partial-clone-deps branch July 20, 2026 11:02
@fruppel Florian Ruppel (fruppel) changed the title Use partial clone for extension dependencies ci: use partial clone for extension dependencies Jul 20, 2026
Florian Ruppel (fruppel) added a commit that referenced this pull request Jul 20, 2026
)

The partial-clone change (#181) did not resolve the intermittent
'Failed sending HTTP request' errors when cloning SwagCommercial: the
failures occur within ~60ms, before any pack data is transferred, so
transfer volume was not the bottleneck.

curl error 55 at that stage is a typical symptom of an HTTP/2 stream
reset while the request body is being sent. SwagCommercial's fetch
negotiation request is ~15x larger than that of other dependencies
(3707 refs vs ~250), which matches it being the only repo affected.
None of the involved actions changed when the failures started
(2026-07-18), pointing at a runner-image or transport-level change.

Retry attempts now force http.version=HTTP/1.1 and enable
GIT_CURL_VERBOSE (auth headers are redacted by git). If retries
succeed consistently while first attempts keep failing, HTTP/2 is
confirmed as the trigger and can be disabled for the first attempt
as well; if they keep failing, the verbose log shows where the
connection breaks.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants