首页 文章

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

提问于
浏览
11

我有一个Jenkins自由式构建,基于使用SBT的Scala项目 . 我正在尝试使用Jenkins Artifactory plugin将生成的工件发布到Artifactory存储库,特别是在artifactoryonline.com上托管的存储库 . 但是,我倾向于怀疑's something that I' m缺失了,但是我终于没有文件了,我厌倦了通过Artifactory插件源代码 . 任何帮助都表示赞赏 .

场景如下 . 我想要:

  • 使用SBT构建一个自由风格的Jenkins项目,与版本号无关,这样当前项目版本(在pom / ivy工件中编码)是隐式和自动的 .

  • 将工件和构建信息发布到Jenkins中配置的工件库(未在我的SCM中的build.sbt中配置)

以下是我尝试过的方法 .

方法1:自由式通用Artifactory集成

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

target / scala-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不匹配0.11 / 1.0.6' . 请验证您的POM内容是否正确,并确保源路径是有效的Maven存储库根路径 .

我可以通过不使用标准的maven-2路径(其中包括需要禁用此repo的POM一致性检查)来消除209错误,这表明我必须更新所有下游配置才能够与这个回购合作 .

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

target / scala-2.11 / * => com.mycompany / my-module_2.11 / 1.0.6

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

方法2:自由式Artifactory Maven

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

target / scala-2.11 / *

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

方法3:自由式Artifactory常 Spring 藤

在这种情况下,我坚持使用自由式构建,但在"Build Environment"下,我选择了"Ant/Ivy-Artifactory Integration."我选择了我全局配置的Artifactory存储库,请检查"Publish artifacts to Artifactory"和"Use Maven Compatible Patterns" . 我将我的SBT项目配置为"publishLocal"(根据插件说明),并设置以下路径screenshot of ivy configuration . 构建项目并将工件部署到〜/ .ivy2 / local,但显然插件没有拦截,没有任何东西被推送到我配置的Artifactory仓库(也许这个插件与自由风格不兼容?)

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

方法4:虚拟Maven构建

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

target / scala-2.11 / my-resource_2.11-1.0.6.pom

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

结论

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

1 回答

  • 3

    这是一个很好的问题!

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

相关问题