From 590605c4ebe5e7e2ece79ff3f5243a5fb9089c50 Mon Sep 17 00:00:00 2001 From: "Benedicto Franco Jr." Date: Sun, 8 Nov 2026 02:59:10 -0800 Subject: [PATCH 1/3] build: download the Gradle wrapper from Gradle's GitHub releases The wrapper fetched gradle-9.8.2-bin.zip from services.gradle.org, with a 10 s timeout and no retries. On 2026-11-08 that host returned 504 for minutes at a time, and every CI job that builds this repo failed before compiling anything, protowire's cross-port security gate included (trendvidia/protowire#592). Gradle publishes the same files as releases of gradle/gradle-distributions on GitHub, which is where CI runs. distributionSha256Sum pins the file to the checksum Gradle publishes, so the wrapper refuses anything else. --- gradle/wrapper/gradle-wrapper.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6e56573..751ac7d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.8.2-bin.zip +distributionUrl=https\://github.com/gradle/gradle-distributions/releases/download/v9.8.2/gradle-9.8.2-bin.zip +distributionSha256Sum=21bd5da2de49b642904077f38c0efdc7778e92b3ed0889392dca61b97e389607 networkTimeout=10000 retries=0 retryBackOffMs=500 From ecb1b09434977b336ffaeab29fe7329cb0008a98 Mon Sep 17 00:00:00 2001 From: "Benedicto Franco Jr." Date: Sun, 8 Nov 2026 03:18:48 -0800 Subject: [PATCH 2/3] build: let the wrapper wait 60 s and retry its download 3 times With the download moved to GitHub's releases, 3 of 6 CI jobs still failed: each stalled reading from release-assets.githubusercontent.com and gave up at networkTimeout=10000 on its only attempt ("Attempt 1/1 failed ... Read timed out"). A stalled read is what a longer timeout and a retry are for. Checked against an address that never answers: the wrapper then reports "Attempt 1/4" to "Attempt 4/4". --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 751ac7d..aed5df1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,8 +2,8 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://github.com/gradle/gradle-distributions/releases/download/v9.8.2/gradle-9.8.2-bin.zip distributionSha256Sum=21bd5da2de49b642904077f38c0efdc7778e92b3ed0889392dca61b97e389607 -networkTimeout=10000 -retries=0 +networkTimeout=60000 +retries=3 retryBackOffMs=500 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 070a16b493f36baa605be0190c2d8d970f790114 Mon Sep 17 00:00:00 2001 From: "Benedicto Franco Jr." Date: Sun, 8 Nov 2026 03:19:24 -0800 Subject: [PATCH 3/3] ci: cache the Gradle distribution in the conformance job The conformance job runs the cross-port gates, which build this repo through ./gradlew, but set up no Gradle cache. So the wrapper downloaded Gradle on every run, and the gate scripts print a build's output only when it fails. That is where 'Downloading ... failed: timeout (10000ms)' came from. The build job already caches it through setup-gradle, and on main it restores gradle-wrapper-zips-v2-* and downloads nothing. --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 16eded7..57e8098 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -94,6 +94,10 @@ jobs: distribution: temurin java-version: '21' + # The gates build this repo through ./gradlew. Without this the wrapper + # downloads Gradle on every run. + - uses: gradle/actions/setup-gradle@v6 + - name: Text gate run: "$PROTOWIRE_DIR/scripts/cross_text_check.sh"