前段时间GitHub把Copilot的coding agent正式开放了public preview,核心卖点是:你在GitHub上开个issue,直接assign给Copilot,它自己拉代码、改代码、跑测试、提PR。听起来很美,但实际用起来到底怎么样?我花了两周在几个项目上折腾了一圈,记录一下真实体验。
什么是GitHub Copilot Coding Agent
先说清楚这东西是什么。GitHub从2025年初开始搞agentic workflows,分三个层级:
| 层级 | 产品 | 能力 | 运行环境 |
|---|---|---|---|
| 补全 | Copilot Completions | 行级/块级代码补全 | 编辑器本地 |
| 编辑 | Copilot Edits / Agent Mode | 多文件编辑、终端命令、自动修错 | VS Code本地 |
| 自主代理 | Copilot Coding Agent | 完整开发流程:读issue→改代码→跑CI→提PR | GitHub Actions云端 |
今天重点说第三个——Coding Agent。它的前身是2025年2月公布的Project Padawan,5月份正式以public preview发布。
工作流程
整个流程是这样的:
创建Issue → assign给Copilot → Copilot加👀表情确认 → 启动GitHub Actions虚拟机 → clone仓库 → 分析代码库(用RAG+代码搜索) → 修改代码 → 跑测试和lint → 推送到draft PR → 通知你review
关键点:它跑在GitHub Actions的runner上,不是你本地机器。每次任务启动一个独立的安全沙箱环境。
实际测试:三个真实场景
场景1:给React组件加单元测试
我有个React项目,里面一个UserProfile组件完全没测试。开了个issue:
Title: Add unit tests for UserProfile componentThe UserProfile component at src/components/UserProfile.tsx currently has no test coverage. Please add comprehensive unit tests covering:- Rendering with different user roles- Loading state- Error state - Edit profile button click handler
assign给Copilot后,大概8分钟出了一个PR。生成的测试代码:
import { render, screen, fireEvent, waitFor } from '@testing-library/react';import { UserProfile } from './UserProfile';import { mockUser, mockAdmin } from '../__mocks__/users';describe('UserProfile', () => { it('renders user info correctly', () => { render(<UserProfile user={mockUser} />); expect(screen.getByText(mockUser.name)).toBeInTheDocument(); expect(screen.getByText(mockUser.email)).toBeInTheDocument(); }); it('shows admin badge for admin users', () => { render(<UserProfile user={mockAdmin} />); expect(screen.getByTestId('admin-badge')).toBeInTheDocument(); }); it('displays loading skeleton when loading', () => { render(<UserProfile user={null} isLoading={true} />); expect(screen.getByTestId('profile-skeleton')).toBeInTheDocument(); }); it('shows error message on fetch failure', () => { render(<UserProfile user={null} error="Network error" />); expect(screen.getByText(/network error/i)).toBeInTheDocument(); }); it('calls onEdit when edit button is clicked', () => { const onEdit = jest.fn(); render(<UserProfile user={mockUser} onEdit={onEdit} />); fireEvent.click(screen.getByRole('button', { name: /edit/i })); expect(onEdit).toHaveBeenCalledWith(mockUser.id); });});
质量不错,覆盖了我要求的所有场景。它还自动创建了mock数据文件。不过有个问题——它假设组件有data-testid="profile-skeleton"这个属性,但实际组件里没有。PR里的测试跑不过,Copilot检测到失败后自动修了一轮,给组件加上了testid。
这个自我修复能力是亮点。
场景2:重构API路由从Express迁移到新格式
试了个稍微复杂的任务:把一组Express路由迁移到Next.js App Router的route handler格式。
Title: Migrate /api/products routes from Express to Next.js App RouterMigrate the following Express routes to Next.js App Router format:- GET /api/products → app/api/products/route.ts- POST /api/products → app/api/products/route.ts - GET /api/products/:id → app/api/products/[id]/route.ts- PUT /api/products/:id → app/api/products/[id]/route.ts- DELETE /api/products/:id → app/api/products/[id]/route.tsKeep the same validation logic and error handling.
这次花了大概15分钟。结果基本能用,但踩了几个坑:
坑1:它把原来Express中间件里的认证逻辑直接内联到了每个route handler里,没有提取成共享的middleware。5个文件里重复了5遍同样的token校验代码。
坑2:原来的错误处理用了自定义的AppError类,Copilot没有import这个类,而是自己写了个新的错误处理逻辑,跟项目其他地方的风格不一致。
坑3:数据校验用的zod schema它找到了,但漏掉了一个嵌套的productVariantSchema,导致POST请求的校验不完整。
这说明一个问题:Copilot对单文件的理解很强,但跨文件的项目级理解还有明显短板。它的RAG搜索能找到相关文件,但不一定能理解文件之间的依赖关系。
场景3:修一个CSS布局bug
开了个issue,贴了张截图说明侧边栏在移动端溢出的问题。Copilot支持看图——它能识别issue里的截图。
结果:完美修复。它准确找到了问题所在(一个min-width写死了像素值),改成了响应式的方案,还顺手加了个media query处理折叠态。这种局部、明确的bug修复是它最擅长的。
费用和性能数据
| 指标 | 场景1(加测试) | 场景2(路由迁移) | 场景3(CSS修复) |
|---|---|---|---|
| 耗时 | ~8分钟 | ~15分钟 | ~5分钟 |
| PR质量(1-5) | 4 | 2.5 | 5 |
| 自动修复轮次 | 1次 | 0次(没跑测试) | 0次 |
| Actions分钟消耗 | ~6 min | ~12 min | ~3 min |
| premium requests | ~15 | ~30 | ~8 |
费用方面:从2025年6月4日开始,每次模型请求消耗1个premium request。Pro+计划包含一定额度,超出后按量计费。Actions分钟数也从你的额度里扣。
简单任务的性价比很高。复杂任务就要掂量一下了——30个premium requests加上12分钟Actions,如果PR质量不行还要人工返工,不一定比自己写快。
copilot-instructions.md:提升质量的关键
发现一个能显著改善结果的做法:在仓库根目录放一个.github/copilot-instructions.md文件,告诉Copilot项目的约定。
# Copilot Instructions## Code Style- Use named exports, not default exports- Error handling: always use AppError class from src/lib/errors- Auth middleware: import from src/middleware/auth, don't inline## Testing - Use @testing-library/react, not enzyme- Mock files go in __mocks__ directory next to the test- All components must have data-testid for integration tests## Architecture- API routes use shared middleware from src/middleware/- Validation schemas in src/schemas/, import don't recreate- Database queries through repository pattern in src/repositories/
加了这个文件后重新跑场景2,结果好了很多——认证逻辑正确引用了中间件,错误处理用了AppError。不是100%完美,但从2.5分提到了3.5分。
这个文件相当于给agent做了一次onboarding,跟你给新入职的同事写项目文档一样。文档写得越清楚,agent干活越靠谱。
安全机制
GitHub在安全方面做得比较谨慎:
- Agent只能推送到它自己创建的分支,不能碰你的main分支
- 提交PR的人不能自己approve,所以即使是Copilot提的PR也必须有人review
- 网络访问默认限制在白名单内,可以自定义
- CI/CD workflow需要人工批准才能运行
该说不说,这比很多开源的SWE agent方案安全多了。至少不会出现agent自己merge代码到生产环境的情况。
跟其他SWE Agent的对比
| 维度 | GitHub Copilot Agent | Cursor Agent Mode | Devin |
|---|---|---|---|
| 运行环境 | GitHub Actions云端 | 本地编辑器 | 独立云端沙箱 |
| 触发方式 | Issue/Chat/CLI | 编辑器内对话 | Slack/Web对话 |
| 异步执行 | ✅ 后台运行 | ❌ 需要开着编辑器 | ✅ 后台运行 |
| 代码审查 | 标准PR流程 | 本地diff | 独立PR |
| MCP支持 | ✅ | ✅ | ✅ |
| 价格 | Pro+ $39/月起 | $20/月起 | $500/月 |
| 适合场景 | 已有GitHub工作流的团队 | 个人开发/快速迭代 | 复杂独立任务 |
GitHub的最大优势是跟现有开发流程无缝集成。你不用学新工具、不用改工作流,issue → PR → review → merge这套大家早就熟了。Copilot只是在中间多了一个”AI帮你写代码”的环节。
适合什么、不适合什么
很适合的:
- 添加/补充单元测试(最佳使用场景,质量稳定)
- 修复明确的、有截图的UI bug
- 简单的重构(重命名、提取函数)
- 文档更新和README维护
- 添加新的API endpoint(如果项目有清晰的pattern)
不太行的:
- 跨模块的大规模重构
- 需要理解业务逻辑的复杂feature
- 涉及数据库schema变更的任务
- 性能优化(它不知道瓶颈在哪)
- 没有测试覆盖的老项目(它没法验证自己的修改对不对)
官方的说法是”excels at low-to-medium complexity tasks in well-tested codebases”,这个定位很准确。别指望它替你做架构决策或写核心业务逻辑。
实用建议
如果你打算在团队里用,几个建议:
1. 写好copilot-instructions.md。这个文件的ROI极高,花30分钟写一份能让后续每个agent任务的质量提升一个档次。
2. Issue描述要具体。别写”优化用户体验”,写”UserProfile组件在mobile端sidebar溢出,需要在768px断点以下折叠”。描述越精确,结果越好。
3. 保持测试覆盖。agent的自我修复能力依赖CI。没有测试的项目,agent改完代码不知道有没有搞坏别的东西。
4. 小任务批量派。可以同时assign多个issue给Copilot,它并行处理。把那些你不想干但一直拖着的小活儿(加测试、修lint warning、更新依赖)一口气丢给它。
5. Review不能省。不管PR看起来多完美,都要认真review。agent生成的代码通过了测试不代表逻辑正确,尤其是边界情况。
写在最后
GitHub Copilot Coding Agent不是什么革命性的东西,它就是把”AI帮你写代码”这件事跟GitHub的工作流串起来了。但正是这个”串起来”的动作有价值——你不需要切换工具、不需要学新概念、不需要改变团队的协作方式。开个issue,assign一下,等PR就行了。
对于已经在用GitHub的团队来说,值得开个Pro+试试。先从加测试和修小bug开始,找到感觉后再慢慢扩大使用范围。
参考链接: