GitHub Actions执行aws s3 sync成功却返回退出码2问题求助
错误原因
aws s3 sync命令的退出码2属于非致命错误,官方定义为:核心同步逻辑执行完成,目标文件已成功上传,但执行过程中存在被跳过的文件。- 该场景的触发原因是GitHub Actions的Ubuntu运行环境中,工作目录存在你配置的
--exclude规则之外的、无法正常读取的文件/目录:比如runner自动生成的.github工作流目录(你未在排除规则中声明)、临时系统文件、权限受限的隐藏文件,或是同步过程中被动态修改的文件。 - 本地运行无报错是因为本地开发环境的工作目录不存在runner特有的异常文件,所有文件都匹配排除规则或可正常读取,因此返回代表完全成功的退出码0。
解决方案
- 方案1:补全排除规则,将不需要同步的runner特有目录加入忽略列表,最常见的是补充
.github目录的排除规则,修改后的命令如下:
aws s3 sync . s3://bucket/dev/backend --exclude 'venv/*' --exclude '.aws-sam/*' --exclude '.git/*' --exclude '.gitignore' --exclude '.github/*'
你也可以根据实际情况添加其他临时文件的排除规则,比如--exclude '*.tmp'、--exclude '*~'等。
- 方案2:确认核心需要同步的文件已经上传成功的前提下,主动忽略非致命的退出码2,修改命令如下:
aws s3 sync . s3://bucket/dev/backend --exclude 'venv/*' --exclude '.aws-sam/*' --exclude '.git/*' --exclude '.gitignore' || [ $? -eq 2 ]
该写法会将退出码2识别为成功状态,其他异常错误码仍会正常抛出阻断工作流。
- 方案3:如果是工作目录下的符号链接导致的文件跳过问题,可以添加
--no-follow-symlinks参数不跟随符号链接,修改命令如下:
aws s3 sync . s3://bucket/dev/backend --exclude 'venv/*' --exclude '.aws-sam/*' --exclude '.git/*' --exclude '.gitignore' --no-follow-symlinks
内容的提问来源于stack exchange,提问作者jono2010
相关产品推荐
相关产品推荐

