PR 验证脚本
PR 验证脚本
Section titled “PR 验证脚本”市场仓库的 .github/workflows/validate-pr.yml 在每次 PR 时自动跑 scripts/validate.py,检查插件格式是否合法。CI 不过 PR 合不进去。
PR 改动以下任一路径时触发:
friend/**application/**packs/**scripts/validate.py.github/workflows/validate-pr.yml
对三个目录里的每个插件条目(一组同名 .meta.json + .mood* + .png):
1. .meta.json 格式
Section titled “1. .meta.json 格式”- 是合法 JSON
- 是 JSON 对象
- 有所有必填字段:
id/type/name/description/version/author/platforms - 每个字段类型正确(
platforms是数组等) type是friend/application/pack之一platforms数组里每个值是合法平台 id
2. 文件名一致性
Section titled “2. 文件名一致性”.meta.json的id必须和文件名主干一致moodpet.friend.default_smiley.meta.json→id必须是moodpet.friend.default_smiley
3. 插件包存在性
Section titled “3. 插件包存在性”- 同目录下有对应的
.moodfriend/.moodapp/.moodpack文件 - 同目录下有对应的
.png预览图 .png是合法 PNG(文件头检查)
4. ZIP 内 manifest 校验
Section titled “4. ZIP 内 manifest 校验”.mood*是合法 ZIP- ZIP 根目录有
manifest.json - manifest 的
id和.meta.json的id一致 - manifest 的
type和.meta.json的type一致
5. 类型特定检查
Section titled “5. 类型特定检查”Friend:
- manifest 有
interfaces.personality(string) interfaces.personality指向的文件在 ZIP 内存在
Application:
- manifest 有
entry(string) entry指向的文件在 ZIP 内存在- entry 文件做基础安全扫描(见下)
Pack:
- manifest 有
plugins对象
6. Application 安全扫描
Section titled “6. Application 安全扫描”扫描 entry 文件内容,匹配可疑模式:
os.system(...)subprocess.run/Popen/call(... shell=True)eval(open/urllib/requests...)exec(open/urllib/requests...)curl ... | sh/bash/pythonwget ... | sh/bash/python- null-terminated URL(
http://...\x00)
命中任一报 suspicious pattern,CI 红叉。这是基础扫描——挡低级错误,不替代人工 review。
7. id 唯一性
Section titled “7. id 唯一性”同目录下不能有两个插件的 id 重复。
cd moodpet-plugin-marketpython scripts/validate.py需要 Python 3.8+,无第三方依赖(只用标准库 json / zipfile / re / pathlib)。
期望输出:
friend/: 1 plugin(s) OK application/: 0 plugin(s) OK packs/: 0 plugin(s) OK
Validated 1 plugin(s).✅ All plugins valid.有违规时:
friend/: 0 plugin(s) OK
❌ 1 violation(s): - friend/bad.meta.json: meta.id (bad) must match filename stem (wrong)Workflow 文件
Section titled “Workflow 文件”.github/workflows/validate-pr.yml:
name: Validate PRon: pull_request: branches: [main] paths: - 'friend/**' - 'application/**' - 'packs/**' - 'scripts/validate.py' - '.github/workflows/validate-pr.yml'permissions: contents: readjobs: validate: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.12' - run: python scripts/validate.py常见 CI 失败原因
Section titled “常见 CI 失败原因”| 错误信息 | 原因 | 修法 |
|---|---|---|
invalid JSON |
meta.json 语法错 | 用 JSON linter 检查 |
missing required field |
少写字段 | 补齐必填字段 |
meta.id must match filename stem |
id 和文件名不一致 | 改文件名或改 id |
missing plugin package |
少了 .mood* 文件 | 把包放进去 |
not a valid zip |
包不是 ZIP | 重新打包 |
manifest.json not found in package |
ZIP 里没 manifest | ZIP 根目录放 manifest |
manifest id does not match |
包内 manifest id 和 meta id 不一致 | 统一 id |
preview file is not a valid PNG |
预览图不是 PNG | 存成 PNG |
suspicious pattern |
Application entry 有危险代码 | 改用安全 API |
duplicate plugin id |
同目录两个插件 id 重复 | 改其中一个的 id |