问题位置:.github/workflows/flutter-release.yml,Publish release to backend 步骤(约第 262-320 行,本次提交新增)。
问题:该步骤的 Python 块与 curl 命令对"哪些 APK 实际存在"持不同假设:
- Python 块(用
if not os.path.exists(path): continue 过滤)只把存在的 APK 写入 meta.json 的 files 数组。
- 但紧随其后的 curl 命令无条件附加全部 3 个
-F "files=@...":
curl --fail-with-body -sS -X POST \
"$BACKEND_URL/api/admin/app/releases/publish" \
-H "X-API-TOKEN: $BACKEND_TOKEN" \
-F "meta=@$APK_DIR/meta.json;type=application/json" \
-F "files=@$APK_DIR/app-arm64-v8a-release.apk" \
-F "files=@$APK_DIR/app-armeabi-v7a-release.apk" \
-F "files=@$APK_DIR/app-x86_64-release.apk"
- 只要任何一个 APK 缺失(构建变体精简、CI 缓存异常、armv7 旧机器上 archive 失败等),curl 在
-F 解析阶段就报 curl: (26) Failed to open/read local data,整个发布失败。
影响:
meta.json 内容与 files 字段不一致:meta 声称只有 N 个文件,但 curl 实际尝试发 N+k 个(k=缺失的),后端 publish 端点对多余/缺失文件的容错行为未在本次变更中确认,可能产生 4xx/5xx。
continue-on-error: true 把发布失败静默吞掉,CI 跑出 ✅ 绿勾但后端实际没同步——若产品方把"绿 = 已同步"作为约定,发布链路就出现不可见的"成功假象"。
- 缺失部分 ABI 时,本来想推到 GitHub Releases 的发布就少了这一份镜像分发。
修复建议(任选其一,按简洁度排):
- 让 Python 块同时输出"实际存在的 APK 文件名列表"到 env(如
EXISTING_FILES),curl 之前用 bash for 循环动态生成 -F files=@... 参数。
- 在 Python 块中直接用
subprocess.run 调 curl,把 -F 参数根据 entries 动态构造。
- 至少加一个
for f in app-*.apk; do [ -f "$APK_DIR/$f" ] && ... ; done 的 bash 守卫,给每个缺失文件打 ⚠️ 跳过,让日志可读。
同时建议:把 continue-on-error: true 改为 continue-on-error: false 并配 Slack/邮件告警,至少在"早期"之外也加一条注释说明何时切换为强校验——当前注释写"跑稳后可移除",但没有触发条件可观察("跑稳"无定义)。
忽略指南:在项目根 .cr-ignore.md 追加:
- issue: <CR_IGNORE_IID_NUM>
reason: <你的理由>
下次审查会自动关闭。
问题位置:
.github/workflows/flutter-release.yml,Publish release to backend步骤(约第 262-320 行,本次提交新增)。问题:该步骤的 Python 块与 curl 命令对"哪些 APK 实际存在"持不同假设:
if not os.path.exists(path): continue过滤)只把存在的 APK 写入meta.json的files数组。-F "files=@...":-F解析阶段就报curl: (26) Failed to open/read local data,整个发布失败。影响:
meta.json内容与files字段不一致:meta 声称只有 N 个文件,但 curl 实际尝试发 N+k 个(k=缺失的),后端publish端点对多余/缺失文件的容错行为未在本次变更中确认,可能产生 4xx/5xx。continue-on-error: true把发布失败静默吞掉,CI 跑出 ✅ 绿勾但后端实际没同步——若产品方把"绿 = 已同步"作为约定,发布链路就出现不可见的"成功假象"。修复建议(任选其一,按简洁度排):
EXISTING_FILES),curl 之前用 bashfor循环动态生成-F files=@...参数。subprocess.run调 curl,把-F参数根据entries动态构造。for f in app-*.apk; do [ -f "$APK_DIR/$f" ] && ... ; done的 bash 守卫,给每个缺失文件打⚠️ 跳过,让日志可读。同时建议:把
continue-on-error: true改为continue-on-error: false并配 Slack/邮件告警,至少在"早期"之外也加一条注释说明何时切换为强校验——当前注释写"跑稳后可移除",但没有触发条件可观察("跑稳"无定义)。忽略指南:在项目根
.cr-ignore.md追加:reason: <你的理由>
下次审查会自动关闭。