我故意搞坏了自己的CI/CD流水线——看看Devin怎么修好的(以及它哪里翻车了)
三年来,我一直在AWS上运营着一款小型SaaS应用。我的CI/CD流水线堪称弗兰肯斯坦式的缝合怪:由GitHub Actions、Terraform和我联合创始人在凌晨两点写的一堆bash脚本拼凑而成。上周,一个配置错误的IAM策略导致部署静默失败了整整六小时。就在那时,我决定用真正的DevOps工作来考验Devin——这个AI软件工程师。
以下是当我让Devin处理三个生产级DevOps任务时发生的情况:调试故障流水线、配置基础设施和迁移数据库。结果令人惊讶、挫败,但最终很有价值。
Devin在DevOps中实际能做什么(和不能做什么)
Devin是一个自主AI代理,能执行代码、运行终端命令并与云API交互。它不是个花哨的聊天机器人——它有自己的工作区、浏览器和shell。但关键警告来了:Devin不理解你的业务上下文。它不知道你的生产数据库有50GB的客户数据,也不知道你的staging环境由五个团队共享。
我是通过惨痛教训才明白这点的。当我让Devin“修复部署流水线”时,它立即试图删除整个ECS集群,因为它看到了一个“配置错误”的任务定义。幸好我当时正盯着屏幕。
任务1:调试故障的GitHub Actions流水线
问题: 我的ECS部署GitHub Actions工作流在terraform apply步骤失败,出现神秘错误:Error: error reading ECS service: AccessDeniedException。
我给Devin的信息: 失败GitHub Actions运行的链接、仓库URL和错误信息。
Devin的处理方式:
- 克隆仓库并读取工作流YAML文件
- 本地运行
terraform plan复现错误 - 检查GitHub Actions运行器关联的IAM角色
- 识别出角色缺少
ecs:DescribeServices权限
修复方案: Devin将缺失的IAM策略语句添加到Terraform模块并推送了PR。
做得好的地方: Devin在不到2分钟内正确识别了根因,甚至还添加了注释解释为什么需要该权限。
翻车的地方: Devin没有检查该IAM角色是否被其他工作流共享。它的修复会让同一角色访问所有ECS服务,而不仅仅是这条流水线使用的那个。我不得不手动将策略限定到特定服务ARN。
教训: Devin擅长缩小权限错误范围,但你必须审查其变更的影响范围。
任务2:用Terraform配置基础设施
问题: 我需要搭建新的staging环境,包含RDS PostgreSQL数据库、ECS Fargate集群和应用负载均衡器。
我给Devin的信息: 高层描述:“在us-east-1创建staging环境,包含PostgreSQL数据库(db.t3.micro)、运行单个容器的Fargate集群,以及指向它的ALB。”
Devin的处理方式:
- 从头创建新的Terraform模块
- 定义VPC、子网、安全组和互联网网关
- 配置指定实例类型的RDS实例
- 设置ECS集群和任务定义
- 配置ALB将流量转发到容器
输出结果: 300行的Terraform配置,首次terraform apply就成功运行。
做得好的地方: Devin遵循了最佳实践——为RDS和ECS使用独立子网,启用存储加密,并设置正确的健康检查路径。
翻车的地方: 三个问题:
- Devin将数据库密码硬编码为无默认值的变量。运行
terraform apply时因变量未设置而失败。 - 为状态文件创建了S3存储桶,但未启用版本控制或加密。
- ALB安全组对
0.0.0.0/0的80端口完全开放。
教训: Devin的基础设施代码语法正确但安全意识薄弱。部署前务必审计网络规则和加密设置。
任务3:零停机数据库迁移
问题: 我想将PostgreSQL数据库从单RDS实例迁移到读写副本架构,且不能有停机时间。
我给Devin的信息: “创建脚本将只读副本提升为主库,更新应用连接字符串,并验证数据完整性。”
Devin的处理方式:
- 用
boto3编写Python脚本提升只读副本 - 创建Lambda函数更新Route53中的RDS实例端点
- 添加验证步骤对行样本运行校验和
输出结果: 150行带错误处理和日志记录的脚本。
做得好的地方: Devin正确处理了提升过程——停止复制,等待副本追上,然后提升。Route53更新是原子操作。
翻车的地方: Devin的脚本假设应用是无状态的,能处理短暂的连接中断。我的实际应用有长时间运行的数据库事务会失败。更关键的是,Devin没有考虑到应用的连接池可能持有旧主库的陈旧连接。我不得不添加pg_terminate_backend调用来在提升后终止活跃连接。
教训: Devin能写迁移脚本,但不理解应用特定的状态管理。你必须手动处理连接池和事务超时。
Devin在DevOps中的短板
经过三个任务,这是我的诚实评估:
擅长:
- 复现和诊断权限错误
- 生成样板Terraform或CloudFormation
- 为重复性任务编写脚本(如轮换密钥、清理旧资源)
- 为现有基础设施创建文档
不擅长:
- 未经人工审查的生产变更(它会把事情搞砸)
- 理解成本影响(不会检查
m5.large是否必要) - 处理有状态服务(数据库、消息队列、缓存)
- 安全加固(默认采用宽松设置)
我在DevOps中使用Devin的实际工作流程
经过这次实验,我采用了严格的工作流程:
在沙箱环境中隔离Devin。 创建独立的AWS账户,IAM角色对生产环境只读,对沙箱账户完全访问。
先写详细规范。 给Devin提供Markdown文件,包含明确约束:“使用t3.small而非t3.medium。启用删除保护。为所有资源添加标签Project:Staging。”
审查每个网络规则。 Devin总是把端口开得太宽。我现在在每个Devin生成的Terraform计划后运行自定义脚本,标记任何
0.0.0.0/0规则。先测试回滚再部署。 Devin不写回滚脚本。我要求它在每个创建脚本旁边生成销毁脚本。
永远不要信任状态。 Devin会愉快地在错误的工作区运行
terraform destroy。我现在在每个命令中显式传递工作区名称。
让我惊讶的一件事
Devin在读取日志方面出奇地好。当我给它一段故障应用的CloudWatch日志片段时,它正确识别出问题是缺少环境变量——而不是我假设的数据库问题。然后它通过ECS任务定义追踪该变量,发现拼写错误(DATABASE_URL vs DATABASE_UR)。这为我节省了一小时的手动日志挖掘时间。
你的下一步行动
不要从生产环境开始。这是我的建议:
- 用50美元额度创建一次性AWS账户
- 给Devin配置简单双层应用(Web服务器+数据库)的任务
- 故意破坏基础设施——移除安全组规则、更改子网CIDR——看看Devin能否诊断问题
- 只有到那时,才给它真正的非关键任务,比如轮换API密钥或更新CloudWatch告警
Devin会让你的DevOps工作更快,但也会创造新的故障模式。当你忘记它是工具而非工程师的那一刻,就是你的生产环境宕机之时。
现在去你的沙箱账户里搞点破坏——然后让Devin来修复吧。