如何顺利通过Astrid严苛的CI:5道PR门禁从模板校验到账户年龄检查
【免费下载链接】handbookContributor handbook for Astrid: the polyrepo, public contracts, contribution process, and release workflow.项目地址: https://gitcode.com/gh_mirrors/handbook76/handbook
Astrid 是一个基于 polyrepo(多仓库)架构的安全敏感型 WASM 运行时,官方贡献者手册 handbook 完整记录了它的 CI 门禁体系。想向内核仓库提交 Pull Request?别急——在代码跑测试之前,还有5 道 PR 门禁会先审查你:模板校验、贡献者等级、文件行数、Issue 关联、账户年龄。本文带你逐条拆解这些检查的触发条件和放行技巧,让 PR 一次通过,不再反复被 CI 打回。
为什么 Astrid 的 CI 如此"严苛"?
Astrid 的每一次改动都要对照威胁模型审查,而不只是功能正确性。门禁全部由 CI 强制执行,规则定义在以下文件中:
- 门禁主流程:
core/.github/workflows/pr-checks.yml - PR 模板:
core/.github/pull_request_template.md - 贡献者等级表:
core/.github/contributors.yml
| 顺序 | 门禁任务 | 检查什么 | 不通过会怎样 |
|---|---|---|---|
| 1 | template | PR 描述四大章节是否填写 | 直接失败,阻塞合并 |
| 2 | contributor-gate | 你的等级能否碰这些文件 | 新贡献者需人工放行 |
| 3 | file-size | 源文件是否超过 1000 行 | 直接失败 |
| 4 | linked-issue | 是否关联了 Issue | 直接失败 |
| 5 | account-age | 新账户的风险信号 | 发出警告,进入重点审查 |
门禁一:template 模板校验——别留空章节
template任务在 PR 的每次 open、edit、reopen、synchronize 事件上都会运行,校验 PR 描述是否完整填写了模板的 4 个章节:
- Linked Issue——必须包含真实的 Issue 编号,如
Closes #843 - Summary——PR 做了什么、为什么做
- Changes——要点列表
- Test Plan——自动化测试与 clippy 情况
任何章节留空或只保留占位注释,template任务都会失败。💡 小技巧:写完草稿后自查一遍,每个标题下都有"真内容"再提交。
门禁二:contributor-gate 贡献者等级检查
Astrid 采用四级贡献者体系,CI 直接读取core/.github/contributors.yml判定你的等级,再逐个比对 PR 修改的文件路径:
| 等级 | 权限 | 门禁行为 |
|---|---|---|
| New(默认) | 未列名者 | 必须等维护者打上newcomer-approved标签后 CI 才继续 |
| Astrinaut | CLI、SDK、capsules、文档、测试 | 触碰安全关键 crate 或核心 crate 路径 → 硬性失败 |
| Core | 可改核心 crate | 触碰安全关键路径 → 警告,要求维护者共同评审 |
| Maintainer | 完全访问 | 无条件通过 |
两套受保护路径是硬红线:
- 安全关键路径(8 个 crate):
astrid-crypto、astrid-capabilities、astrid-audit、astrid-approval、astrid-vfs、astrid-storage、astrid-sys、astrid-core - 核心路径(5 个 crate):
astrid-kernel、astrid-events、astrid-hooks、astrid-config、astrid-mcp
等级提升没有申请流程,全靠已合并工作的质量说话。新手的第一站建议从 capsules 或文档入手,攒够一次成功贡献后晋升 Astrinaut。
门禁三:file-size 千行文件红线
file-size任务会把 PR 修改的每个文件与基线分支的行数对比:原本不足 1000 行、被你的 PR 推到 1000 行以上的文件,一律拒绝。基线上就已经超标的文件只会被标注,不会阻塞。
两条实用建议:
- 文件接近 1000 行时主动拆分为子模块目录(官方范例:
astrid-capsule/src/manifest/从一个千行文件拆成mod.rs、capabilities.rs、topics.rs) large-file-ok标签可以绕过此检查,但实际只有维护者能加,且仅适用于边界难以渐进划分的重构
门禁四:linked-issue Issue 先行原则
这是新手最容易踩的坑:没有 Issue,就没有 PR。linked-issue任务会同时用正则匹配 PR 描述中的Closes #N,并调用 GraphQL 接口查询侧边栏是否已关联 Issue,双保险。
- ✅ 已有 Issue:PR 描述里写
Closes #843 - ✅ 没有 Issue:先开一个,再发 PR
- ❌ 无 Issue、无前期讨论的"顺手改"PR → 会被直接关闭
注意:Issue 先行规则在实践中适用于所有仓库,但 CI 层面的强制执行只存在于内核仓库,capsules 与 RFC 仓库不跑contributor-gate检查。
门禁五:account-age 账户年龄检查
最后一道门禁针对的是"新鲜面孔"。account-age任务对关联标识为 NONE / FIRST_TIMER / FIRST_TIME_CONTRIBUTOR 的全新 GitHub 账户运行,在以下情况发出警告(不直接阻断):
- ⏰ 账户注册不足30 天
- ⚠️ 没有任何公开仓库且没有关注者
警告的意义在于把这类 PR 推入重点审查队列。对新账户来说,最好的自保策略是:描述写得详尽、diff 范围收敛、边界变更(host function、能力检查、IPC 主题、审计动作)在 PR 摘要中显式声明,而不是埋在无关的改动里。
附加关卡:别忘了 CHANGELOG 和标准 CI
PR 描述之外还有两道常见关卡:
- changelog 检查(
.github/workflows/changelog.yml):任何修改.rs文件或Cargo.toml的 PR,都必须在CHANGELOG.md的[Unreleased]下补一条记录,否则被拒。纯文档/CI 改动可加skip-changelog标签豁免 - 标准流水线(
.github/workflows/ci.yml):cargo check、cargo fmt --check、cargo clippy -- -D warnings、全量测试、MSRV 1.95 校验与cargo audit漏洞扫描,全部钉死在 Rust 1.95
另外记住两条"纪律性"红线:版本号升级必须单独开 PR,绝不混进功能或修复 PR;提交必须 GPG 签名(用git log --format="%G?"自检,N表示未签名)。
提交前自查清单
推送之前过一遍这 6 项,能挡掉绝大多数 CI 红灯:
- ✅ PR 描述 4 个章节全部填写,含真实 Issue 编号
- ✅ 修改路径符合自己当前的贡献者等级
- ✅ 没有文件从千行以下被推到千行以上
- ✅
CHANGELOG.md的[Unreleased]已更新 - ✅
cargo fmt/clippy/test本地全部通过 - ✅ 提交带 GPG 签名,版本号升级单独成 PR
延伸阅读
手册中以下章节值得精读(路径相对于仓库根目录):
- 贡献者等级与安全关键 crate:
src/handbook/contribution-tiers.md - polyrepo 布局与 Git 工作流:
src/handbook/polyrepo-and-workflow.md - 发布流程与编码规范:
src/handbook/release-and-standards.md - RFC 触发条件:
src/handbook/rfc-trigger.md
CI 的严苛不是刁难,而是把"安全边界不腐化"变成了一条条可执行、可验证的规则。把门禁当成评审员提前预审你的 PR,通过率自然就上来了。🚀
【免费下载链接】handbookContributor handbook for Astrid: the polyrepo, public contracts, contribution process, and release workflow.项目地址: https://gitcode.com/gh_mirrors/handbook76/handbook
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考