Jenkins+Nexus - 解析 POM 失败,未通过对等验证

Jenkins+Nexus - Parsing POM fails with Peer Not Authenticated

不是重复的!我查看了类似标题的 SO 资源,但这个问题似乎与 Jenkins 和 ssh 有关,其他的没有涵盖这个问题。具体来说,这不是 Maven 问题,而是 Jenkins 问题。

解析我的 POM 时,Jenkins 无法通过 ssh 连接到 nexus(它正在寻找 parent POM 到它正在处理的那个)。在这个过程中的这一点(接近开始),POM 并没有被 maven 本身读取——它被 Jenkins(或者它的一个插件)用来创建一个依赖树,这样项目就可以正确地构建命令。我得到的错误是 peer not authenticated.

这是输出的相关位:

Parsing POMs
Failed to transfer Could not transfer metadata org.us.thing:thingy:2.0/maven-metadata.xml 
from/to nexus (https://nexus:2443/nexus/content/groups/public):
peer not authenticated

ERROR: Processing failed due to a bug in the code. Please report this to jenkinsci-users@googlegroups.com
java.lang.IllegalStateException: Failed to build parent project for org.us.thing:thingy:pom:2.0
    at org.apache.maven.project.MavenProject.getParent(MavenProject.java:381)
    at hudson.maven.MavenModuleSetBuild$PomParser.invoke(MavenModuleSetBuild.java:1325)

我已经使用 javax.net.ssl.trustStore 配置了一个信任库,当 Maven 是 运行 构建时,通过 Jenkins 这工作正常。我还认为 Jenkins 正在以某种方式关注它,因为不使用信任库时出现的错误通常是不同的,但我不确定这是否属实。

我已经使用我的关系 url 和凭据将工件解析器配置为回购管理器。我还使用我的凭据为 nexus 域设置了一个 'Credentails' 条目。

那么,如何进行呢?我的解决方案会很好,但我会接受更多面包屑。

由于 Jenkins 在解析 POM 之前无法连接到 Nexus,这意味着 POM 中设置的信息没有提供足够的连接信息。凭据条目是良好的开端。

Jenkins 提供了一个选项来提前设置此信息。 config file provider 插件允许您设置 "external" 文件。这使您可以设置全局 Maven 和用户 Maven settings.xml。然后在您的构建配置中,您可以添加构建步骤以使用该托管文件。我发现设置两件事很有帮助:

  1. 将托管文件用于全局配置的 Jenkins 构建步骤
  2. Maven 步骤本身的高级设置中用户配置的托管文件。

这从 POM 中外部化了所有连接信息并摆脱了时间顺序问题。

问题也可能是 Maven Project Plugin 中的错误。在您的 Maven 作业 运行 之前,此插件会尝试在构建步骤中解析 pom.xml。但是,该插件可能无法正确使用您配置的 settings.xml 或您的 Maven 目标和选项(在我的情况下,它忽略了 -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true)。

一种解决方法是在 Jenkins 中为您的项目配置预构建步骤,例如 Pre-Step->Invoke top level Maven target->Goal: clean -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true。此预构建步骤将下载必要的依赖项,以便 maven 项目插件可以在构建步骤中找到它们并成功解析 pom。