Github Action自托管Runner运行gradlew出现SocketException: Connection reset问题
问题根因
你在Docker中全局安装的Gradle不会被项目自带的gradlew(Gradle Wrapper)直接复用。gradlew脚本的默认逻辑是优先读取项目内gradle/wrapper/gradle-wrapper.properties文件指定的Gradle版本、分发包类型(bin/all),如果本地缓存没有完全匹配的包,就会触发远程下载,你的自托管Runner网络无法正常访问Gradle官方服务,所以抛出Connection reset报错。
可行解决方案
- 方案1:直接调用全局Gradle,跳过Wrapper
工作流中执行命令时,把./gradlew替换为gradle即可,直接调用你Docker中预安装的Gradle,完全不会触发下载逻辑:gradle --version gradle app:assembleBetaRelease --offline - 方案2:预配置Gradle Wrapper缓存,避免运行时下载
如果必须使用gradlew脚本,在Dockerfile中增加Wrapper缓存配置:- 先确认项目
gradle-wrapper.properties中distributionUrl对应的Gradle版本、包类型(你报错中是gradle-7.0.2-all.zip,和你预安装的bin版本不匹配) - Docker构建阶段提前下载对应包,放到Wrapper默认缓存路径
/root/.gradle/wrapper/dists/并完成解压,配置对应读写权限 - 也可以直接修改
distributionUrl为本地已下载的zip包路径,完全屏蔽远程下载逻辑
- 先确认项目
- 方案3:统一项目Wrapper版本
Docker构建阶段执行gradle wrapper --gradle-version 7.0.2 --distribution-type bin,生成和全局安装版本匹配的Wrapper文件,覆盖项目自带的配置,运行时就不会触发下载。
注意事项
如果你的容器运行用户不是root,需要确认Gradle安装目录、.gradle缓存目录对应用户有读写权限,权限不足导致无法读取预安装文件时,也会触发远程下载逻辑。
内容的提问来源于stack exchange,提问作者Shudy
相关产品推荐
相关产品推荐

