gpt4 book ai didi

git - 使用 git 存储库和 jenkins 执行子项目的 Maven 发布

转载 作者:太空狗 更新时间:2023-10-29 13:53:53 25 4
gpt4 key购买 nike

设置

我有一个带有子项目的项目,并且想要对子项目(项目 B)进行 Maven 发布:

Project-A/
pom.xml
Project-B/
pom.xml
src/

Project-A 的文件夹同时也是我的 git 存储库,我从我们的中央 git 服务器克隆了它。

对于我们的发布,我们使用 jenkins 作为构建服务器,并使用 Jenkins Maven 发布插件启动发布构建。

所以在 jenkins Job(称为 JobB)启动后,它将把 Project-A 文件夹 check out 到以下位置:/Users/titan/.jenkins/jobs/JobB/workspace .

由于 git 的工作方式,我只能克隆我的结构的顶层。所以这意味着我需要将我想在 jenkins 中构建的 pom 设置为 Project-B/pom.xml,然后它将更改 maven 用于完成其工作的工作目录。

这会导致 git 出现很多问题,因为 maven 发布插件会尝试提交到错误的目录(它假定 Project-A/Project-B/是有效的 git 存储库)。我可以解决所有这些问题(通过在发布时停用对远程仓库的推送并在发布时指定正确的 scm url。)

这是 Release goals and options 的值jenkins JobB 配置中的字段:

-X -DpreparationGoals="clean install" 
-DpushChanges=false
-DconnectionUrl=scm:git:file:///Users/titan/.jenkins/jobs/JobB/workspace
release:prepare release:perform

connectionUrl 的文件 url 是必需的,因为我没有将更改推送到 git 远程服务器,并且在 maven:perform 开始时完成的克隆不会找到它需要从中 check out 的标签。

问题

毕竟这是我无法解决的问题:

maven:prepare 步骤贯穿并完成所有工作(更改 pom 中的版本号,创建发布标记)。然后 maven:perform步骤开始,从 git 存储库克隆内容,checkouts 标记到目标文件夹,然后调用部署命令。

但问题是调用的部署命令是在顶层调用的,因此它部署的是项目 A 而不是项目 B。作业本身正在运行,没有任何错误,它只是构建和部署了错误的东西。

这是 maven 生成的用于执行部署的命令:

[INFO] Executing goals 'deploy'...
[DEBUG] Using ${maven.home} of: '/usr/share/java/maven-3.0.3'.
[DEBUG] Executing: /bin/sh -c cd /Users/titan/.jenkins/jobs/jobB/workspace/Project-B/target/checkout && /usr/share/java/maven-3.0.3/bin/mvn -B -X -D maven.repo.local=/Users/titan/.m2/repository -s /Users/titan/.m2/settings.xml -D performRelease=true deploy

因此它在 checkout 目录中而不是在 checkout/Project-B 中调用 pom 文件。有趣的是,maven:prepare 步骤确实在正确的 pom 上执行。

到目前为止我尝试了什么

  • 不使用 jenkins,直接从 shell 调用 mvm 命令。这给了我相同的结果。所以我认为 Jenkins 不是问题所在。

  • 使用 -Darguments="-f sword-packaging-wbf/pom.xml" 更改 pom 的路径和 -Darguments="-DpomFileName=sword-packaging-wbf/pom.xml"

    这两种方法都不会改变结果。查看输出,我看到 -f <path>在生成的命令中被忽略,其中 -DpomFileName是可见的,但不会改变结果中的任何内容。

最佳答案

所以这意味着您的组织完全错了。把你的 parent 放到一个单独的 maven 模块(也是单独的 git repos)中释放它。在你的子模块中,只需使用父模块,让你的 child 单独使用 maven 模块和 git repos 并单独发布它们。就是这样。否则你开始与 Maven 战斗,你将输掉这场战斗。

关于git - 使用 git 存储库和 jenkins 执行子项目的 Maven 发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10333898/

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