You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:37:04