关于 flutter-pr-checks-finder
面向 Flutter 贡献者的工作流技能,用于查找拉取请求中的失败检查并获取完整 LUCI 日志,也提供定位确切步骤名称的指引。
主要功能
- 01查找失败的 PR 检查
- 02获取原始 LUCI 日志
- 03处理分页检查运行记录
- 04将构建器映射到步骤名称
适用场景
- 01排查 Flutter 拉取请求失败
- 02获取检查摘要之外的完整 CI 输出
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ flutter/ flutter --skill flutter-pr-checks-finder安装后在 Claude Code 中输入/flutter-pr-checks-finder确认已加载。
详细介绍
Flutter PR 检查查找器
前提条件
- 必须安装并完成身份验证的
gh(GitHub CLI)。如果它不在 PATH 中,请检查常见位置,例如 macOS 上的/opt/homebrew/bin/gh,或 Windows 上的C:\Program Files\GitHub CLI\gh.exe。 - 可以使用
curl或类似工具从 LUCI 获取原始日志。
工作流
1. 查找失败的检查
如果已安装并完成身份验证,可以使用 gh CLI;否则,可以通过直接向 GitHub API 发送 HTTP 请求作为备用方案。
选项 A:使用 gh CLI(首选)
运行以下命令以列出检查:
gh pr checks <PR_NUMBER>
选项 B:通过 HTTP 使用 GitHub API
如果无法使用 gh,可以使用 read_url_content 或类似方法与公开的 GitHub API 交互:
- 查找 PR SHA:
向以下地址发送 HTTP 请求:
https://api.github.com/repos/flutter/flutter/pulls/<PR_NUMBER>提取head.sha字段。 - 列出检查运行记录:
向以下地址发送 HTTP 请求:
https://api.github.com/repos/flutter/flutter/commits/<PR_SHA>/check-runs解析 JSON 响应。重要:必须处理分页,以免遗漏失败项!检查total_count字段。如果其值大于check_runs数组中的项目数(通常最多为 100,或不超过你通过per_page设置的数量),则需要通过在 URL 后附加?per_page=100&page=<N>,针对后续各页发送更多 HTTP 请求,直到获取所有检查运行记录。找出所有失败的检查(即conclusion为failure的检查)。
找出所有失败的检查。
2. 获取失败日志
对于每个失败的检查:
-
查找日志 URL:
- 查找与该检查关联的目标 URL 或链接。
flutter-dashboard链接通常显示为 GitHub 检查视图底部的“在 flutter-dashboard 上查看更多详情”。- 也可以根据失败检查的名称和构建编号(如果有)重建 LUCI 页面链接。
LUCI URL 结构示例:
https://ci.chromium.org/ui/p/flutter/builders/try/<Builder Name>/<Build Number>/overview
-
构建原始日志 URL:
- 手动操作:在日志 URL 后附加
?format=raw,或按以下模式构建原始日志 URL:https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/<Build ID>/+/u/<Step Name>/stdout?format=raw
- 手动操作:在日志 URL 后附加
-
获取原始日志:
- 使用
curl或类似工具获取原始日志 URL 的内容。 - 重要:必须使用原始日志 URL,以避免 HTML 格式和输出截断。不要只依赖 GitHub API 中的检查摘要,因为摘要可能被截断或缺少完整上下文。
- 使用
构建器与步骤名称的对应关系
说明
步骤名称可能非常具体且难以猜测。本节记录了一些模式,可帮助查找这些名称。
配方与工具
-
flutter_drone配方- 说明: 源自 cocoon 或 recipes 仓库。它通常用于运行分片框架测试和代码检查(如
analyze、test_general),具体配置见 .ci.yaml(根目录)。 - 模式:
run test.dart for <shard> shard and subshard <subshard> - URL 转换: 空格会替换为下划线。
- 默认值: 如果未指定
subshard,则默认为None。 - 示例: 对于
Linux analyze(分片:analyze,无子分片),URL 步骤名称为run_test.dart_for_analyze_shard_and_subshard_None。
- 说明: 源自 cocoon 或 recipes 仓库。它通常用于运行分片框架测试和代码检查(如
-
builder.py和相关配方- 说明: 位于
flutter/engine仓库(或 recipes 仓库)中,用于根据 builders 文件夹目录中的目标 JSON 配置执行构建和测试。 - 模式: 通常是 JSON 配置中指定的任务名称,前面常带有
test:。 - URL 转换: 空格会替换为下划线。
- 注意事项: 如果 JSON 文件中的测试名称已经以
test:开头,配方仍可能再次添加此前缀(例如test:_test:_Check_formatting)。
- 说明: 位于
-
tester.py- 说明: 引擎 CI 配方中常用的辅助脚本,用于执行测试。
- 模式:
Run <shard> tests或Run <shard> <subshard> tests。 - URL 转换: 空格会替换为下划线。
在引擎中查找确切名称
如果猜测失败,请在引擎配置中查找确切的测试和任务名称:
- 在 .ci.yaml(引擎)中查找构建器,找到其
config_name属性。 - 在 builders 文件夹目录中找到对应的 JSON 文件。
- 阅读 JSON 文件,查找
tests数组及其中列出的具体tasks。
备用方案
如果 read_url_content 对猜测的步骤名称返回 404,你可能需要从 LUCI 概览页面或其他来源查找步骤名称。
评论
支持 Markdown