gpt4 book ai didi

scala - Artifactory + Jenkins : Publishing to a maven repository from a freestyle build

转载 作者:行者123 更新时间:2023-12-03 20:21:00 37 4
gpt4 key购买 nike

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

场景如下。我想:

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

  • 以下是我尝试过的方法。

    方法一:自由式+通用Artifactory集成

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

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



    构建成功,jar和sources-jar和javadoc-jar以及ivy文件和POM文件都在那个目录下生成。但是,发布失败,209 Conflict。 Artifactory 日志不喜欢目标路径:

    Sending HTTP error code 409: The target deployment path 'com/mycompany/my-module_2.11/my-module_2.11-1.0.6.pom' does not match the POM's expected path prefix 'com/mycompany/my-module_2.11/1.0.6'. Please verify your POM content for correctness and make sure the source path is a valid Maven repository root path.



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

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

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



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

    方法二:Free-style + Artifactory Maven

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

    target/scala-2.11/*



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

    方法三:自由式+Artifactory Ivy

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

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

    方法 4:虚拟 Maven 构建

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

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



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

    结论

    再次,任何帮助表示赞赏。似乎这应该是一个相当主流的用例,并且 Artifactory 插件的文档明确指出支持自由式构建 + Maven 部署,但我显然遗漏了一些东西。非常感谢任何帮助!谢谢。

    最佳答案

    这是一个很好的问题!

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

    关于scala - Artifactory + Jenkins : Publishing to a maven repository from a freestyle build,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33005538/

    37 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com