cyntra360hub/ci-triage
GitHub: cyntra360hub/ci-triage
一个基于 Python 的确定性 GitHub Actions 故障分类工具,通过分析 job/step 元数据将 CI 失败归类为超时、依赖、测试或基础设施原因,无需日志解析或 LLM。
Stars: 0 | Forks: 0
# ci-triage
一个小巧、确定性的 Python agent,用于检查目标 GitHub 仓库最近的 Actions 运行,并将失败分类为以下四种原因之一:
**timeout**、**dependency**、**test** 或 **infra** —— 仅使用
GitHub REST API 的 job/step 元数据,无需解析日志,无需调用 LLM,无需
付费 API,也无需运行服务器。
## 它的功能
1. 列出目标仓库最近的 workflow 运行(`GET
/repos/{owner}/{repo}/actions/runs`)。
2. 对于每个需要进行分类(triage)且结论为(`failure`、`timed_out`、
`startup_failure`、`cancelled`)的运行,获取其 jobs 及其对应的 steps
(`GET .../actions/runs/{id}/jobs`)。
3. 仅根据这些元数据确定性地对运行进行分类 —— 具体的按优先级排列的规则请参见
`src/ci_triage/classifier.py`。
4. 打印按原因分组的报告。
默认目标:`cyntra360hub/agent-pulse`,可通过
`CI_TRIAGE_TARGET_REPO` 进行配置。
### 为什么使用元数据,而不是日志文本
早期设计曾尝试获取并解析原始的 job 日志以获取更强的信号。
但这对于通用的分类工具是行不通的:`GET .../actions/jobs/{id}/
logs` 需要**对目标仓库的管理员权限** —— 这已在真实的公开仓库中针对失败的 job 进行过验证,其返回了 `403 Must have
admin rights to Repository`。相反,Job/step 的*元数据*(名称、结论)
对于任何公开仓库都是可读的,且无需特殊
权限,这正是用于对任意目标仓库进行分类的工具实际所需要的。权衡之处在于:与日志文本匹配相比,这种分类方式较为粗糙,如果 step 的名称中没有可识别的关键字,将会如实地报告为 `unknown`,而不是盲目猜测。
## 安装
需要 Python 3.12+。
```
pip install .
```
## 用法
```
ci-triage
```
或者作为模块使用:
```
python -m ci_triage.cli
```
### 配置(环境变量)
| 变量 | 默认值 | 含义 |
|---|---|---|
| `CI_TRIAGE_TARGET_REPO` | `cyntra360hub/agent-pulse` | 要分类的 `owner/repo` |
| `CI_TRIAGE_LOOKBACK` | `20` | 要检查的最近运行次数 |
| `CI_TRIAGE_GITHUB_TOKEN` | 未设置 | 可选的 token,用于提高 GitHub API 速率限制(如果设置了 `GITHUB_TOKEN` 则回退到它,否则匿名访问) |
| `CI_TRIAGE_TIMEOUT_SECONDS` | `15` | 每次 API 调用的网络超时时间 |
将 `.env.example` 复制到 `.env` 以在本地设置这些内容;`.env` 被 git 忽略
且永远不会被提交。
## 可选:AiOps Enabler 集成
ci-triage 可以选择将每次分类过程作为已签名的任务事件报告给 [AiOps Enabler](https://aiopsenabler.com),这是一个旨在为经验证的 AI agent 性能提供服务的
公共利益注册表。**这是可选功能,且默认关闭**
—— 除非你显式配置凭证,否则 agent 绝不会进行任何主动的网络上报。
该仓库的报告路径被刻意设计为其自身的**规范完整性
测试**:`src/ci_triage/signing.py` 和 `reporting.py` 实现了原始的
HMAC 签名 REST 调用,*纯粹*基于平台自身发布的
文档构建 —— [skill.md](https://aiopsenabler.com/skill.md) 和
[openapi.json](https://api.aiopsenabler.com/openapi.json) —— 完全不
依赖官方的 `aiops-enabler` SDK(另外,无论如何,公众目前也
无法使用该 SDK:其安装命令指向的是一个私有的
GitHub 仓库 —— 完整的
故事请参阅 cert-sentinel 和 status-watch 的 README)。如果该仓库的测试通过,这就证明了
仅凭平台自身的文档就足以
从零开始构建正确的集成。
要启用此功能,请设置两个环境变量(在本地置于 `.env` 中,或在
CI 中作为 GitHub Actions 密钥 —— 参见 `.github/workflows/scheduled.yml`):
```
CI_TRIAGE_AGENT_KEY_ID=ak_...
CI_TRIAGE_AGENT_SECRET=...
```
两者都设置后,每次运行都会向 `POST /api/v1/events` 发送一对已签名的 `task_started` / `task_completed`
事件,其中 `outcome` 设置为 `success`(未
找到需要分类的运行)、`escalated`(发现并分类了失败)或
`failure`(分类过程自身无法完成,例如
GitHub API 错误)。
## 开发
```
pip install -e ".[dev]"
pytest
```
所有测试均完全离线运行 —— GitHub API 调用被注入的伪造 fetcher 所取代,因此测试套件永远不会触及网络。
## 许可证
MIT —— 参见 [LICENSE](LICENSE)。
标签:Python, SOC Prime, 安全规则引擎, 开发工具, 无后门, 逆向工具