一些常规的 common 包作为其他项目依赖,一直是使用 gradle 脚本上传 jar 包到 Nexus 私服
- uploadArchives {
-
- def mavenRepoDeployUrl = System.getProperty("mavenRepoDeployUrl")
- def mavenRepoUsername = System.getProperty("mavenRepoUsername")
- def mavenRepoPassword = System.getProperty("mavenRepoPassword")
-
- def snapshotRepositoryUrl = ""
- def snapshotRepositoryUsername = ""
- def snapshotRepositoryPassword = ""
-
-
- repositories {
- mavenDeployer {
- repository(url: mavenRepoDeployUrl) {
- authentication(userName: mavenRepoUsername, password: mavenRepoPassword)
- }
-
- snapshotRepository(url: snapshotRepositoryUrl) {
- authentication(userName: snapshotRepositoryUsername, password: snapshotRepositoryPassword)
- }
- }
-
- }
- }
-
- uploadArchives.onlyIf { !sourceSets.main.allSource.files.isEmpty() }
- install.onlyIf { !sourceSets.main.allSource.files.isEmpty() }
- gradle \
- -Dorg.gradle.parallel=false \
- -Dsnapshot=true \
- -Dci_version=`grep "version \"" build.gradle | awk '{print $2}' |tr -d '"'`-`git rev-parse --short HEAD` \
- clean build uploadArchives -x test
突然有一天正常的上传出现了错误:
Could not transfer artifact com.common:common-xxx:pom:1.3.1-0cd7818-20220727.053652-2 from/to remote (http://xxx.com:8081/nexus/repository/maven-snapshots/): Connection reset
重试几次发现依旧错误,到 Nexus 服务器上查看是否上传正常:
多次尝试都上传上去了,但是对比正常的上传少了 pom 文件:
以下是正常上传的截图:
这个 pom 文件的缺失,会导致无法找到该依赖。
Connection reset 是一个很常见的错误, 服务器端和客户端之间的连接断开,而一方还在读取数据时就会报错,详见:Connection reset问题的分析和解决_owlx的博客-程序员宝宝_connection reset - 程序员宝宝
首先是代码排查,看从上次上传成功至今,该失败的包下有没有改动代码,经查:无
其次是客户端排查,用 --debug 增加调试信息:
- gradle \
- -Dorg.gradle.parallel=false \
- -Dsnapshot=true \
- -Dci_version=`grep "version \"" build.gradle | awk '{print $2}' |tr -d '"'`-`git rev-parse --short HEAD` \
- clean build uploadArchives -x test --debug
由于忘记保存日志,所以没有原始日志,大概日志是,创建连接,连接建立,上传,已上传 170kb,上传 pom 文件,连接释放,然后报错 Connection reset,这也恰巧印证了,只上传了 170 kb 的 jar 包,而没有上传 pom 文件。客户端能找到的日志就这些,接下来去服务器找。
再次是 Nexus 私服日志查询
管理员权限登录才可以看到,或者是具有上传 jar 包权限的角色:
在这里找到日志:
关键信息1: Early EOF,经排查,是类似于服务器端提早关闭了连接,而客户端还在读取。
再次重试,又出现了新的报错:
关键信息2: Idle timeout,经排查,是这个 jetty 设置的时间过短,会导致在拉取过程中,还没结束,时间到了,提前断开连接:
于是,找到相应负责人,将该值改掉,重试,依旧不行!
最后想到了网络,由于该私服是通过公网访问的,所以询问安全、运维是否有针对该域名进行过策略改动,经询问得知,安全还真是新上了一套安全策略。所以在上传 pom 文件时,触发了安全策略,服务器主动关闭了本次 TCP 连接,而客户端还要继续上传文件,所以出现了 Connection reset。
找安全确认该 pom 文件中的哪些内容匹配到了安全策略,最终失败了,无奈,只能让安全撤下该安全策略,重试,成功了。
后续会将该私服迁至内网。