Nexus 私服上传 jar 包 Connection rest

一,背景介绍

      一些常规的 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 服务器上查看是否上传正常:

Nexus 私服上传 jar 包 Connection rest_第1张图片

        多次尝试都上传上去了,但是对比正常的上传少了 pom 文件:

        以下是正常上传的截图:

Nexus 私服上传 jar 包 Connection rest_第2张图片 

         这个 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 包权限的角色:

Nexus 私服上传 jar 包 Connection rest_第3张图片

         在这里找到日志:

Nexus 私服上传 jar 包 Connection rest_第4张图片

 

        关键信息1: Early EOF,经排查,是类似于服务器端提早关闭了连接,而客户端还在读取。

        再次重试,又出现了新的报错:

 Nexus 私服上传 jar 包 Connection rest_第5张图片

        关键信息2: Idle timeout,经排查,是这个 jetty 设置的时间过短,会导致在拉取过程中,还没结束,时间到了,提前断开连接:

 Nexus 私服上传 jar 包 Connection rest_第6张图片

        于是,找到相应负责人,将该值改掉,重试,依旧不行!

        最后想到了网络,由于该私服是通过公网访问的,所以询问安全、运维是否有针对该域名进行过策略改动,经询问得知,安全还真是新上了一套安全策略。所以在上传 pom 文件时,触发了安全策略,服务器主动关闭了本次 TCP 连接,而客户端还要继续上传文件,所以出现了 Connection reset。

四,解决办法

找安全确认该 pom 文件中的哪些内容匹配到了安全策略,最终失败了,无奈,只能让安全撤下该安全策略,重试,成功了。

后续会将该私服迁至内网。

你可能感兴趣的:(maven,jar,java,Nexus)