使用git repository和jenkins执行maven发布的子项目

Chr*_*ris 3 git maven maven-release-plugin jenkins

建立

我有一个带有子项目的项目,想要对孩子进行maven释放(项目B):

Project-A/
  pom.xml
  Project-B/
    pom.xml
    src/
Run Code Online (Sandbox Code Playgroud)

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

对于我们的发布,我们使用jenkins作为构建服务器和Jenkins Maven Release Plug-in来启动发布版本.

因此,在jenkins Job(称为JobB)启动后,它会将Project-A文件夹签出到以下位置:/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 optionsjenkins JobB配置中字段的值:

-X -DpreparationGoals="clean install" 
-DpushChanges=false 
-DconnectionUrl=scm:git:file:///Users/titan/.jenkins/jobs/JobB/workspace 
release:prepare release:perform
Run Code Online (Sandbox Code Playgroud)

需要connectionUrl的文件URL,因为我没有将更改推送到git远程服务器以及在maven开头执行的克隆:perform将找不到需要签出的标记.

问题

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

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

但是这里是在顶层调用调用的deploy命令的问题,因此它正在部署Project-A而不是Project-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
Run Code Online (Sandbox Code Playgroud)

所以它调用checkout目录中的pom文件而不是checkout/Project-B.有趣的是,maven:准备步骤确实在正确的pom上执行.

到目前为止我尝试了什么

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

  • 更改路径与聚甲醛-Darguments="-f sword-packaging-wbf/pom.xml"和用 -Darguments="-DpomFileName=sword-packaging-wbf/pom.xml"

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

khm*_*ise 6

所以这意味着你的组织完全错了.将您的父母放入一个单独的maven模块(也是单独的git repos)释放它.在您的子模块中,只需使用父模块,让您的孩子分开maven模块以及git repos并单独释放它们.而已.否则你开始与Maven战斗,你将失去战斗.

  • +1 只是为了说“如果您开始与 Maven 战斗,您将输掉战斗”。悲哀,却是那么真实。 (2认同)