Repository navigation
CI-Update20261010
CI-Update20261010
本次只改 CI 与测试脚本,不改任何 MacWave 运行时逻辑。已同时合入 main 与 3.0(两个分支指向同一提交)。
一、format-test 工作流的变化
文件:.github/workflows/format-test.yml
-
新增 Python 3.15 矩阵:原来
python-version固定为'3.14',现在改为矩阵strategy: fail-fast: false matrix: python-version: ['3.14', '3.15']
3.14 是环境下限(
.conda包依赖 3.14 的compression.zstd),3.15 是上游最新正式版(2026-10-09 发布)。
fail-fast: false保证一条线挂掉不会取消另一条,便于判断是哪个版本的问题。
原有的configpath_test.sh/audit_deps.py/format_test.sh/deps_test.sh/link_test.sh/selfupdate_test.sh全部保留、不动。 -
新增
random-testjob:跑全新的随机化端到端回归,自带安装目录挑选、部署与清理,不需要sudo /opt/macwave_config。
二、新 CI:随机化端到端回归
覆盖内容
| 项目 | 规则 |
|---|---|
| 随机软件包 | 从 infosource 的 pkginfo_<arch> 抽 10~20 个,必含 wget;产物体积 > 40MB 的包重抽(HEAD 探 Content-Length);test_* 测试夹具默认排除。逐个 install → 校验 → uninstall。 |
| 版本号指定 | 指定 / 不指定各约一半,但两组都必须落在 [5, 15] 内,否则重新分配。校验含:安装目录、不带版本号的软链接、SHA256 通过、二进制可执行(dyld 未解析即失败)、wave list 可见。 |
| 版本号异常 | 指定版本号的包里,1~2 个不存在的版本、1~2 个非法版本(not-a-version、1.0.0-!!!、..%2f..%2fetc%2fpasswd、v1.2.3@beta),其余正常。这些 token 同样喂给 install / info / search。 |
-C 断点续传 |
同一次下载随机打断 0~3 次,每轮都断言 .partial 从未回退(即真的续传而非重下)、进度条有渲染;结尾断言完整装好。 |
--skip-ssl |
断言出现 You selected --skip-ssl 安全提示,且回答 y / n 都能正常下载(n 时仍做 SHA256 校验)。 |
--limit-rate |
全程采样 .partial 增长算瞬时速率(默认 400K,容差 ×1.5),结尾再用 体积/时间 复核全程平均速度(容差 ×1.25)。 |
| Mach-O 重定向中断 | 普通安装有 5% 概率在 surfboard/transfer.sh 运行期间发 SIGINT;断言进程干净退出(无栈回溯),并断言再次 install 能收敛到完整正确;打断后的半成品状态记为 WARN(现状会留下半个 bin/ 目录且对 wave list 可见)。 |
| 固定命令覆盖(必测) | list / search / info / selfupdate / link / linkquery / unlink 各 5 次;install / uninstall 由随机包循环覆盖。 |
| 非法输入 | 5 个非法命令;裸 -h / --help / -V / --version 以及各自带非法参数的形式;任何命令都有 10% 概率被插入非法参数。 |
| 参数形态 | 等效参数长/短形式随机(-h/--help、-V/--version、-a/--all、-C/--continue、-v/--verbose)。 |
| 随机安装目录 | 每次随机挑一种方案,其中 33% 概率是自定义方案 ~/test dir(顺带压空格路径);另有随机 HOME(配置目录一起随机)、中文/深层路径等方案。跑完只清理自己创建的东西。 |
用法
python3 scripts/random_test.py --infosource infosource-data调试 / 复现用参数(都已实现):
--seed N 固定随机种子,复现某次失败
--count N 覆盖 10~20 的包数
--packages a,b,c 指定包名
--dry-run 只打印计划,不执行任何 wave 命令
--no-size-probe 跳过 HEAD 探体积(离线自测)
--include-test-packages 把 test_* 也放进随机池
--config-dir DIR 覆盖配置目录
--limit-rate 400K 限速测试用的速率
--transfer-interrupt-probability 覆盖 5% 的重定向中断概率(调试可设 1)
--keep 跑完保留安装目录
安全约束
脚本只清理本次运行亲手创建的目录。已存在的配置目录(可能是一份真实安装)或已存在的非空安装目录会被直接拒绝而不是覆盖——这条是硬性要求。
已知限制
search/info/ 不带版本的install会访问api.github.com。未认证只有 60 次/小时,而 Runner 共用出口 IP,因此可能被限流;被判定为限流的用例记为 SKIP(不计失败)而不是伪装成产品 bug。若要彻底消除,需要让运行时代码(pkg/pkginfohelper.py、pkg/pkginstaller.py)像scripts/audit_deps.py那样在有GH_TOKEN时带上Authorization头,并在 CI 注入secrets.GITHUB_TOKEN——本次未改动运行时代码。- 依赖公网(GitHub Releases / conda.anaconda.org / raw.githubusercontent.com)。
- 每个矩阵线最多 20 个包、单包上限 40MB,最短也可能跑到几十分钟;job 设了
timeout-minutes: 150。 selfupdate在这条流程里走「已是最新」的短路分支(VERSION.json写成 configdata 的当前版本),真实自更新仍由scripts/selfupdate_test.sh覆盖。
三、产物
format-test.yml— 更新后的 CI 工作流源码random_test.py— 新增的随机化回归脚本源码
本 Release 未设为 latest,MacWave 自身的「最新版本」仍由
MacWaveOrg/configdata的versiondata/latest_version决定。
四、整合打包(附件)
除了两个单独的源码文件,本次 Release 还附上了把全部新 CI 整合在一起的两种归档:
| 附件 | 大小 | SHA256 |
|---|---|---|
ci-update20261010.tar |
61,440 字节 | 33e921d2cbba5daccb23f6d41dc25cc5964a2120422d573da886932c36b785fe |
ci-update20261010.tar.gz |
17,345 字节 | f64cc01e7361335983f82154d062d68e079dc8a4285faa61ecae085e317f67bb |
归档内保持仓库内的相对路径,所以解到仓库根目录就能直接落位:
tar -xf ci-update20261010.tar -C /path/to/MacWave
tar -xzf ci-update20261010.tar.gz -C /path/to/MacWave包含:
.github/workflows/format-test.ymlscripts/random_test.py
两种格式内容完全一致;打包时已把 mtime 与属主归一化(mtime=0、uid/gid=0、gzip -n),所以同一份输入每次打出的 SHA256 相同,便于校验。