GitHub Copilot在2025-2026年发布了一系列更新,从最初的代码补全工具演变成了包含Chat、CLI、代码Review的完整AI开发体验。很多工程师还停在"装了个能Tab的插件"的认知,没用到它的一半功能。
这篇文章面向DevOps/运维工程师,重点讲Copilot在基础设施代码(Terraform、K8s、Dockerfile)和自动化脚本场景的实际用法。
定价与计划(2026年)#
GitHub Copilot目前有两个主力付费计划:
- Pro($10/月):GPT-5.4作为默认模型,支持Claude Sonnet 4.6、Gemini 2.5 Pro可选,覆盖日常开发需求
- Pro+($39/月):在Pro基础上解锁Claude Opus 4、o3等高端模型,适合需要处理复杂推理任务的场景
对DevOps工程师来说,Pro计划足够。需要频繁处理大型重构或复杂架构决策时再考虑Pro+。
两种使用入口#
先搞清楚Copilot的两个主要使用入口:
内联补全(Inline Completion):就是你在编辑器里写代码时,AI自动补全。历史最久,大多数人熟悉。
Copilot Chat:侧边栏的对话窗口,可以问问题、解释代码、生成代码片段。在VSCode里通过Ctrl+Shift+I/Cmd+Shift+I打开,或者点击侧边栏的Chat图标。
两者是互补的,不是替代关系:
- 写代码时用内联补全,效率最高
- 遇到问题、需要解释、要生成大段代码时用Chat
- 重构、写测试、批量修改用Chat效果更好
Copilot Chat:斜杠命令是核心#
Chat窗口里的/命令是Copilot Chat最有价值的部分,专门针对常见开发任务做了优化。
/explain:理解陌生代码#
选中一段代码,在Chat里输入:
/explain
Copilot会解释选中代码的逻辑,包括:做什么、怎么做、关键变量的作用。
适合场景:
- 接手遗留代码
- 读开源项目源码
- 理解复杂正则表达式
- 搞清楚某段K8s controller逻辑
实际例子:选中这段awk命令,然后/explain:
kubectl get pods -A | awk 'NR>1 {
split($0, a, " ")
if (a[4] != "Running" && a[4] != "Completed")
print a[1], a[2], a[4], a[5]
}'
Copilot会逐行解释:NR>1跳过表头,split分割字段,条件过滤非Running/Completed的Pod。
/fix:修复错误#
遇到报错,选中有问题的代码,把错误信息粘贴到Chat里:
/fix
错误信息:
Error: context deadline exceeded while waiting for resource to be ready
goroutine 47: kubernetes/client-go/tools/watch.UntilWithSync
Copilot会分析错误原因并给出修复建议。比直接把错误粘到搜索引擎效果好,因为它知道你的代码上下文。
/tests:生成测试#
选中一个函数,输入:
/tests
Copilot会为选中的函数生成单元测试。对于Go代码,它会用testing包和testify;对Python会用pytest。
生成后通常需要:
- 补充测试用例(Copilot生成的往往只有happy path)
- 修改mock对象(Copilot不知道你的项目里用什么mock库)
- 处理外部依赖(数据库、网络调用)
/doc:生成文档#
选中函数,输入:
/doc
Copilot生成docstring/注释。对于要交接给别人的代码,这个命令能省很多时间。
/optimize 和 /simplify#
/optimize 这个函数有性能问题,帮我优化
/simplify 这段逻辑太复杂,帮我简化
注意:这两个命令给的建议不一定正确,需要自己判断。特别是优化建议,AI有时会把正确但略慢的代码改成错误但看起来更快的版本。
Workspace上下文#
Copilot Chat默认只知道你当前打开的文件。要让它理解整个项目,有几种方式:
#file引用#
在Chat里用#file:引用特定文件:
#file:terraform/main.tf #file:terraform/variables.tf
帮我检查这两个文件之间的变量引用是否一致
#codebase搜索#
#codebase 项目里有没有现成的HTTP重试逻辑?
Copilot会搜索整个workspace,找相关代码。
打开相关文件#
Copilot的内联补全会考虑当前编辑器里所有打开的标签页。所以在写某个文件时,把相关文件也打开,补全质量会明显提高。
比如写Terraform的resource时,把variables.tf和locals.tf也打开,Copilot就能正确引用已有的变量名。
Copilot for CLI:命令行补全#
gh copilot是Copilot的CLI工具,可以用自然语言查询shell命令。
安装#
gh extension install github/gh-copilot
需要先安装gh(GitHub CLI)并登录。
两个核心命令#
gh copilot suggest:生成命令
gh copilot suggest "列出所有CPU使用率超过80%的进程,按使用率降序排列"
输出:
? What kind of command can I help you with?
> shell command
Suggestion:
ps aux --sort=-%cpu | awk 'NR==1 || $3>80 {print $0}'
? Select an option
> Copy command to clipboard
Explain command
Execute command
Revise command
Cancel
gh copilot explain:解释命令
gh copilot explain "find /var/log -name '*.log' -mtime +7 -exec gzip {} \;"
输出对命令的逐部分解释,适合理解从别人那里复制来的命令。
CLI补全在DevOps中的典型用法#
AWS CLI组合查询:
gh copilot suggest "查找所有us-west-2中标签包含Environment=prod的EC2实例,输出实例ID和私有IP"
kubectl复杂命令:
gh copilot suggest "找出所有namespace中restart次数超过5次的容器,输出namespace/pod/container/restart_count"
OpenSSL操作:
gh copilot suggest "检查一个PEM格式证书文件的过期时间,如果30天内过期则输出警告"
记住这些命令的完整语法要靠备忘录,用自然语言描述需求更快。
在DevOps工作中的实际用法#
Terraform#
Terraform是Copilot补全效果最好的场景之一,因为HCL语法固定、资源结构可预测。
写resource:
# 创建EKS集群,版本1.29,节点组使用m5.xlarge
# 启用私有访问,关闭公共访问
# 节点组最小1个,最大5个,期望3个
resource "aws_eks_cluster" "main" {
写完注释,Copilot通常能补全完整的resource块,包括vpc_config、kubernetes_network_config等必填字段。
写variable:打开了main.tf后,Copilot在variables.tf里补全时能推断出需要哪些变量:
variable "cluster_name" {
# Copilot会补全 type, description, validation
写output:
# 导出EKS集群的endpoint和CA证书,用于配置kubeconfig
output "
检查Terraform代码:
在Chat里:
#file:terraform/main.tf
这个Terraform配置有哪些安全最佳实践没有遵守?
重点看IAM权限、网络配置、加密设置
Dockerfile#
# Python 3.11应用,使用multi-stage build
# 第一阶段构建依赖,第二阶段运行时镜像
# 使用非root用户运行
# 只安装必要依赖,减小镜像体积
FROM python:3.11-slim AS builder
Copilot会生成完整的多阶段Dockerfile,包括:
- 安装系统依赖
- pip install(用
--no-cache-dir减小体积) - 复制应用代码
- 切换到非root用户
- 设置ENTRYPOINT
Kubernetes YAML#
Deployment:
# 应用名:order-processor
# 副本数:3
# 镜像:your-registry/order-processor:latest
# 资源:CPU 100m-500m,内存 128Mi-512Mi
# 环境变量从ConfigMap和Secret读取
# 健康检查:/health HTTP接口
apiVersion: apps/v1
kind: Deployment
metadata:
Service Account + RBAC:
在Copilot Chat里:
给我写一套K8s RBAC配置:
- ServiceAccount名:log-collector
- namespace:monitoring
- 权限:只读访问pods、configmaps、events
- 不能访问secrets
NetworkPolicy:
写一个NetworkPolicy,限制某个Pod只能:
- 接受来自同namespace的流量
- 发出到 kube-dns(53端口)的流量
- 发出到外部监控服务(9090端口)的流量
其他流量全部拒绝
Shell脚本#
Shell脚本是Copilot补全质量最稳定的场景:
#!/bin/bash
# 巡检脚本:检查K8s集群健康状态
# 检查项:节点状态、系统Pod状态、PVC状态、最近的Event
# 输出:彩色终端输出 + 生成HTML报告
set -euo pipefail
# 颜色定义
写完这个注释,Copilot会补全颜色变量定义,然后继续写函数体。
提高补全命中率的技巧#
技巧1:写好第一行注释#
第一行注释是Copilot推断意图的最重要信息。写得越具体,补全越准:
差:
# 发送告警
def send_alert():
好:
# 发送Slack告警:将告警信息格式化为Slack Block Kit消息,通过Webhook发送
# 支持:severity级别(critical/warning/info)、附加字段、颜色区分
# 参数:title(str), message(str), severity(str), webhook_url(str), extra_fields(dict)
def send_alert():
技巧2:打开相关文件#
写A文件时,把B、C文件也在编辑器里打开。Copilot会把所有打开的文件作为上下文,补全会更准确(尤其是函数调用、变量名)。
技巧3:在现有代码附近写新代码#
在文件里找一个风格相近的函数,在它下面开始写新函数。Copilot会参考邻近代码的风格,生成的代码更符合项目规范。
技巧4:用已有的函数名暗示意图#
# 已有:check_disk_usage(), check_memory_usage(), check_cpu_usage()
# 写新函数时:
def check_network_
# Copilot会猜出你想写网络检查函数,并参考已有函数的结构
技巧5:部分接受后继续触发#
Tab接受一部分后,继续触发:光标停留在一行末尾,等待下一个补全出现。Copilot会继续生成下一段逻辑。
配置建议#
VSCode settings.json里的Copilot配置#
{
"github.copilot.enable": {
"*": true,
"markdown": false,
"plaintext": false
},
"github.copilot.editor.enableAutoCompletions": true,
"github.copilot.chat.localeOverride": "zh-CN"
}
关闭markdown和plaintext的补全,避免在写文档时频繁触发。
.github/copilot-instructions.md#
GitHub Copilot支持在仓库里放.github/copilot-instructions.md,内容会作为Copilot Chat的系统上下文(类似Cursor的.cursorrules):
## 项目约定
- Go版本:1.22
- 错误处理:使用 errors.Wrap 包装,不用 fmt.Errorf
- 日志:使用 zerolog,不用 log 标准库
- 测试:testify + gomock,覆盖率要求80%+
- K8s操作:通过controller-runtime,不直接调用kubectl
## 禁止事项
- 不使用 panic
- 不在生产代码里用 time.Sleep
- 日志里不输出密码、token、私钥
常见问题#
Q:Copilot补全的代码有版权问题吗?
GitHub Copilot有"Duplication Detection"功能,可以在设置里启用,让Copilot不建议与公开代码匹配度高的代码片段。对于商业项目,建议开启。
Q:Copilot会把我的代码发给GitHub/微软吗?
默认情况下,Copilot会发送代码片段用于改善模型。Business和Enterprise版本可以关闭这个选项(“Code Snippets - User"在Organization设置里)。
Q:Copilot默认用的是什么模型?
2026年Pro计划的默认模型是GPT-5.4。你也可以在Chat窗口切换到Claude Sonnet 4.6或Gemini 2.5 Pro。Pro+计划额外解锁Claude Opus 4和o3。不同模型在代码补全和Chat里都可选择。
Q:为什么有时候补全质量突然变差?
常见原因:
- 上下文太杂(打开了太多不相关的文件)
- 当前文件命名不清晰,Copilot无法推断用途
- 代码风格前后不一致,AI难以找到参考
解决:关闭不相关的标签页,给文件和函数起更有语义的名字。






