GitHub Actions结合AWS CodeDeploy多仓库部署单EC2并发故障咨询
你推测的情况完全正确,三个仓库共用同一个CodeDeploy应用和部署组是导致这两个问题的核心诱因。
问题原因说明
- 并发部署失败原因:CodeDeploy单个部署组默认限制同一时间仅能执行一个部署任务,同时触发的第二个部署会直接被判定为失败,不会进入等待队列。
- 文件意外删除原因:三个仓库的appspec.yml都配置了将当前仓库代码同步到
/var/www/source根目录,CodeDeploy默认的部署逻辑会在部署前清理目标目录下所有不属于本次部署包的文件,因此A仓库部署完成后,B、C仓库之前放在该目录下的文件都会被自动清理。
解决方案(推荐程度从高到低)
方案1 资源完全隔离(最推荐,无遗留风险)
- 为每个GitHub仓库分别创建独立的CodeDeploy应用与专属部署组,部署资源完全隔离,互不抢占
- 分别修改三个仓库的appspec.yml配置,将部署目标路径对应到各自的独立子目录,例如:
仓库A →/var/www/source/app_a
仓库B →/var/www/source/app_b
仓库C →/var/www/source/app_c
若需要统一对外提供服务,仅需调整Nginx等反向代理的路径映射规则即可。
方案2 调整CodeDeploy配置(适用于暂时无法拆分部署组的场景)
- 进入CodeDeploy对应部署组的设置页面,修改并发部署策略为队列模式,后续触发的部署会自动排队等待前序部署完成,不会直接失败
- 修改所有仓库的appspec.yml配置,仅将当前仓库代码同步到
/var/www/source下的对应子目录,同时关闭CodeDeploy默认的目标目录冗余文件清理功能。注意该方案会存在冗余文件残留的风险,需要定期手动清理无用文件。
方案3 GitHub Actions侧加锁(临时应急方案)
- 在三个仓库的GitHub Actions工作流配置顶部添加并发控制规则,指定同一个全局并发组,限制同一时间仅能运行一个部署任务:
concurrency: group: ec2-common-deploy-lock cancel-in-progress: false
内容的提问来源于stack exchange,提问作者smiley717
相关产品推荐
相关产品推荐

