多模块本地 jar 依赖项 - Jenkins Pipeline

Posted

技术标签:

【中文标题】多模块本地 jar 依赖项 - Jenkins Pipeline【英文标题】:Multi-Module local jar dependencies - Jenkins Pipeline 【发布时间】:2019-08-13 10:07:18 【问题描述】:

我需要在 Maven 上构建一个 Java 项目。我正在开发一个构建在 Nexus 存储库中的 Jenkins 管道上的多模块 Maven 项目。我有一些在 Nexus 存储库中不可用的库。我无法手动上传库。我正在管道上构建这个项目。

我做了什么:

我在 Git hub 存储库的项目根目录中创建了一个名为 jars 的文件夹,并手动放置了所有在 Nexus 上不可用的 jar 文件。在依赖项中,我像在依赖项参数中一样引用了所有这些本地 jar。

在存储库中,我给出了 jar 文件夹的 git hub repo 的 URL。詹金斯无法选择图书馆。我收到以下错误:依赖项:依赖项版本 - 构建错误 - 无法为未发布的依赖项构建,并且我收到 jars 文件夹中所有 jar 的错误。我尝试将 jars 文件夹放在 src/main/resources 中,但仍然出现相同的错误。

如何引用这个 jar 文件夹以便 Jenkins Pipeline 可以使用它?我无法控制所涉及的 Jenkins / Scripts。我是一名开发人员,只是在 Pipeline 上构建它。

P.S:我无法访问我公司的互联网来发布 POM 或构建失败错误。

添加更多细节:

它建立在管道上。有两个存储库:Nexus 2 和 Nexus 3。特定库在 Nexus 3 上不可用,并且管道仅在 Nexus 3 上构建。

我们已提出上传这些库的请求,但不会很快实现。 Jenkins Pipelines 从 Github 存储库中获取文件,并使用 Maven 构建 Java 项目。我无法控制管道或 Jenkins 中的任何脚本。

我们下载了所有不可用的库并将其放在 git hub 的文件夹中。流水线中有 4 个周期。 Github 周期/Jenkins 周期/部署周期/发布周期。

Github Cycle:在这个循环中,它遵循三个阶段。它从代码中获取代码,构建它。它构建快照并将其上传到 Nexus 存储库。在这两个阶段中,它能够通过从 GitHub 获取代码并构建它并生成工件来成功构建。第三阶段:在这个阶段真的很奇怪,在这个阶段它再次构建和构建失败,引用了在 git hub 中上传的 jar 的非发布依赖项的代码。

这可能是什么原因:当它可以在 Github 周期的前两个阶段构建并在第三阶段因未发布依赖项的构建失败而失败时。

管道的设计方式使其仅在 Nexus 3 上查看并在周期的每个阶段构建。

【问题讨论】:

然后与管理 Nexus 的人员交谈。将您的工件放入 Nexus 是正确的做法。 Git 不适合托管依赖项。 已请求在 Nexus 3 中添加这些库,但短期内不会发生。它正在管道上运行。我无权设置自定义存储库管理器。 然后和你的老板谈谈,告诉他/她你不能添加你想添加的库,因为 Nexus 人不添加它们。构建规避公司限制的方法不是***的目的。要么你的老板给问题施加压力,让你尽快拿到图书馆,要么你需要在没有图书馆的情况下处理你的问题。 【参考方案1】:

在存储库中,我给出了 jar 的 git hub repo 的 URL 文件夹

这不起作用,因为您的 lib 文件夹不是有效的 Maven 存储库。

如何引用这个 jar 文件夹,以便 Jenkins 流水线可以 拿去吗?

你有一些选择:

    设置自定义 Maven 存储库管理器。您可以使用Nexus Repository Manager 或JFrog Artifactory 或其他东西。 它将为您提供最大的灵活性并允许做更多的事情 在将来。缺点是,你需要有基础设施 运行它通常会带来某种维护成本。

    从您已有的jar 文件夹中安装 Maven 本地存储库中的包。有两种方法可以做到这一点:

      通过 Jenkins Pipeline 中的脚本,该脚本在您的构建之前运行,并为您的 jar 文件夹中的每个库调用 mvn install-file ...。您可以在 Apache Maven Install Plugin site 上找到此命令的确切语法

      通过更改您的构建并在早期构建阶段调用maven-install-plugininstall-file 目标。我个人已经 从来没有这样做过,但this answer 建议这是可能的。

    jar 文件夹中删除文件并为每个文件创建一个包装器项目,除了将 jar 安装在 本地 Maven 存储库。确保这些是第一个模块 在您的多模块项目中运行。

【讨论】:

我无法在 Nexus 中上传这些库。管道从 Nexus 中挑选除这些库之外的所有库,因为这些库不可用。这是一个管道,不能访问 Jenkins 或脚本。我不能使用文件参数,因为管道不会从本地选择,这就是将这些依赖项上传到 Git Hub 的原因。 您是否与 Nexus 的管理员谈过他/她是否可以将您的库放在那里? 无法在 Nexus 3 中添加这些库集。管道基于 Nexus 3 构建,所有库仅在 Nexus 2 上可用。 您没有指定您有权访问的内容,因此我列出了我能想到的所有选项。我假设您确实可以访问您的项目代码仓库(因为您喜欢其中的罐子)。因此:对于 1,您不必使用相同的 Nexus,它可以是您在 POM 中配置的不同实例。对于 2.1,您可以修改包含管道并应提交到您的存储库的 Jenkinsfile。对于 3,您只需要现有存储库中的一些其他 Maven 模块。请记住,Jenkins 正在检查代码(您放入的 jars),因此您确实将它们放在 FS 上 感谢您的回复。添加了详细信息。如果您需要更多解释,请告诉我。

以上是关于多模块本地 jar 依赖项 - Jenkins Pipeline的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins自动化部署springboot多模块依赖jar

Jenkins自动化部署springboot多模块依赖jar

Jenkins自动化部署springboot多模块依赖jar

在多项目环境中独立地对模块进行版本控制并压缩所有依赖项

Android gradle 动态添加模块依赖

Java Maven打包总结(Jenkins多模块编译部署)