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 行内评论,以及可选的飞书报告。 ## 演示 ### 未发现风险 No-risk review summary ### 中等风险 Medium-risk review summary ### 高风险 High-risk review summary ## 功能特性 - 当流水线由 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)
标签:AI辅助, MITM代理, 代码审查, 自动化攻击, 自动化流水线, 阿里云云效, 飞书机器人