使用Gradle向AWS CodeArtifact发布12GB大文件时遇Broken pipe错误
问题描述
使用Gradle 8.10.2版本(搭配maven-publish插件)上传12GB大制品到AWS CodeArtifact时,反复触发Broken pipe (Write failed)异常,小体积制品可正常上传。
启用--info日志后观察到:Gradle会在上传至约1GB、3GB、6GB时自动重试3次,第4次失败后终止构建。当前默认重试次数不足以完成大文件上传,且尝试在~/.gradle/gradle.properties中添加的以下系统属性未生效:
systemProp.org.gradle.internal.repository.max.retries=10 systemProp.org.gradle.internal.http.retry=10 systemProp.org.gradle.internal.network.retry.max.attempts=10
相关build.gradle核心配置:
plugins { id 'java' id 'distribution' id 'maven-publish' } repositories { maven { url 'https://us-east-1-codeartifact-domain-0000.codeartifact.us-east-1.amazonaws.com/maven/my-repo/' credentials { username "aws" password System.env.CODEARTIFACT_AUTH_TOKEN } } }
解决方法
1. 配置有效Gradle HTTP重试参数
Gradle 8.x版本的HTTP客户端重试逻辑使用新的属性名,替换之前无效的配置,在~/.gradle/gradle.properties中添加:
# 设置HTTP请求最大重试次数 systemProp.org.gradle.http.retry.max.attempts=10 # 可选:设置重试间隔,避免短时间内频繁重试触发限流 systemProp.org.gradle.http.retry.delay.millis=1000
2. 启用分段上传(大文件最优方案)
AWS CodeArtifact兼容S3的分段上传逻辑,可通过自定义Gradle任务结合AWS SDK实现断点续传式的分段上传,避免单次大连接超时:
在build.gradle中添加自定义任务:
plugins { id 'java' id 'distribution' id 'maven-publish' } // 引入AWS SDK依赖用于分段上传 buildscript { repositories { mavenCentral() } dependencies { classpath 'software.amazon.awssdk:codeartifact:2.25.0' classpath 'software.amazon.awssdk:s3:2.25.0' } } // 自定义大文件上传任务 task uploadLargeArtifact(type: JavaExec) { classpath = buildscript.configurations.classpath mainClass = 'com.example.UploadLargeArtifact' // 需自行编写该上传类 args = [ project.layout.buildDirectory.file('distributions/my-artifact-2.0.1.tar.gz').get().asFile.absolutePath, 'us-east-1', 'my-repo', 'com/my-org/my-artifact/2.0.1/my-artifact-2.0.1.tar.gz', System.env.CODEARTIFACT_AUTH_TOKEN, 'us-east-1-codeartifact-domain-0000' ] } // 让publish任务依赖自定义上传任务 publish.dependsOn(uploadLargeArtifact)
编写UploadLargeArtifact.java类时,可利用AWS SDK的TransferManager组件,自动拆分大文件为多个分段,对失败的分段单独重试,无需从头开始上传。
3. 调整网络超时参数
在Gradle仓库配置中延长连接和读写超时,避免大文件上传耗时过长导致连接被强制断开:
repositories { maven { url 'https://us-east-1-codeartifact-domain-0000.codeartifact.us-east-1.amazonaws.com/maven/my-repo/' credentials { username "aws" password System.env.CODEARTIFACT_AUTH_TOKEN } httpClient { connectTimeout = 60000 // 60秒连接超时 socketTimeout = 3600000 // 1小时读写超时 } } }
4. 验证重试配置生效
执行构建时添加--debug日志,若看到如下类似输出,说明重试次数配置已生效:
Retry attempt 1 of 10 for request to ...
内容的提问来源于stack exchange,提问作者Scott Robey
相关产品推荐
相关产品推荐

