benrenshan/yunxiao-mr-review-step
GitHub: benrenshan/yunxiao-mr-review-step
一个轻量级的云效流水线 Flow 步骤,利用 AI 大模型自动审查 Codeup 合并请求并生成行内评论与飞书报告。
Stars: 20 | Forks: 0
# 云效 MR Review 步骤
[English](README.md) | [中文](README_CN.md)
一个由 AI 驱动的 [阿里云 DevOps(云效)](https://www.alibabacloud.com/product/yunxiao) Flow 步骤,用于审查 Codeup Merge Requests 和最近的 commits。它将结构化的模型输出转化为 Codeup 行内评论,以及可选的飞书报告。
## 演示
### 未发现风险
### 中等风险
### 高风险
## 功能特性
- 当流水线由 Codeup MR 触发时,审查当前的 Merge Request。
- 支持手动运行:审查所有打开的 MR,或者在没有打开的 MR 时审查最近的非合并 commits。
- 将大的 diffs 拆分为有边界的批次,并合并结构化的审查结果。
- 仅在 Codeup MR diff 中新增的行上发布可操作的评论。
- 从常见的规则和 agent 指令位置加载特定于仓库的审查规则。
- 可以创建详细的飞书 Wiki 报告,并向飞书群发送一张简洁的摘要卡片。
- 优雅处理不完整的模型 JSON,并尽可能继续使用已验证的结果。
## 路线图
- [x] Claude Code 集成
- [ ] OpenCode 集成
- [ ] Codex 和其他多 agent 代码审查运行时
## 工作原理
```
Pipeline trigger
├─ Merge Request → review the current MR
└─ Manual run → review open MRs
└─ none open → review recent commits
↓
Prepare diff → AI review → Codeup comments
└→ optional Feishu report
```
## 前置条件
- Node.js 18 或更高版本(用于本地开发)
- 一个可以访问 Codeup 仓库的云效 Flow 流水线
- 一个具有读取仓库、查询 MR 和创建 MR 评论权限的云效 token
- 一个兼容 Anthropic 的 API endpoint、API key 和模型名称
- 可选:一个飞书自定义应用以及用于报告的目标飞书 Wiki/群组
## 在云效中设置
1. 将该步骤发布到您的云效组织(参见 [发布步骤](#publish-the-step))。
2. 将 **Yunxiao MR Review Step** 添加到 Flow 流水线中。
3. 为您的密钥创建私有流水线变量,例如 `YUNXIAO_TOKEN` 和 `MODEL_API_KEY`。
4. 填写下方的步骤字段。使用变量(例如 `${YUNXIAO_TOKEN}`)来引用密钥,而不是将它们直接粘贴到流水线中。
5. 从 Merge Request 运行流水线,或者手动运行它以审查打开的 MR/最近的 commits。
### 配置 Node.js 和 Claude Code
在 `YunXiaoMRReviewer` **之前**添加以下步骤。它们确保流水线运行时能够调用 Claude Code CLI。
1. **配置 `.npmrc`**(可选):仅当您的环境需要私有 npm registry 或 registry 凭证时,才添加 **Configure .npmrc file** 步骤。使用受管理的 `.npmrc` 路径;切勿将 registry 凭证粘贴到流水线 YAML 中。
2. **安装 Node 环境**:添加一个 **Node.js build** 步骤。选择预定义版本,选择 Node.js **22.21**,将 npm 类型设置为 **npm**,并保持 **Install Yarn** 未选中。
3. **运行命令**:添加一个 **Command** 步骤,保持 **Specify shell** 未选中,并全局安装 Claude Code:
npm install -g @anthropic-ai/claude-code
为了确保构建的可重现性,请固定一个经过测试的版本。在保存流水线之前,将 `` 替换为您的团队批准的版本:
npm install -g @anthropic-ai/claude-code@
4. **YunXiaoMRReviewer**:在命令步骤之后添加此自定义步骤,并使用私有变量配置其模型、Codeup 以及可选的飞书设置。
### 流水线 YAML 示例
以下示例展示了所需的顺序,并且不包含真实的仓库 ID、服务连接、token、API key 或飞书标识符。将每个 `${...}` 占位符替换为云效私有变量或您自己的非机密值。
```
sources:
repo_0:
type: codeup
name:
endpoint: https://codeup.aliyun.com///.git
branch:
triggerEvents:
- mergeRequestOpenedOrUpdate
branchesFilter:
certificate:
type: serviceConnection
serviceConnection: ${CODEUP_SERVICE_CONNECTION}
defaultWorkspace: repo_0
stages:
stage_0:
name: Build
jobs:
job_0:
name: AI code review
runsOn:
group: public/cn-beijing
labels: linux,amd64
container: build-steps-public-registry.cn-beijing.cr.aliyuncs.com/build-steps/alinux3:latest
steps:
- name: Configure .npmrc file
step: SetupNpmrc
with:
npmPrivateRepoConfigPath: /root/.npmrc
- name: Install Node environment
step: SetupNode
with:
versionType: predefined
npmType: npm
nodeVersion: '22.21'
installYarn: false
- name: Install Claude Code
step: Command
with:
variables: []
ifGivenShell: false
run: npm install -g @anthropic-ai/claude-code@
- name: YunXiaoMRReviewer
step: private/YunXiaoMRReviewer
with:
yunxiaoToken: ${YUNXIAO_TOKEN}
anthropicBaseUrl: ${ANTHROPIC_BASE_URL}
anthropicAuthToken: ${ANTHROPIC_AUTH_TOKEN}
anthropicModel:
maxBudgetUsd: '5.00'
recentCommitCount: '5'
reviewRules: all
feishuAppId: ${FEISHU_APP_ID}
feishuAppSecret: ${FEISHU_APP_SECRET}
feishuChatId: ${FEISHU_CHAT_ID}
feishuWikiSpaceId: ${FEISHU_WIKI_SPACE_ID}
feishuWikiParentNode: ${FEISHU_WIKI_PARENT_NODE}
```
### 必填设置
| 设置 | 描述 | 示例 |
| --- | --- | --- |
| `yunxiaoToken` | 用于 Codeup API 访问和 Git 认证的云效 token。 | `${YUNXIAO_TOKEN}` |
| `anthropicBaseUrl` | 兼容 Anthropic 的 API 基础 URL。 | `https://dashscope.aliyuncs.com/compatible-mode/v1` |
| `anthropicAuthToken` | 所选模型提供商的 API key。 | `${MODEL_API_KEY}` |
| `anthropicModel` | 提供商接受的模型名称。 | `qwen-max` |
`anthropicBaseUrl` 和 `anthropicModel` 是必填项;请为您的模型提供商显式配置这两个值。
### 可选设置
| 设置 | 默认值 | 描述 |
| --- | --- | --- |
| `maxBudgetUsd` | `5.00` | 在一次流水线运行中,所有目标、diff 批次和 JSON 修复尝试共用的总模型预算。 |
| `recentCommitCount` | `3` | 当手动运行未找到打开的 MR 时,要审查的最近非合并 commits 的数量。范围:`1`–`20`。 |
| `reviewRules` | `all` | 规则范围:`all`、`backend` 或 `frontend`。 |
| `feishuAppId` | — | 飞书自定义应用 ID。 |
| `feishuAppSecret` | — | 飞书自定义应用密钥;请以私有变量的形式提供。 |
| `feishuChatId` | — | 目标飞书群的 `chat_id`(通常以 `oc_` 开头)。 |
| `feishuWikiSpaceId` | — | 用于完整报告的飞书 Wiki 空间 ID。 |
| `feishuWikiParentNode` | — | 可选的父 Wiki 节点 token;留空则使用 Wiki 根节点。 |
要启用飞书报告,请同时配置 `feishuAppId`、`feishuAppSecret`、`feishuChatId` 和 `feishuWikiSpaceId`。如果缺少任何一项,审查仍会运行,但会跳过飞书输出。
## 向被审查的仓库添加审查规则
此步骤从受审查的仓库中读取规则,而不是从此仓库中读取。推荐的目录结构如下:
```
.agents/
└── rules/
├── backend/
│ ├── rule.md
│ └── reference.md
└── frontend/
├── rule.md
└── reference.md
```
它还会识别 `AGENTS.md`、`CLAUDE.md`、`GEMINI.md`、`.claude/rules`、`rules`、`.rules`、`docs/rules` 和 `docs/standards`。如果未找到项目规则,它将回退到常规的代码质量、安全性、性能和可维护性检查。
## 本地开发
```
npm install
npm run tsc
npm run lint
npm run build
```
运行完整的本地验证套件:
```
npm run verify
```
## 发布步骤
安装并通过云效 Flow CLI 进行身份验证,然后运行:
```
./publish.sh
```
该脚本会使用 `flow-cli` 登录,运行 `npm run verify`,并使用 `flow-cli step publish --skip-build --auto-version` 发布新版本。
## 故障排除
| 症状 | 检查项 |
| --- | --- |
| 手动运行时未找到审查目标 | 确认仓库有一个打开的 MR,或者默认分支具有最近的非合并 commits。 |
| `No unambiguous Codeup repository source` | 检查流水线的 `SOURCES` 值。如果存在多个 Codeup 源,请确保 `source` 标识了预期的仓库。 |
| `PatchSet` 缺失 | 确认流水线是由 Codeup MR 触发的,并且 token 具有 MR 查询权限。 |
| 没有可用的模型结果 | 检查 CLI/模型配置、API endpoint、API key、模型名称和可用预算。 |
| 飞书报告失败 | 检查飞书应用权限、群 `chat_id`、Wiki 空间 ID、父节点权限和密钥变量。Codeup 审查评论将会继续执行。 |
## 安全注意事项
- 切勿提交 token、API key 或飞书应用密钥。
- 将 `yunxiaoToken`、`anthropicAuthToken` 和 `feishuAppSecret` 存储为云效私有变量。
- 如果密钥已被提交,请立即轮换。将其从最新文件中移除并不会将其从 Git 历史记录中删除。
- Git 认证使用临时的 askpass 环境;token 不会被写入 Git remote URL 或仓库配置中。
## 许可证
[Apache-2.0](LICENSE)
### 中等风险
### 高风险
## 功能特性
- 当流水线由 Codeup MR 触发时,审查当前的 Merge Request。
- 支持手动运行:审查所有打开的 MR,或者在没有打开的 MR 时审查最近的非合并 commits。
- 将大的 diffs 拆分为有边界的批次,并合并结构化的审查结果。
- 仅在 Codeup MR diff 中新增的行上发布可操作的评论。
- 从常见的规则和 agent 指令位置加载特定于仓库的审查规则。
- 可以创建详细的飞书 Wiki 报告,并向飞书群发送一张简洁的摘要卡片。
- 优雅处理不完整的模型 JSON,并尽可能继续使用已验证的结果。
## 路线图
- [x] Claude Code 集成
- [ ] OpenCode 集成
- [ ] Codex 和其他多 agent 代码审查运行时
## 工作原理
```
Pipeline trigger
├─ Merge Request → review the current MR
└─ Manual run → review open MRs
└─ none open → review recent commits
↓
Prepare diff → AI review → Codeup comments
└→ optional Feishu report
```
## 前置条件
- Node.js 18 或更高版本(用于本地开发)
- 一个可以访问 Codeup 仓库的云效 Flow 流水线
- 一个具有读取仓库、查询 MR 和创建 MR 评论权限的云效 token
- 一个兼容 Anthropic 的 API endpoint、API key 和模型名称
- 可选:一个飞书自定义应用以及用于报告的目标飞书 Wiki/群组
## 在云效中设置
1. 将该步骤发布到您的云效组织(参见 [发布步骤](#publish-the-step))。
2. 将 **Yunxiao MR Review Step** 添加到 Flow 流水线中。
3. 为您的密钥创建私有流水线变量,例如 `YUNXIAO_TOKEN` 和 `MODEL_API_KEY`。
4. 填写下方的步骤字段。使用变量(例如 `${YUNXIAO_TOKEN}`)来引用密钥,而不是将它们直接粘贴到流水线中。
5. 从 Merge Request 运行流水线,或者手动运行它以审查打开的 MR/最近的 commits。
### 配置 Node.js 和 Claude Code
在 `YunXiaoMRReviewer` **之前**添加以下步骤。它们确保流水线运行时能够调用 Claude Code CLI。
1. **配置 `.npmrc`**(可选):仅当您的环境需要私有 npm registry 或 registry 凭证时,才添加 **Configure .npmrc file** 步骤。使用受管理的 `.npmrc` 路径;切勿将 registry 凭证粘贴到流水线 YAML 中。
2. **安装 Node 环境**:添加一个 **Node.js build** 步骤。选择预定义版本,选择 Node.js **22.21**,将 npm 类型设置为 **npm**,并保持 **Install Yarn** 未选中。
3. **运行命令**:添加一个 **Command** 步骤,保持 **Specify shell** 未选中,并全局安装 Claude Code:
npm install -g @anthropic-ai/claude-code
为了确保构建的可重现性,请固定一个经过测试的版本。在保存流水线之前,将 `标签:AI辅助, MITM代理, 代码审查, 自动化攻击, 自动化流水线, 阿里云云效, 飞书机器人