Dify与GitLab深度集成可实现代码推送后自动缺陷检测与修复建议。通过配置Webhook、构建工作流、提取diff、调用漏洞扫描函数、对接GitLab API获取上下文、生成带行号的修复建议并推送回GitLab,完成闭环。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

将Dify与GitLab深度集成,实现每次代码推送后自动拉取变更内容、识别潜在缺陷模式、定位高风险函数并生成可执行修复建议,避免人工逐行审查遗漏关键漏洞。
配置GitLab Webhook触发Dify工作流
登录GitLab项目设置 → Integrations → 填写Dify暴露的Webhook地址(如https://your-dify.com/api/v1/webhook/gitlab-push)→ 勾选Push events和Tag push events → 启用SSL验证 → 保存。
这一步必须启用SSL验证,否则Dify后端默认拒绝未加密的Webhook请求;若使用自签名证书,需在Dify服务端配置TRUSTED_PROXY_COUNT并修改Nginx反向代理的proxy_ssl_verify off指令。
测试发送样例事件:点击“Test”按钮发送Push Event,观察Dify后台日志是否出现webhook: received event=push记录。
在Dify中创建缺陷检测工作流
进入Dify控制台 → 工作流 → 新建 → 命名为“GitLab-Defect-Scan” → 选择触发器类型为“Webhook” → 粘贴GitLab中配置的同一URL作为回调入口。
添加第一个节点:文本输入节点,命名为“Extract Git Diff”,其提示词设定为:
你是一个资深安全测试工程师。请从以下Git推送事件JSON中精准提取commits[0].diff字段内容。若该字段为空或不存在,则返回空字符串。不要添加任何解释性文字,只输出纯diff文本。
添加第二个节点:代码节点,调用自定义Python函数scan_for_vuln_patterns,传入上一节点输出的diff文本。该函数内部已预置正则规则库,匹配硬编码密钥、SQL拼接、反序列化调用、日志注入等17类高危模式。
【注意:此代码节点必须勾选“启用沙箱执行”】,否则用户提交的恶意diff可能逃逸并执行任意系统命令。
对接GitLab API获取上下文代码
方法一:使用Dify内置HTTP节点调用GitLab REST API
用大白话操作当前项目的 Git/GitHub——配置 GitHub(装 gh CLI + 登录 + 建仓库)、备份、拉取下载、查询历史、回滚代码、管理分支。当用户用日常语言表达 git 意图时触发(例如"git备份一下""git下载项目""git拉下来""git看看我改了啥""git回退到上一个版本""git新建个分支搞新功能""git合并到主分支""git
在工作流中插入HTTP节点,配置为GET请求,URL格式为:https://gitlab.example.com/api/v4/projects/{{project_id}}/repository/files/{{file_path}}?ref={{commit_sha}},其中project_id、file_path、commit_sha均从Webhook原始事件JSON中提取(用{{event.project.id}}等模板语法)。
方法二:通过代码节点调用GitLab Python SDK
在代码节点中写入:
from gitlab import Gitlab<br>gl = Gitlab(url="https://gitlab.example.com", private_token="{{gitlab_token}}")<br>project = gl.projects.get({{event.project.id}})<br>file_content = project.files.get(file_path="{{file_path}}", ref="{{commit_sha}}").decode()
此处{{gitlab_token}}必须配置为Dify密钥管理中的加密凭证字段,不可明文写死在代码里。
生成带行号的修复建议并推送回GitLab
第一步:将缺陷定位信息(文件路径+起始行号+问题类型)与修复模板绑定,例如“疑似SQL拼接 → 建议改用参数化查询”。
第二步:调用GitLab API的POST /projects/:id/merge_requests/:merge_request_iid/discussions接口,在对应MR下创建新评论,内容包含高亮代码块和修复示例。
第三步:若检测到硬编码密钥或敏感路径,自动触发POST /projects/:id/issues创建阻塞型Issue,并打上security-critical标签。
第四步:所有操作完成后,向企业微信机器人发送摘要消息,含MR链接、缺陷数量、最高风险等级。










