AWS CodeBuild构建Android成功但artifact上传S3失败求助
排障步骤与解决方案
核心报错本质
本次报错的核心触发点是UPLOAD_ARTIFACTS阶段找不到匹配的目标文件路径,排查优先级上先解决路径匹配问题,再处理S3权限问题即可。
第一步:解决「无匹配artifact路径」的报错
- 目前你buildspec中配置的APK输出路径为
app/build/outputs/apk/app-debug.apk,新版Android Gradle Plugin生成debug APK的默认路径已经变更,实际输出会多一层debug目录,正确路径应为app/build/outputs/apk/debug/app-debug.apk,路径少写层级就会直接触发找不到文件的错误。 - 不要靠猜测确认路径,可直接在buildspec的build阶段加一行调试命令,把容器内实际生成的APK路径打印到构建日志里,100%确认路径准确性:
version: 0.2 phases: build: commands: - ./gradlew assembleDebug # 打印容器内所有APK的真实路径,参考日志输出填写最终路径 - find . -name "*.apk" -type f artifacts: files: # 替换为上一步find命令输出的真实APK相对路径 - <find命令输出的apk实际路径> - 日志中CodeBuild展开路径仅到
app/build/outputs/就中断报错,完全匹配路径不匹配、目标文件不存在的特征,和S3权限无直接关联。
第二步:修正S3桶权限配置,避免路径修正后上传失败
你当前的桶策略存在两处核心权限问题,就算路径修正后也会出现上传报错:
- 权限授权范围不全:当前策略只给S3桶本身(
arn:aws:s3:::chiragh-andriod)授权,没有给桶内的对象资源授权。AWS S3需要单独对桶、桶内对象分别授权,当前配置不允许执行文件写入操作。 - 授权主体错误:当前策略仅给IAM用户
salahuddin授权,但CodeBuild执行上传操作时,用的是项目绑定的CodeBuild服务角色,不是这个IAM用户,相当于服务角色根本没有桶的操作权限。
正确的最小权限策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCodeBuildUpload", "Effect": "Allow", // 替换为你的CodeBuild项目关联的服务角色ARN "Principal": { "AWS": "arn:aws:iam::816888571071:role/你的CodeBuild服务角色名称" }, "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::chiragh-andriod", "arn:aws:s3:::chiragh-andriod/*" ] } ] }
其他易踩的配置坑
- 检查CodeBuild项目的Artifact配置项,若手动配置了错误的基础目录(比如把基础目录设为
app/build/outputs而非项目根目录.),会导致路径拼接错位,找不到目标文件。 - 若在artifacts配置中设置了
base-directory参数,注意该参数是所有files路径的前置拼接目录,比如设置base-directory: app/build/outputs/apk/debug后,files中仅需要写app-debug.apk即可,不要重复拼接完整路径造成错位。
内容的提问来源于stack exchange,提问作者Muhammad Salahuddin
相关产品推荐
相关产品推荐

