当前位置: 首页 > 知识库问答 >
问题:

Artifactory Jenkins:从自由式构建发布到maven存储库

晋坚
2023-03-14

我有一个Jenkins的自由式构建,基于一个使用SBT的Scala项目。我正试图使用Jenkins艺术工厂插件将生成的工件发布到艺术工厂存储库,特别是托管在artifactoryonline.com.的存储库。然而,我正在努力寻找一个合理的配置。我倾向于怀疑我错过了什么,但我无计可施,我找到的留档似乎都没有详细介绍这个用例,我厌倦了浏览艺术工厂插件源代码。非常感谢任何帮助。

情况如下。我想:

  1. 使用SBT构建一个自由风格的Jenkins项目,独立于版本号,使得当前项目版本(如在pom/ivy工件中编码的)是隐式的和自动的。
  2. 将工件和构建信息发布到Jenkins配置的工件存储库中(在我的SCM中的build.sbt中未配置)

以下是我尝试过的方法。

第一种方法是使用自由式构建,然后使用通用人工集成。对于“已发布工件”,我将其设置为

目标/scala-2.11/*=

构建成功后,jar和sources jar、javadoc jar、ivy文件和POM文件都在该目录中生成。然而,发布失败,209冲突。Artifactory日志不喜欢目标路径:

发送HTTP错误代码409:目标部署路径'com/mycompany/my-module_2.11/my-module_2.11-1.0.6.pom'与POM的预期路径前缀'com/mycompany/my-module_2.11/1.0.6'不匹配。请验证您的POM内容的正确性,并确保源路径是有效的Maven存储库根路径。

我可以通过不使用标准的maven-2路径(除其他外,需要禁用此repo的POM一致性检查)消除209错误,这意味着我必须更新所有下游配置才能使用此repo。

我可以更新插件的目标路径设置,以包含版本号:

目标/scala-2.11/*=

但这意味着我已经为每个版本修改了我的Jenkins构建,这似乎违背了目的。我无法想象这是使用这些工具的正确方式。

在这种情况下,我坚持使用自由风格的SBT构建。在“构建环境”下,我选择了“Maven3-人工工厂集成”。我根据我的全局人工工厂存储库配置了插件,选中“将工件部署到人工工厂”,并将“包含模式”设置为

目标/scala-2.11/*

我运行了一个构建,生成了工件(包括target/scala-2.11目录中的POM和ivy.xml文件),但在工件的部署方面似乎什么都没有发生。Artifactory日志中没有任何内容,没有新的构建,控制台输出或Jenkins日志中也没有任何内容表明它曾试图将任何工件部署到我的存储库中。

在本例中,我坚持使用自由风格的构建,但在“构建环境”下,我选择了“Ant/Ivy人工集成”我选择了全局配置的Artifactory存储库,选中“将工件发布到Artifactory”和“使用Maven兼容模式”。我将我的SBT项目配置为“publishLocal”(根据插件说明),并设置了以下常春藤配置的路径截图。该项目已构建,工件已部署到~/。ivy2/local,但显然插件没有拦截,也没有将任何内容推送到我配置的Artifactory repo(可能这个插件与free style不兼容?)

我将SBT构建修改为“发布”,而不是“publishLocal”,希望插件能够启动并拦截常春藤发布,但因为我的构建。sbt没有配置publishTo存储库目标,我自然会遇到一个错误,“未指定用于发布的存储库”。

下一个方法:跳过通用,完全专业化。我在Jenkins中建立了一个新的构建,一个Maven项目。它有一个预构建步骤,运行我的SBT构建,生成pom工件以及二进制和源JAR。然后,我将构建步骤配置为使用SBT构建生成的POM。不幸的是,jenkins/maven插件的“Root POM”参数不接受通配符,因此我处理这个问题的唯一方法是指定完整(版本化)路径:

target/scala-2.11/my-resource_2.11-1.0.6。聚甲醛

所以,这是不幸的,也是站不住脚的,因为每次我增加版本号时,我都不愿意更新我的Jenkins build。尽管如此,我还是想看看这种方法是否有效,所以我继续努力。我在全局配置的Artfactory上添加了一个构建后步骤“将工件部署到Artfactory”。对于maven的目标“help:help”,没有推送任何东西,因此maven拦截器没有任何东西可以拦截并推送到我的人工制品(这是我对它如何工作的理解)。所以我再次尝试,将构建步骤中的maven目标替换为“部署”。这一次,拦截器向上推了大部分(全部?)我对Artifactory服务器的依赖关系。然而,在推送所有依赖项之后,它显然未能编译我的“maven”项目。我没有深入研究这个问题,但我认为这是因为生成的POM文件没有指定任何构建指令。

再次感谢您的任何帮助。看起来这应该是一个相当主流的用例,并且artiFactory插件的留档明确表示支持自由风格的构建Maven部署,但是我显然遗漏了一些东西。非常感谢您的任何帮助!谢谢。

共有1个答案

南宫书
2023-03-14

这是个好问题!

使用“方法1”是可行的。如果您不想在路径中包含版本,它会使路径不兼容maven,这可能很好,但您需要配置repo(正如您所知道和所做的那样)。是的,评论中的解决方案也是一个有效的技巧。

 类似资料:
  • 我已经配置Gradle使用新的Maven Publisher插件发布项目工件,不幸的是,这个插件在生成的中存在依赖关系问题-依赖关系的范围而不是。 我的配置是这样的: 发布很简单,只需一个命令: 如何以旧的(工作)方式实现这一点?项目发布时是否可以自动进行项目标记?

  • 问题内容: 有时,开发人员会意外地在POM中检入没有“ SNAPSHOT”的版本。这将构建Maven项目并发布工件以发布存储库。如何避免这种情况?我只想发布构建工件以发布存储库,而不要发布CI构建。 我考虑了以下问题-但都不是一个简单的一步解决方案 编写一个预先提交的钩子,以检查是否允许除管理员以外的任何其他人在没有SNAPSHOT的情况下签入版本; 修改Jenkins作业以查看该构建是否为CI构

  • 我们目前没有自己的存储库。因此,当我们使用maven构建时,它将在当前用户的主目录中创建.m2存储库。 现在有两个第三方JAR在Maven Central中找不到。假设其中之一是hasp-srm-api.jar。今天的过程是这样的: a.依赖于hasp-srm-api.jar的项目的pom.xml包含以下行: b.在进行第一次构建之前,我们执行以下命令: 我的问题是这样的--这一步有没有可能自动化

  • 当使用Maven构建我的Spring-boot映像时,我现在在Dockerfile中执行此操作。Maven将下载所有依赖项,然后编译我的文件。这需要相当长的时间。 如何通过docker-compose (Dockerfile)指定构建过程重用我的“windows 10 Home”Maven库?所以,(新)下载的数量是最小的。我的开发环境:我使用Docker quickstart终端,所以使用doc

  • 我是Gradle、nexus和Maven的新手,并尝试使用Gradle'publish'任务将Maven工件从Jenkins发布到一个新的nexus存储库。Jenkins作业在发布时失败,出现以下错误。我已经在作业中为Nexus提供了用户名和密码。 在第一次发布之前,我们需要在nexus maven存储库中创建文件夹结构吗?并添加maven-metadata.xml?如何生成*.pom.sha和*

  • 我有第三部分jar文件,它不存在于远程项目目录中的文件中,我想在执行mvn安装时将这个jar添加到本地存储库中,这是我当前的代码