feat(tester): provision CI mobile bundles in shared skill

This commit is contained in:
2026-10-14 17:29:12 +08:00
parent db92baf3a7
commit 706c553778
8 changed files with 693 additions and 9 deletions
+6 -7
View File
@@ -118,27 +118,26 @@ python3 <skill-dir>/scripts/catalog.py select --root <root> \
`driver=mobile` 不是一个可以互换的平台。运行前必须根据 catalog session、用例变量或用户指定,明确本轮是 Android 还是 iOS;无法判断时先停下询问平台,不得猜测。两类平台分别执行以下闸门:
### Android
### Android(CI bundle 模式)
按顺序确认:
1. `adb` 可执行,且版本与当前 SDK 配置一致。
2. `adb devices -l` 至少有一个状态为 `device` 的目标;`unauthorized`、`offline` 或空列表都不能继续。多个目标时必须显式设置 `ANDROID_SERIAL`。
3. 被测 APK 已安装,包名与 catalog 的变量一致;可用 `adb -s "$ANDROID_SERIAL" shell pm path "$PACKAGE"` 验证。
3. 如果命令带 `--release`,由 tester skill 下载 CI manifest 指定的 APK,校验 sha256、读取 APK 身份,自动执行 `adb install -r`,再用 `adb -s "$ANDROID_SERIAL" shell pm path <package>` 验证。没有 `--release` 时才沿用已有 APK 前置条件。
4. 测试所需的 HOST、端口、局域网/DNS 和权限可从设备访问。
### iOS
### iOS(CI bundle 模式)
按顺序确认:
1. 运行节点是 macOS,并且 `xcrun`、Xcode Command Line Tools 和 `simctl` 可用。Linux/Windows 节点不能伪装成 iOS 环境;需要 macOS 或可访问的远程 Mac。
2. 模拟器用 `xcrun simctl list devices available` 确认目标存在且已启动,再用 `xcrun simctl bootstatus <UDID> -b` 确认完成启动;真机用 `xcrun xctrace list devices` 确认已连接、已信任且允许开发。
3. 被测 IPA/App 已安装,Bundle ID 与 catalog 的变量一致;模拟器可用 `xcrun simctl get_app_container <UDID> <BUNDLE_ID>` 验证。
3. 如果命令带 `--release`,由 tester skill 在 tester.ios 的 Mac 下载 CI manifest 指定的 IPA,解包读取 `Payload/*.app/Info.plist`,校验 sha256 和 Bundle ID,自动执行 `xcrun simctl install`,再用 `xcrun simctl get_app_container <UDID> <BUNDLE_ID>` 验证。没有 `--release` 时才沿用已有 App 前置条件。
4. 测试所需的 HOST、端口、局域网/DNS 和权限可从该模拟器/真机访问。
任一项不满足,都要在 preflight 汇总中列出平台、具体检查项、实际探测命令和简短输出,
然后停止整轮;不能先执行其它平台,不能改成 API 测试,也不能把它们标成产品 `fail`。
只有 preflight 全部通过后,才把对应移动用例的结果写入运行快照。
Android+iOS 默认是全量 preflight 闸门:任一项不满足,另一平台也不得安装或执行,并在记录中标为 `not-run`。只有用户显式加 `--partial` 才允许已通过的平台继续。不能改成 API 测试、不能把它们标成产品 `fail`,也不要继续初始化被闸门挡住的平台 session。记录实际探测命令及简短输出,不要把整段设备日志塞进对话。
任一项不满足,都要在 preflight 汇总中列出平台、具体检查项、实际探测命令和简短输出,然后停止整轮;只有 preflight 全部通过后,才把对应移动用例的结果写入运行快照。
### 环境缺失时的用户引导
@@ -0,0 +1,26 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["schema_version", "release", "commit", "artifacts"],
"properties": {
"schema_version": {"const": 1},
"release": {"type": "string", "minLength": 1},
"commit": {"type": "string", "pattern": "^[0-9a-fA-F]{40}$"},
"artifacts": {
"type": "object",
"required": ["android", "ios"],
"properties": {
"android": {
"type": "object",
"required": ["url", "sha256", "package"],
"properties": {"url": {"type": "string"}, "sha256": {"type": "string", "pattern": "^[0-9a-fA-F]{64}$"}, "package": {"const": "page.writes"}}
},
"ios": {
"type": "object",
"required": ["url", "sha256", "bundle_id"],
"properties": {"url": {"type": "string"}, "sha256": {"type": "string", "pattern": "^[0-9a-fA-F]{64}$"}, "bundle_id": {"const": "page.writes"}}
}
}
}
}
}
+31
View File
@@ -0,0 +1,31 @@
# CI mobile test bundle
项目 CI 负责把 APK、IPA 和 `test-bundle.manifest.json` 发布到已有的 Release;tester skill 负责消费它。
不要手工复制或安装产物。
manifest 至少包含:
```json
{
"schema_version": 1,
"release": "ci-07aa8f3",
"commit": "<40-character-commit>",
"artifacts": {
"android": {"url": "<download-url>", "sha256": "<64-hex>", "package": "page.writes"},
"ios": {"url": "<download-url>", "sha256": "<64-hex>", "bundle_id": "page.writes"}
}
}
```
运行入口:
```bash
<skill-dir>/tester run --release ci-07aa8f3 --platform android,ios
```
默认先完成 Android+iOS 双平台 preflight;任一平台无法自动准备时整轮停止。只有显式加
`--partial` 才允许运行可用平台。每个平台都必须在自己的 `tester.<platform>` 节点下载、校验、
解包、验证身份并安装,随后由现有 tester catalog 驱动真实移动 session。
运行记录写入目标项目 `.pouch/tester/runs/`,包含 manifest、sha256、身份、实际 worktree commit、
节点、安装证据和 terminal 生命周期;`automatic-repair-failed` 与产品测试失败分开记录。