十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从 0 到 1 构建 GitHub 自动化测试 Case Reviewer Bot(二):小试牛刀-先跑一遍基础的功能

从 0 到 1 构建 GitHub 自动化测试 Case Reviewer Bot(二):小试牛刀-先跑一遍基础的功能 目录从 0 到 1 构建 GitHub 自动化测试 Case Reviewer Bot二小试牛刀-先跑一遍基础的功能源码地址先看全局流程几个先补上的概念FastAPI 服务webhookcase memory目录里先看这几个文件创建 Python 环境复制 basic 配置启动服务先跑一次 smoke test简单看一下本地 smoke test 跑了什么运行遇到的问题1. 端口 8000 被占用2. conda 环境没激活3. PowerShell 禁止执行脚本4. ngrok 命令不存在5. ngrok 版本不一致或账号未认证6. ngrok 启动了但看不到公网地址7. /health 不通8. smoke test 失败9. .env 里填了模型配置但启动很慢总结从 0 到 1 构建 GitHub 自动化测试 Case Reviewer Bot二小试牛刀-先跑一遍基础的功能这一篇先把系统在本地跑起来。但它不只是“启动一个服务”。我更希望这一篇能帮你先建立一个全局印象这个 bot 以后会怎么接 GitHub、怎么读 PR、怎么查历史 case、怎么生成评论。先知道大概流程再看后面的 webhook 和 GitHub API脑子里会有位置。本篇先不真正连接 GitHub不发 PR 评论不打开 LLM。目标是拿到源码 - 创建环境 - 启动服务 - 跑 smoke test - 看懂 basic 版最小流程源码地址这一篇对应的 demo 源码已经放到 GitHubhttps://github.com/yxh175/reviewer-bot后面的命令默认你已经进入 demo 根目录。为了方便描述先把这个目录记成reviewer-bot/先看全局流程这个 basic demo 最终想跑的流程是GitHub PR - GitHub webhook - FastAPI 服务 /github/webhook - 拉取 PR changed files - 提取测试 case - 查询 SQLite case memory - 计算相似度 - 生成 Markdown 评论 - 调 GitHub API 更新 PR 评论用 Mermaid 表达会更清楚GitHub PRGitHub webhookFastAPI /github/webhook拉取 PR changed files提取测试 case查询 SQLite case memory计算相似度生成 Markdown 评论调用 GitHub API 更新 PR 评论这一篇只跑其中的本地部分本地启动 FastAPI - /health 验证服务 - basic-smoke.ps1 验证 case 提取、case memory、patch review对应到本篇要完成的事情其实只有这条小链路python -m app.cli run启动 FastAPI 服务GET /health确认服务可访问运行 basic-smoke.ps1确认本地核心链路可用几个先补上的概念在真正启动前先把几个词说清楚。后面会反复出现。FastAPI 服务这个 bot 本质上是一个 Python Web 服务。启动后它会监听http://127.0.0.1:8000目前最重要的接口有两个GET /health POST /github/webhook这一篇先验证/health。下一篇再让 GitHub 调/github/webhook。webhookwebhook 可以先理解成“别人主动来通知你”。不是我们的服务一直问 GitHub有没有新 PR 有没有新 commit而是 GitHub 有事件时主动 POST 给我们有 PR 更新了我把事件内容发给你的 /github/webhook这一篇还不配置 webhook但先把服务跑起来为下一篇做准备。case memorycase memory 是历史测试用例库。bot 要判断一个新测试 case 是否重复必须先知道仓库里已经有哪些 case。basic 版默认用 SQLitedata/case_memory.db不是因为 SQLite 最强而是因为 basic demo 需要简单、可见、少依赖。目录里先看这几个文件进入项目后可以先看这些app/ 服务和核心逻辑 examples/ 本地示例仓库和示例 PR patch .env.basic.example basic 版快速启动配置 BASIC_QUICKSTART.md 最短运行教程 scripts/basic-smoke.ps1 本地冒烟测试脚本创建 Python 环境这个 demo 用 Python 写推荐用 conda 隔离环境conda env create-f environment.yml conda activatetest-case-reviewer-bot安装 basic 依赖python-m pip install-r requirements-basic.txt博客版 demo 已经把升级版依赖拿掉了。这里先只安装 FastAPI、uvicorn 和 OpenAI SDK 这些 basic 链路会用到的包。basic 默认用 SQLite所以不需要额外安装数据库驱动。这样做的目的不是说 SQLite 最强而是让新人先把 webhook、case memory 和 PR 评论这条链路跑明白。复制 basic 配置basic 版只保留一个配置模板直接复制Copy-Item.env.basic.example.env-Force打开.env先关注这几项APP_NAMEreviewer-bot CASEBOT_RUNTIMEwebhook WEBHOOK_PROCESS_MODEinline WEBHOOK_HOST0.0.0.0 WEBHOOK_PORT8000 DATABASE_PATHdata/case_memory.db EMBEDDING_PROVIDERlocal LLM_REVIEW_ENABLEDfalse LOG_PROGRESStrue LOG_LEVELINFO这里每个配置都有作用CASEBOT_RUNTIMEwebhookpython -m app.cli run会启动服务。WEBHOOK_PROCESS_MODEinlinewebhook 请求里直接处理任务适合 demo。DATABASE_PATHdata/case_memory.dbbasic 版用本地 SQLite 文件保存 case memory。EMBEDDING_PROVIDERlocal先不调用外部模型。LLM_REVIEW_ENABLEDfalse先不让模型延迟影响调试。LOG_LEVELINFO打印阶段日志方便知道服务在做什么。如果忘了复制.env服务也能启动但后面连接 GitHub 时会缺少GITHUB_WEBHOOK_SECRET、GITHUB_TOKEN这些配置。所以建议一开始就从.env.basic.example复制一份。启动服务执行python-m app.clirun正常会看到[casebot 23:29:08] INFO Starting reviewer-bot webhook server on http://0.0.0.0:8000 INFO: Started server process [29932] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRLC to quit)另开一个 PowerShell 验证健康检查curlhttp://127.0.0.1:8000/health预期返回类似ok : True app_name : reviewer-bot runtime : webhook webhook_process_mode: inline database_path : data/case_memory.db先跑一次 smoke test服务能启动不代表核心链路没问题。basic 目录里有一个本地冒烟脚本.\scripts\basic-smoke.ps1它不会连 GitHub也不会调 OpenAI。它做几件事编译 Python 文件。验证 pytest case 提取。验证 TS/JS case 提取。bootstrap 示例 case memory。review 本地 sample patch。生成一份 Markdown 评论。看到下面输出就说明本地核心链路没坏Smoke test passed生成的临时文件在.runtime/smoke/case_memory_smoke.db .runtime/smoke/review-comment.md这个脚本的价值是以后你改代码如果还没接 GitHub也可以先跑它确认 basic 链路还活着。最终的结果简单看一下本地 smoke test 跑了什么如果你打开scripts/basic-smoke.ps1会看到它没有做什么神秘操作。核心就是几步python -B -m compileall app extract_cases(...) python -m app.cli bootstrap-repo --root examples/repo python -m app.cli review-patch examples/sample-pr-diff.patch也就是说在还没接 GitHub 之前它已经验证了示例测试文件 - case 提取 - 写入 SQLite - 示例 patch review - 生成评论 Markdown换成流程图就是这条本地链路跑通后再接 GitHub 会踏实很多。否则你一上来调 webhook出问题时很难知道是 GitHub 配错了还是本地提取器坏了。运行遇到的问题1. 端口 8000 被占用现象address already in use解决方式一关掉占用 8000 的进程。解决方式二改.envWEBHOOK_PORT8001然后启动python-m app.clirun后面 ngrok 也要对应ngrok http 80012. conda 环境没激活现象ModuleNotFoundError: No module named fastapi先看当前环境conda info--envs再激活conda activatetest-case-reviewer-bot如果环境里没装依赖python-m pip install-r requirements-basic.txt3. PowerShell 禁止执行脚本运行 smoke test 时报running scripts is disabled on this system可以临时这样执行powershell-ExecutionPolicy Bypass-File.\scripts\basic-smoke.ps1不建议一上来全局改执行策略先用临时绕过就够了。4. ngrok 命令不存在现象ngrok : 无法将“ngrok”项识别为 cmdlet说明 ngrok 没安装或者不在 PATH 里。解决安装 ngrok。或者用完整路径运行C:\path\to\ngrok.exe http 80005. ngrok 版本不一致或账号未认证现象可能是ERR_NGROK_4018 authentication failed或者unsupported agent version这通常不是代码问题而是 ngrok 本身的问题新版 ngrok 需要登录账号和 authtoken。旧版 agent 可能被账号策略拒绝。Windows Store / msix 版本和手动下载版本可能混用。处理顺序确认版本ngrok version配置 authtokenngrok configadd-authtoken你的_token如果提示 agent 版本不支持就升级 ngrok。如果系统里有多个 ngrok确认当前用的是哪个Get-Commandngrok6. ngrok 启动了但看不到公网地址有时终端显示不完整Forwarding那一行不明显。可以查本地 ngrok API(Invoke-RestMethodhttp://127.0.0.1:4040/api/tunnels).tunnels.public_url如果能看到https://xxxx.ngrok-free.dev说明 tunnel 是正常的。7./health不通先确认服务是否还在跑。Invoke-RestMethodhttp://127.0.0.1:8000/health如果不通看启动服务的终端有没有报错。常见原因端口不对。服务启动失败。当前目录不对。conda 环境不对。8. smoke test 失败先看它卡在哪一步。如果是 compileall 失败说明代码语法有问题。如果是 extractor 返回 0说明示例文件路径或提取规则有问题。如果是 review comment 没生成说明 review-patch 链路出问题。smoke test 的好处就是把问题缩小到本地不要一开始就怀疑 GitHub。9..env里填了模型配置但启动很慢basic 启动本身不应该因为模型慢。但如果你后面触发 PR review并开启EMBEDDING_PROVIDERopenai LLM_REVIEW_ENABLEDtrue模型调用可能让 webhook 等很久。调试阶段建议先保持EMBEDDING_PROVIDERlocal LLM_REVIEW_ENABLEDfalse等 GitHub 评论链路跑通后再打开模型。总结这一篇只验证本地服务和本地链路。暂时不做不配置 GitHub webhook。不发布 PR 评论。不打开 LLM。这几个都放后面。先把本地服务跑稳下一篇再让 GitHub 真的来调用它。到这里你应该有三个确认服务能启动 /health 能访问 basic-smoke 能通过这三个确认完成后再接 GitHub webhook 就更轻松简单了。
返回列表