GitLab MR自动化审查需Webhook与CI双重联动:Webhook捕获MR事件,CI执行检查并生成标准codequality报告,缺一不可;仅配其一将导致质量面板缺失或AI评论无法渲染。
GitLab 的 MR 自动化审查必须依赖 Webhook + CI 两层联动,只靠其中一种会漏掉关键场景。Webhook 负责实时捕获 MR 创建、更新事件;CI 负责在流水线中执行具体检查并上报结果。两者缺一不可。
常见错误是只配置了 .gitlab-ci.yml 但没启用 Webhook,导致 MR 页面不显示“代码质量”部件或 AI 评论;或者只配 Webhook 但没在 CI 中声明 codequality 报告产物,结果 LLM 审查结果无法渲染进 Diff 视图。
Merge request events,且 URL 指向你部署的 Flask/Python 服务(如 /webhook/mr)artifacts: reports: codequality,报告格式必须是 GitLab 兼容的 JSON(字段含 description、severity、location)open 和 update:前者拉取全量 diff,后者建议只分析变更行,避免重复调用 LLM 增加延迟GitLab 默认不解析 HTML 文件做质量扫描,必须显式启用对应 linter 并输出标准报告。单纯运行 htmlhint 或 eslint-plugin-html 不会自动出现在 MR 的“代码质量”面板里。
关键在于报告路径和格式:GitLab 只认 gl-code-quality-report.json 这个文件名(或通过 codequality 关键字声明),且内容必须包含 type: "issue" 和可定位的 location 字段。
立即学习“前端免费学习笔记(深入)”;
.gitlab-ci.yml 中加一个独立 job:html-quality,使用 node:18-alpine 镜像npx htmlhint --format=codeclimate src/**/*.html > gl-code-quality-report.json
artifacts 包含该文件,并在 reports 下声明:codequality: gl-code-quality-report.json
severity 只能是 info、minor、major、critical 四种之一LLM 生成的评审意见默认只作为 MR 评论(Note)存在,不会自动注入到代码行级视图。要实现在 Diff 行旁显示气泡提示,必须调用 GitLab API 的 POST /projects/:id/merge_requests/:mr_iid/notes 接口,并传入 position 参数——这不是简单文本评论,而是带上下文锚点的结构化数据。
容易忽略的是 position 字段构造复杂:需包含 base_sha、start_sha、head_sha、old_path、new_path、position_type(通常为 text)、以及 line(新文件中的行号)。少一个字段,API 就返回 400 Bad Request。
object_attributes.last_commit 和 diff_refs 中提取htmlhint 输出的行号是源码行号,但 GitLab Diff 显示的是“新文件”逻辑行号,二者可能错位根本原因是环境差异:本地用全局安装的 htmlhint,而 CI 使用镜像里的 Node 版本和依赖树。最常踩的坑是 package-lock.json 没提交,或 npm ci 被跳过,导致插件版本不一致。
另一个隐蔽问题是路径匹配。CI 中工作目录是 $CI_PROJECT_DIR,但 htmlhint 默认递归扫描当前目录下所有 .html,若项目含 node_modules 或构建产物(如 dist/),会因文件权限或大小超限失败。
npx htmlhint --config=.htmlhintrc src/**/*.{html,htm}
.gitlab-ci.yml 中加 before_script 检查:ls -la src/ | head -5,确认 HTML 文件真实存在** 通配符匹配过深目录,改用 src/{components,pages}/**/*.html 精确控制范围ENOSPC(磁盘空间不足),说明镜像里临时空间不够,需加 cache: {key: "$CI_JOB_NAME", paths: ["node_modules/"]}