Skip to content

CI-Update20261010

Choose a tag to compare

@Sha0huaZhang Sha0huaZhang released this 10 Oct 14:42
· 10 commits to main since this release

CI-Update20261010

本次只改 CI 与测试脚本,不改任何 MacWave 运行时逻辑。已同时合入 main 与 3.0(两个分支指向同一提交)。

一、format-test 工作流的变化

文件:.github/workflows/format-test.yml

  1. 新增 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 全部保留、不动。

  2. 新增 random-test job:跑全新的随机化端到端回归,自带安装目录挑选、部署与清理,不需要 sudo /opt/macwave_config。

二、新 CI:随机化端到端回归

源码:scripts/random_test.py

覆盖内容

项目 规则
随机软件包 从 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.yml
  • scripts/random_test.py

两种格式内容完全一致;打包时已把 mtime 与属主归一化(mtime=0、uid/gid=0、gzip -n),所以同一份输入每次打出的 SHA256 相同,便于校验。