GitLab-Runner + AI 代码审查服务 + 远程大模型 全套部署运维实战 说明本文为真实服务器全流程部署、排错、优化、迭代实录完整记录公司内部网络 Linux 服务器搭建 CI/CD AI 自动化代码审查平台的全过程。涵盖基础环境初始化、依赖安装、GitLab-Runner 部署、Ollama 本地大模型部署、AI 审查服务部署、网络代理调试、服务自启配置、本地模型迭代切换远程阿里云大模型Qwen3.6-Plus、全链路问题踩坑与修复方案。文档所有内容均为现场实操验证包含完整命令、报错原因、解决方案、架构迭代记录可作为项目长期运维、复盘、二次部署的标准手册。一、服务器基础环境信息1.1 硬件配置CPU32 核高性能服务器内存125GiB 大内存交换分区无显卡无原计划本地部署大模型后改用远程模型无需 GPU操作系统Debian / Ubuntu 系列默认 Python 版本Python 3.131.2 网络与代理环境服务器处于公司内部网络环境通过企业网关统一访问互联网所有互联网资源软件包、依赖、远程大模型接口、工具插件等必须通过全局 HTTP/HTTPS 代理访问同时严格配置no_proxy规则保证本地回环地址、公司内部网络网段、内部服务地址不走代理避免本地接口、公司内部网络服务请求、内部 GitLab 仓库被代理劫持、请求卡死、超时等问题。业务需求特殊服务需要双网络通路访问公司内部网络 GitLab拉取 MR 代码、提交审查评论禁止走代理访问互联网大模型模型推理必须走代理初期尝试本地小模型效果不佳后续切换为远程大模型1.3 最终上线服务清单本次整套环境共部署三大核心服务分工明确、链路串联服务职责状态GitLab Runner对接公司内部网络 GitLab CI/CD 流水线自动化执行代码审查任务、拉取代码、调度流程✅ 生产运行AI-Review-Server基于 Flask 开发的核心业务服务承接 GitLab Runner 调用转发请求至远程qwen3.6-plus大模型完成代码解析、缺陷审查、评语生成并将结果回传 GitLab✅ 生产运行Ollama初期部署用于运行本地qwen2.5:7b模型因本地 CPU 推理慢、模型审查效果不佳现已切换为远程大模型服务保留备用⚠️ 历史留存1.4 架构迭代历程┌─────────────────────────────────────────────────────────────────────┐ │ V1 版本架构已弃用 │ ├─────────────────────────────────────────────────────────────────────┤ │ GitLab CI → Runner → AI审查服务 → 本地 Ollama(qwen2.5:7b) │ │ 痛点纯 CPU 推理慢、审查效果差、占用大量资源 │ └─────────────────────────────────────────────────────────────────────┘ ↓ 升级迭代 ┌─────────────────────────────────────────────────────────────────────┐ │ V2 最终架构生产可用 │ ├─────────────────────────────────────────────────────────────────────┤ │ GitLab CI → Runner → AI 审查服务(5001) → 阿里云 Qwen3.6-Plus │ │ 优势释放本地算力、推理速度快、审查精度高、运维成本低 │ └─────────────────────────────────────────────────────────────────────┘1.5 整体业务架构改造后GitLab 代码仓库 MR/提交触发 CI/CD 流水线 ↓ GitLab Runner 接收任务、拉取项目代码 ↓ Runner 调用本地 AI 代码审查服务5001 端口 ↓ AI-Review-Server 携带请求参数转发至 远程 qwen3.6-plus 大模型接口 ↓ 远程大模型执行代码审查返回审查结果 ↓ 结果原路回传AI服务 → GitLab Runner → GitLab 流水线展示二、服务器基础环境初始化前置基础操作本节为部署所有服务前的通用环境准备包含网络代理配置、系统更新、工具安装、基础依赖、常用运维插件安装是整套环境运行的基础所有操作按执行顺序记录。2.1 全局网络代理配置核心前置重中之重服务器公司内部网络环境必须配置全局代理才能访问互联网这是后续所有互联网下载操作的前提。同时强制本地/公司内部网络地址豁免代理是解决接口卡死、请求超时的关键。2.1.1 全局代理配置文件配置文件路径/etc/environment系统级全局环境变量所有用户、系统服务生效编辑文件vim/etc/environment2.1.2 最终完整配置内容PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin# 互联网代理地址根据现场实际代理IP、端口修改http_proxyhttp://your-proxy-ip:your-proxy-porthttps_proxyhttp://your-proxy-ip:your-proxy-portall_proxysocks5://your-proxy-ip:your-proxy-port# 兼容大写格式部分软件/服务优先读取大写变量HTTP_PROXY$http_proxyHTTPS_PROXY$https_proxyALL_PROXY$all_proxy# 免代理规则本地回环、IPv6、公司内部网络标准网段、公司内部网络GitLab地址# 禁止以上地址走互联网代理防止本地服务请求被劫持no_proxylocalhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,your-gitlab-domain.comNO_PROXY$no_proxy2.1.3 配置生效命令修改/etc/environment后必须重载系统配置并重启服务器否则代理不生效# 重载系统服务配置systemctl daemon-reload# 重启服务器全局环境变量必须重启生效reboot2.1.4 代理临时测试命令重启后验证代理与免代理规则是否正常测试互联网连通走代理curl-Ihttps://www.baidu.com正常返回 HTTP 200 即为代理生效。测试本地地址不走代理# 强制不走代理访问本地接口避免代理劫持curl--noproxy*--connect-timeout5http://127.0.0.1:11434可正常连接、无卡死即为no_proxy规则生效。2.1.5 代理相关踩坑记录问题现象根因解决方案未配置no_proxy访问127.0.0.1/公司内部网络地址请求卡死、超时、无任何返回配置完整的no_proxy白名单仅配置小写no_proxy部分老服务识别大写NO_PROXY导致豁免失效同时配置大小写环境变量配置代理后未重启服务器全局环境变量不生效互联网下载失败必须执行reboot重启服务器2.2 系统更新与基础工具安装代理配置完成并验证生效后开始安装基础工具。2.2.1 系统更新命令# 更新软件源索引aptupdate# 升级系统已安装包可选生产环境按需执行aptupgrade-y2.2.2 安装运维必备工具包含网络检测、端口监听、进程查询、文本编辑、解压工具等后续排错、运维全程使用# 批量安装常用工具aptinstall-ycurlwgetgitvimnet-tools iproute2 procpsunziptarlsof工具说明工具用途curl/wget接口测试、网络连通性检测net-tools/iproute2ifconfig、ss、route网络查询procpsps、top、pkill进程管理lsof查询端口占用、文件占用vim配置文件编辑2.3 Python 基础环境与依赖前置处理系统自带 Python 3.13Debian/Ubuntu 高版本 Python 开启了系统环境保护机制禁止直接在系统 Python 中安装第三方包提前记录解决方案。2.3.1 核心报错与通用解决方案执行pip install时报错externally-managed-environment原因系统 Python 受保护防止破坏系统依赖。统一解决方案安装包时追加--break-system-packages参数全局通用# 通用 pip 安装格式后续所有Python依赖均使用此命令pip3install包名 --break-system-packages# 示例安装基础依赖pip3installflask requests python-dotenv openai --break-system-packages三、历史服务Ollama 本地大模型部署原方案现已弃用初期为实现本地代码审查部署 Ollama 框架并运行qwen2.5:7b本地大模型因纯 CPU 推理速度极慢、代码审查效果不佳后续全面切换为远程qwen3.6-plus模型。本节完整记录原部署流程、配置、自启、排错作为环境历史留存。3.1 Ollama 安装与本地模型拉取3.1.1 官方一键安装命令依托全局代理执行官方安装脚本curl-fsSLhttps://ollama.com/install.sh|sh3.1.2 拉取本地代码审查模型# 拉取 qwen2.5:7b 模型ollama pull qwen2.5:7b3.2 Ollama Systemd 开机自启配置文件路径/etc/systemd/system/ollama.service作用实现开机自启、进程异常自动重启、隔离代理影响。3.2.1 完整服务配置文件[Unit] DescriptionOllama Local LLM Service Afternetwork.target [Service] # 强制清空代理变量彻底杜绝本地请求被代理劫持 Environmentno_proxy127.0.0.1,localhost,0.0.0.0 EnvironmentNO_PROXY127.0.0.1,localhost,0.0.0.0 EnvironmentHTTP_PROXY EnvironmentHTTPS_PROXY EnvironmentALL_PROXY # 监听所有网卡允许公司内部网络访问 EnvironmentOLLAMA_HOST0.0.0.0 ExecStart/usr/local/bin/ollama serve Userroot Grouproot # 进程异常自动重启 Restartalways RestartSec3 [Install] WantedBymulti-user.target3.2.2 Ollama 服务管理全套命令# 重载Systemd配置修改配置后必执行systemctl daemon-reload# 启动服务 设置开机自启systemctl start ollama systemctlenableollama# 查看服务运行状态systemctl status ollama# 实时查看运行日志排错核心命令journalctl-uollama-f--no-pager# 查看11434端口监听状态Ollama默认端口ss-tuln|grep:11434# 停止/重启服务systemctl stop ollama systemctl restart ollama3.3 Ollama 高频问题与解决方案问题现象根因分析解决方案listen tcp 0.0.0.0:11434: bind: address already in use残留进程占用端口pkill -9 ollama systemctl restart ollama服务状态正常、端口监听正常但 curl 本地接口卡死服务未清空代理变量全局代理劫持本地请求使用上方ollama.service配置清空所有代理环境变量纯 CPU 运行qwen2.5:7b推理极慢7B 参数量模型 无显卡加速 单次传入代码文本量大数万字符临时优化切换轻量模型最终方案放弃本地模型切换远程 qwen3.6-plus日志告警context deadline exceededOllama 访问官方云端超时不影响本地模型运行可直接忽略3.4 本地模型可用性验证curl--noproxy*http://127.0.0.1:11434/api/tags正常返回已下载模型列表代表 Ollama 部署完成。重要说明当前业务已不再使用 Ollama 本地模型该服务仅作为历史环境保留可根据需求选择停止/保留。四、AI 代码审查服务ai-review-server部署 改造对接远程 qwen3.6-plus本服务为整套架构核心中转服务基于 Flask 开发原对接本地 Ollama现已全面改造为对接远程 qwen3.6-plus 大模型。完整记录目录规划、依赖安装、配置文件修改、代码改造、自启配置、排错全流程。4.1 服务基础信息属性值开发框架Flask项目工作目录/path/to/your/ai-review-service服务监听地址0.0.0.0:5001上游依赖远程大模型接口如阿里云 Qwen3.6-Plus运行用户root核心功能接收 GitLab CI 请求、拉取 MR 代码变更、调用大模型审查、生成报告、提交 MR 评论、阻塞违规合码4.2 进入项目目录 安装 Python 全量依赖4.2.1 进入工作目录cd/path/to/your/ai-review-service4.2.2 安装项目依赖结合系统 Python 限制统一使用--break-system-packages参数# 安装项目所需依赖Flask、环境变量解析、OpenAI SDK、网络请求等pip3installflask python-dotenv requests openai --break-system-packages4.2.3 OpenAI SDK 版本报错修复报错Client.__init__() got an unexpected keyword argument proxies原因openai 2.x新版 SDK 已移除proxies初始化参数。解决方案删除代码中所有proxiesxxx相关配置服务公司内部网络访问远程接口依赖系统全局代理无需代码内单独配置代理。4.3 环境变量配置文件.env核心改造点切换远程大模型文件路径/path/to/your/ai-review-service/.env原配置指向本地 Ollama现修改为远程大模型接口完整配置如下# 远程大模型配置 # 远程大模型鉴权密钥根据实际密钥填写 OPENAI_API_KEYyour-llm-api-key # 核心改造由本地127.0.0.1改为远程大模型接口地址 OPENAI_BASE_URLhttps://your-llm-api-endpoint/v1 # 指定使用模型名称根据实际模型填写 OPENAI_MODELqwen3.6-plus # 业务配置 # GitLab 鉴权Token项目权限令牌需赋予read_api权限 GITLAB_TOKENyour-gitlab-access-token # GitLab 服务器地址 GITLAB_URLhttps://your-gitlab-domain.com # 请求超时时间秒 REQUEST_TIMEOUT1204.4 Systemd 开机自启配置保证服务开机自动启动、异常自动重启严格指定工作目录避免启动失败。4.4.1 服务配置文件路径/etc/systemd/system/ai-review.service[Unit] DescriptionAI Code Review Service (Remote LLM) Afternetwork.target [Service] # 智能代理分流互联网模型走代理公司内部网络GitLab不走代理 Environmenthttp_proxyhttp://your-proxy-ip:your-proxy-port Environmenthttps_proxyhttp://your-proxy-ip:your-proxy-port Environmentno_proxy127.0.0.1,localhost,your-gitlab-domain.com,10.0.0.0/8,192.168.0.0/16 EnvironmentNO_PROXY127.0.0.1,localhost,your-gitlab-domain.com,10.0.0.0/8,192.168.0.0/16 # 必须和项目实际目录一致目录错误会直接启动失败 WorkingDirectory/path/to/your/ai-review-service # 启动命令调用系统Python3运行入口文件 ExecStart/usr/bin/python3 app.py Userroot Grouproot # 关闭Python缓冲日志实时输出 EnvironmentPYTHONUNBUFFERED1 # 进程异常自动重启 Restartalways RestartSec3 [Install] WantedBymulti-user.target4.4.2 AI 服务全套管理命令# 修改配置后重载Systemdsystemctl daemon-reload# 启动服务 开机自启systemctl start ai-review systemctlenableai-review# 查看运行状态systemctl status ai-review# 实时查看服务日志排错首选journalctl-uai-review-f--no-pager# 停止/重启服务systemctl stop ai-review systemctl restart ai-review4.5 AI 服务踩坑记录实操问题问题现象根因分析解决方案status200/CHDIR服务反复启动、启动失败WorkingDirectory配置的目录与项目真实目录不一致修正为实际路径/path/to/your/ai-review-service手动 curl 接口返回 401 未授权服务内置安全鉴权仅允许 GitLab CI 公司内部网络调用正常安全逻辑不影响流水线正常使用无需修复调用远程大模型超时远程接口网络波动、大模型推理耗时久在.env中调大REQUEST_TIMEOUT超时时间同时延长 GitLab CI 任务超时切换远程模型后请求无返回代理配置问题或模型参数错误检查全局代理、.env配置、服务日志无法获取 MR 代码变更重启服务后 GitLab Token 环境变量丢失/权限不足重新配置有效GITLAB_TOKEN赋予read_api权限4.6 服务连通性验证# 本地测试接口连通性忽略401鉴权只要能通即服务正常curlhttp://127.0.0.1:5001五、核心架构迭代本地模型升级为阿里云 Qwen3.6-Plus5.1 迭代核心原因真实业务痛点核心结论本地qwen2.5:7b小模型能力不足无法满足代码审查需求具体表现如下问题类型具体问题影响性能问题qwen2.5:7b纯 CPU 运行长代码审查耗时过长30s~5min/轮CI 流水线极易超时阻塞能力不足本地小模型仅能检测基础 TS 类型、组件命名等简单问题审查深度和精度不够漏检率高审查效果差无法识别复杂代码缺陷和安全问题代码质量把关形同虚设本地小模型能力局限模型本身能力不足真实问题测试的效果不佳无法检测硬编码密钥、密码泄露风险无法识别 Token 传输安全漏洞无法发现内存泄漏监听未销毁问题无法预判空指针异常 NPE 风险无法识别循环串行性能缺陷、代码重复异味本质原因7B 参数规模的小模型在代码理解深度、推理能力、安全漏洞识别等方面存在天然局限性纯粹是模型能力不足以支撑高质量代码审查需求。5.2 远程模型核心信息属性值模型名称通义千问 Qwen3.6-Plus或其他企业级大模型接口地址https://your-llm-api-endpoint/v1接口规范兼容 OpenAI 标准格式无缝适配现有 AI 审查服务能力优势支持全方位代码安全、性能、规范、漏洞审查达到企业级生产标准5.3 模型效果对比真实实测┌──────────────────────────────────────────────────────────────────┐ │ 本地 qwen2.5:7b 效果差 │ ├──────────────────────────────────────────────────────────────────┤ │ ❌ 仅检测基础语法、any类型、组件命名问题 │ │ ❌ 无安全漏洞、性能、内存、空指针检测能力 │ │ ❌ 推理速度慢阻塞CI流程 │ └──────────────────────────────────────────────────────────────────┘ ↓ ┌──────────────────────────────────────────────────────────────────┐ │ 云端 qwen3.6-plus 效果生产级 │ ├──────────────────────────────────────────────────────────────────┤ │ ✅ 拦截硬编码密钥、密码、Token泄露高危漏洞 │ │ ✅ 检测内存泄漏、事件监听未销毁问题 │ │ ✅ 检测空指针NPE风险、代码规范、类型安全 │ │ ✅ 识别代码异味、重复代码、性能缺陷 │ │ ✅ 区分P0阻塞级、P1优化级、P2建议级问题 │ │ ✅ 推理速度快不阻塞CI流水线 │ └──────────────────────────────────────────────────────────────────┘5.4 迭代后网络适配终极智能分流最终实现完美双向通信AI服务调用互联网大模型 → 自动走代理 your-proxy-ip:your-proxy-port AI服务调用公司内部网络GitLab → 自动不走代理直连访问无劫持、无超时六、GitLab Runner 部署与 CI/CD 流水线对接GitLab Runner 作为 CI/CD 执行器负责触发代码拉取、调用 AI 审查服务是串联整个流程的入口本节记录安装、注册、配置、排错全流程。6.1 GitLab Runner 安装依托全局代理执行官方安装步骤# 1. 导入GitLab官方GPG密钥curl-Lhttps://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh|bash# 2. 安装 GitLab Runneraptinstall-ygitlab-runner6.2 Runner 注册关联公司内部网络 GitLab 项目注册命令需填写公司内部网络 GitLab 地址、注册令牌、Runner 标签、执行器等信息信息从 GitLab 项目后台获取gitlab-runner register按交互式提示依次填写GitLab 实例 URL公司内部网络 GitLab 地址注册令牌项目/群组 Runner 令牌Runner 描述自定义名称如AI-Code-Review-Runner标签tags流水线匹配标签用于任务调度执行器executor选择shell本地执行6.3 GitLab Runner 基础管理命令# 查看Runner运行状态gitlab-runner status# 启停服务systemctl start gitlab-runner systemctl stop gitlab-runner systemctl restart gitlab-runner# 设置开机自启systemctlenablegitlab-runner# 查看Runner日志journalctl-ugitlab-runner-f--no-pager6.4 流水线对接逻辑1. GitLab 项目配置 .gitlab-ci.yml 流水线文件配置触发规则、任务脚本 ↓ 2. 流水线任务触发后Runner 拉取代码调用 AI 审查服务接口 ↓ 3. AI 服务转发请求至远程 qwen3.6-plus 模型获取结果后回传给 Runner ↓ 4. Runner 将审查结果展示在 GitLab 流水线日志中6.5 GitLab Runner 核心踩坑记录问题现象根因分析解决方案Runner 无法访问公司内部网络 AI 服务5001端口全局代理未配置no_proxy公司内部网络请求被转发至互联网代理检查/etc/environment公司内部网络网段豁免规则重启服务器生效CI 任务异常退出、任务被杀死远程大模型推理耗时较长CI 默认超时时间不足在 GitLab 项目流水线配置中延长 CI 任务全局超时时间Runner 拉取 GitLab 代码失败GitLab 公司内部网络地址未加入no_proxy在no_proxy中补充 GitLab 域名/IPToken 安全问题GitLab Token 从 Body 传参可能泄露到日志优化 CI 脚本将 GitLab Token 改为 Header 传参七、全服务日常运维检查手册一键巡检命令整理日常维护、故障排查的全套巡检命令按服务分类运维人员可直接复制执行7.1 综合资源检查# 查看CPU核心数nproc# 查看内存使用free-h# 实时进程资源监控top7.2 Ollama 服务巡检历史服务# 运行状态systemctl status ollama# 端口监听ss-tuln|grep11434# 最近20条日志journalctl-uollama-n20--no-pager# 实时日志journalctl-uollama-f--no-pager7.3 AI 代码审查服务巡检核心服务# 运行状态systemctl status ai-review# 实时日志排错首选journalctl-uai-review-f--no-pager# 端口监听ss-tuln|grep50017.4 GitLab Runner 巡检# Runner状态gitlab-runner status# 服务状态systemctl status gitlab-runner# 实时日志journalctl-ugitlab-runner-f--no-pager7.5 网络代理快速验证# 互联网连通测试走代理curl-Ihttps://www.baidu.com# 本地接口免代理测试curl--noproxy*http://127.0.0.1:5001# 互联网模型连通性测试替换为实际的大模型接口地址curl-vhttps://your-llm-api-endpoint/v17.6 AI 服务接口测试# 本地服务测试curl-XPOST http://127.0.0.1:5001/api/review\-HContent-Type: application/json\-Htoken: test-token-123\-d{content:function test(){return 1;}}八、全流程问题汇总表核心踩坑清单问题现象根因分析最终解决方案curl 127.0.0.1 本地接口卡死、无响应全局代理劫持本地回环请求配置no_proxy豁免本地/公司内部网络地址服务内清空代理变量pip 安装包报错 externally-managed-environmentDebian Python 系统环境保护安装时追加--break-system-packagesOpenAI SDK 报错unexpected keyword argument ‘proxies’openai 2.x 新版移除 proxies 参数删除代码内 proxies 配置项AI 服务启动失败 CHDIRSystemd 工作目录配置错误修正为项目真实路径/path/to/your/ai-review-service手动调用 AI 接口返回 401 未授权服务内置公司内部网络鉴权正常安全逻辑无需处理本地 qwen2.5:7b 推理速度极慢、效果差纯 CPU 算力不足、模型体量偏大废弃本地模型切换远程 qwen3.6-plus 大模型Ollama 报端口占用、反复重启残留进程占用 11434 端口pkill -9 ollama systemctl restart ollamaCI 流水线任务超时退出远程大模型推理耗时久延长 GitLab CI 任务超时时间Runner 无法拉取公司内部网络 GitLab 代码GitLab 地址未加入免代理列表在no_proxy中补充 GitLab 地址切换远程模型后 Connection error服务无代理无法访问互联网配置服务代理 内互联网分流无法获取 GitLab MR 代码Token 丢失/权限不足重新配置有效GITLAB_TOKEN赋予read_api权限九、架构总结、改造说明与运维优化建议9.1 最终稳定架构GitLab MR事件 → GitLab-Runner触发CI → AI审查服务(5001) → 远程 Qwen3.6-Plus 大模型 → 返回合规审查报告 → 合码门禁拦截/通过9.2 当前整套架构优势优势说明✅ 全服务 systemd 托管开机自启、崩溃自动重启无人值守稳定运行✅ 智能代理分流兼顾公司内部网络通信安全、互联网模型调用✅ 完成模型迭代从本地测试模型升级为生产级云端大模型✅ 全覆盖代码审查安全、规范、性能、漏洞检测满足生产合码门禁要求✅ 全链路问题已修复无遗留 BUG可正式投入生产使用9.3 后续运维优化建议优化项说明超时优化持续监控远程接口响应时长动态调整 AI 服务、GitLab CI 双重超时配置安全优化限制 5001 端口访问源仅放行公司内部网络网段禁止公网访问日志优化配置日志轮转防止长期运行日志文件膨胀占用磁盘容灾优化记录远程大模型备用接口地址主接口异常时可快速切换资源监控新增服务器 CPU、内存、端口状态定时巡检提前预警故障Ollama 保留保留 Ollama 服务可作为离线备用审查方案9.4 整体结论整套环境从服务器初始化、网络代理、基础工具、Python 依赖、Ollama 本地模型、AI 审查服务、GitLab Runner全流程部署完成并完成本地模型 → 远程 qwen3.6-plus 模型的架构改造。所有部署、改造过程中遇到的端口冲突、代理劫持、Python 依赖、服务自启、接口鉴权、模型性能、CI 超时等问题均已落地解决整套服务运行稳定可正式投入日常 GitLab 代码 MR/提交的自动化代码审查工作本文可作为后续环境维护、复刻部署、问题排错的标准文档。适用场景Debian/Ubuntu 系列服务器部署 GitLab-Runner AI 代码审查服务 远程大模型