繁体   English   中英

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

[英]Artifactory + Jenkins: Publishing to a maven repository from a freestyle build

我有一个Jenkins自由式构建,基于使用SBT的Scala项目。 我正在尝试使用Jenkins Artifactory插件将生成的工件发布到Artifactory存储库,特别是在artifactoryonline.com上托管的存储库。 但是,我很难找到一个理智的配置。 我倾向于怀疑有一些我缺少的东西,但是我的机智已经结束了,我发现的任何文档似乎都没有详细介绍这个用例,而且我已经厌倦了Artifactory插件源代码。 任何帮助都表示赞赏。

场景如下。 我想要:

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

以下是我尝试过的方法。

方法1:自由式+通用的工件集成

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

目标/阶-2.11 / * => com.mycompany / MY-module_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错误,这表明我必须更新所有下游配置才能够与这个回购合作。

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

目标/阶-2.11 / * => com.mycompany /我的-module_2.11 / 1.0.6

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

方法2:自由式+ Artifactory Maven

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

目标/斯卡拉-2.11 / *

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

方法3:自由式+ Artifactory常春藤

在这种情况下,我坚持使用自由式构建,但在“构建环境”下,我选择了“Ant / Ivy-Artifactory Integration”。 我选择了全局配置的Artifactory存储库,选中“将工件发布到Artifactory”和“使用Maven兼容模式”。 我将我的SBT项目配置为“publishLocal”(根据插件说明),并设置了常春藤配置的以下路径截图 构建项目并将工件部署到〜/ .ivy2 / local,但显然插件没有拦截,没有任何东西被推送到我配置的Artifactory仓库(也许这个插件与自由风格不兼容?)

我修改了SBT构建来做“发布”而不是“publishLocal”,希望插件能够启动并拦截Ivy发布,但是因为我的built.sbt没有配置了publishTo存储库目标,所以我自然得到了一个错误“未指定用于发布的存储库”。

方法4:虚拟Maven构建

下一步方法:跳过通用,转到完整的maven。 我在一个Maven项目Jenkins中设置了一个新版本。 它有一个预构建步骤,它运行我的SBT构建,生成pom工件以及二进制和源jar。 然后我配置Build步骤以使用由我的SBT构建生成的POM。 不幸的是,jenkins / maven插件的“Root POM”参数不接受通配符,所以我能够处理它的唯一方法是指定完整(版本化)路径:

目标/斯卡拉2.11 / MY-resource_2.11-1.0.6.pom

所以,这是不幸的,也是站不住脚的,因为每次增加版本号时我都不愿意更新我的Jenkins构建版本。 不过,我想看看这种方法是否有效,所以我继续推进。 我在全局配置的Artifactory中添加了“将Artifacts部署到Artifactory”的构建后步骤。 随着maven目标“帮助:帮助”,没有任何东西被推动,因此maven拦截器没有任何东西可以拦截并推动我的神器(这是我对它如何工作的理解,无论如何)。 所以我再次尝试,用“部署”替换Build步骤中的maven目标。 这一次,拦截器将我的大多数(全部?)依赖项推送到我的Artifactory服务器。 但是,在推送所有依赖项之后,它显然未能尝试编译我的“maven”项目。 我没有进一步研究这个,但我认为这是因为生成的POM文件没有指定任何构建指令。

结论

再一次,任何帮助表示赞赏。 看起来这应该是一个相当主流的用例,Artifactory插件的文档明确指出支持自由式build + Maven部署,但我显然缺少一些东西。 任何帮助是极大的赞赏! 谢谢。

这是一个很好的问题!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM