From 3dcda9fde438563cf68449ef979790eb75e0c73c Mon Sep 17 00:00:00 2001 From: jkooe <62494645+jkooe@users.noreply.github.com> Date: Mon, 9 Nov 2026 18:36:41 +0800 Subject: [PATCH] =?UTF-8?q?fix(ci):=20=E4=BF=AE=E6=AD=A3=20gradle=20?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E4=B8=8E=E7=B4=A0=E6=9D=90=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=EF=BC=8C=E5=A4=B1=E8=B4=A5=E4=BF=A1=E6=81=AF=E7=9B=B4=E6=8C=87?= =?UTF-8?q?=E6=A0=B9=E5=9B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Probe(run 343)实测结论: - job 跑在 Docker 容器内,容器里没有 java,也没有 /opt/jdk17、/opt/android-sdk、/opt/gradle - 127.0.0.1 不可达(容器内 127 指向自身);172.17.0.1(Docker 网关)17.6 MB/s;公网 370 KB/s 改动: - 素材地址顺序改为 172.17.0.1 → 127.0.0.1 → server_url(按容器/host 两种模式的实际可达性排) - 构建改用探测到的系统 gradle:本项目没有 gradlew(build.sh 用的是 /opt/gradle/gradle-8.5) - 找不到 SDK 时的报错补上「容器看不到宿主机 /opt」这一层,并给出改 host 模式的具体命令 --- .gitea/workflows/build.yml | 41 ++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index c8a1099..3dc272d 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -33,11 +33,14 @@ jobs: - name: 叠加完整素材(full-assets 分支) run: | set -e - # 地址选择:runner 通常与 Gitea 同机,走 127.0.0.1 比走配置里的公网地址快一个量级 - # (实测公网约 72KB/s,650MB 素材要 2.5 小时;同机回环是即时 IO)。 + # 地址选择(实测数据,见 Probe 探测): + # 172.17.0.1:3000(Docker 网关 → 宿主机) 17.6 MB/s ← 容器模式下的正确地址 + # 127.0.0.1:3000 不可达(容器内 127 是容器自己) + # 123.206.124.151:3000 370 KB/s(走公网绕行,慢 47 倍) + # 顺序按"容器模式优先、host 模式兜底"排:先试网关,再试回环,最后才回公网。 GH_REPO="${{ github.repository }}" GIT_URL="" - for cand in "http://127.0.0.1:3000" "http://172.17.0.1:3000" "${{ github.server_url }}"; do + for cand in "http://172.17.0.1:3000" "http://127.0.0.1:3000" "${{ github.server_url }}"; do if timeout 8 curl -sf -o /dev/null "$cand/api/v1/version" 2>/dev/null; then GIT_URL="$cand/$GH_REPO.git" echo "选用 Gitea 地址:$cand" @@ -99,9 +102,17 @@ jobs: done fi if [ -z "${ANDROID_HOME:-}" ] || [ ! -d "$ANDROID_HOME" ]; then - echo "::error::runner 上找不到 Android SDK(ANDROID_HOME 未设置且常见路径均不存在)" - echo " 请在 runner 机器安装 Android commandline-tools + platform-34 + build-tools-35.0.0," - echo " 或设置 ANDROID_HOME 环境变量后重试。" + echo "::error::找不到 Android SDK(ANDROID_HOME 未设置且常见路径均不存在)" + echo " 环境线索:java = $(java -version 2>&1 | head -1 || echo '未安装')" + if [ -f /.dockerenv ]; then + echo " ⚠ 本 job 运行在 Docker 容器内 —— 容器**看不到**宿主机的 /opt/jdk17、/opt/android-sdk。" + echo " (Probe 实测:容器内 java 不存在、/opt/* 全空、127.0.0.1 不可达、172.17.0.1 达 17.6MB/s)" + fi + echo " 两条出路:" + echo " 1)(推荐,最快)把 runner 改成 host 模式,直接复用宿主机现成环境:" + echo " sed -i 's|\"ubuntu-latest:docker://[^\"]*\"|\"ubuntu-latest:host\"|' /data/.runner" + echo " 然后重启 runner 容器。host 模式下 /opt/jdk17 与 /opt/android-sdk 直接可用。" + echo " 2) 给 runner 换一个自带 JDK17 + Android SDK 的镜像(约 +3GB)。" exit 1 fi echo "ANDROID_HOME=$ANDROID_HOME" >> "$GITHUB_ENV" @@ -141,8 +152,22 @@ jobs: ARGS="" [ "$VARIANT" = "hq" ] && ARGS="-Phq" - chmod +x gradlew - ./gradlew :app:assembleRelease $ARGS --no-daemon --stacktrace + # 本项目**不带 gradlew**(build.sh 走的是系统 gradle),所以按优先级探测可执行文件 + GRADLE_BIN="" + for c in /opt/gradle/gradle-8.5/bin/gradle /opt/gradle/bin/gradle ./gradlew; do + [ -x "$c" ] && GRADLE_BIN="$c" && break + done + if [ -z "$GRADLE_BIN" ]; then + GRADLE_BIN=$(command -v gradle 2>/dev/null || true) + fi + [ -n "$GRADLE_BIN" ] || { + echo "::error::找不到 gradle —— 项目无 gradlew,必须用系统 gradle" + echo " 期望路径:/opt/gradle/gradle-8.5/bin/gradle(build.sh 里用的就是它)" + exit 1 + } + echo "gradle: $GRADLE_BIN" + + "$GRADLE_BIN" :app:assembleRelease $ARGS --no-daemon --stacktrace APK=app/build/outputs/apk/release/app-release.apk [ -f "$APK" ] || { echo "::error::构建产物不存在:$APK"; exit 1; }