使用 Jenkins 在单独的 git 存储库中发布插件和多个项目
maven release plugin and multiple projects in separate git repositories with Jenkins
我发现了很多关于 maven-release-plugin
、多模块、多项目、父 POM 等的提示,但它们都不太适合我所拥有的:
我有几个项目(缩减的情况是两个:project-common
和 project-impl
),它们 有些 彼此分开,并且分别开发git 个存储库,但通常一起发布。为此,project-common/pom.xml
包含:
<groupId>de.tarent.example</groupId>
<artifactId>project-common</artifactId>
<version>1.5.1.4-SNAPSHOT</version>
… 和 project-impl/pom.xml
包含:
<groupId>de.tarent.example</groupId>
<artifactId>project-impl</artifactId>
<version>1.5.1.4-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>de.tarent.example</groupId>
<artifactId>project-common</artifactId>
<version>${project.version}</version>
</dependency>
有没有个父POM。
这里的想法是通常对他们全部使用project-common
的版本,但偶尔可以只对一个项目进行单独发布;在那些情况下,依赖版本当然必须手动更改,但没关系。
现在,我们正在使用 Jenkins 的“执行 Maven 发布”来创建我们的发布。 (好吧,我们希望。项目直到最近才发布,所以我们的开发人员手工构建它们,包括临时文件、未使用的文件、本地更改、XML 配置中的 LDAP 密码、编辑器 .swp
文件等——你可以明白为什么我被派去改变这个,尽管我不知道 Java™ or Maven or Jenkins。或者,也许是因为它。)
project-common
的发布顺利进行,但 project-impl
在第一阶段失败,检查是否没有 SNAPSHOT 依赖项。好吧。 (除了 project-common
之外还有 none。)覆盖 maven-release-plugin
以跳过 SNAPSHOT 检查是不可能的。使用父 POM 在这里也不起作用,因为它们是完全独立的存储库,有时会独立发布。那么,如何在保留 Jenkins 和 Maven Release 舒适性的同时做到这一点?
继续:回答你自己的问题——分享你的知识,问答式……
阅读日志,我发现 Jenkins 是这样调用 Maven 的:
mvn -B -f /var/lib/hudson/jobs/project-impl/workspace/pom.xml \
-DdevelopmentVersion=1.5.1.5-SNAPSHOT -DreleaseVersion=1.5.1.4 \
-Dtag=1.5.1.4 -Dresume=false release:prepare release:perform \
-DpreparationGoals=clean install -e
-D
一定有什么用处,对吧?我可以像 shell 那样做 ${project.version:-${releaseVersion}}
,我问了一位同事(感谢 Umer!),他说,不是那样,但是 -D
覆盖了属性。
这让我有点停顿:我无法将版本放入 属性,因为 maven-release-plugin 只更新项目 <version>
元素。
值得庆幸的是,双重间接寻址有效。虽然这是一个丑陋的 hack,如果有人不使用 Jenkins 发布,或者如果有人在本地使用 -DreleaseVersion
,它 将 中断,但有两个小改动使这些项目可以发布:
首先,我们添加一个名为 releaseVersion
的 属性,它默认为(动态更新的)${project.version}
:
<properties>
<releaseVersion>${project.version}</releaseVersion>
</properties>
然后,我们更改依赖项以改为使用它:
<dependency>
<groupId>de.tarent.example</groupId>
<artifactId>project-common</artifactId>
<version>${releaseVersion}</version>
</dependency>
我在这个解决方案中看到的唯一其他问题是,如果 some{one,thing} 使用 Maven 存储库中已发布的 POM,因为它也包含此间接(我们不会在发布时过滤 POM)。但到目前为止效果很好。
如果需要 project-impl
,只需手动将 <version>${releaseVersion}</version>
行更改为 <version>1.5.1.4</version>
,就像以前一样(其他条件不变).
我发现了很多关于 maven-release-plugin
、多模块、多项目、父 POM 等的提示,但它们都不太适合我所拥有的:
我有几个项目(缩减的情况是两个:project-common
和 project-impl
),它们 有些 彼此分开,并且分别开发git 个存储库,但通常一起发布。为此,project-common/pom.xml
包含:
<groupId>de.tarent.example</groupId>
<artifactId>project-common</artifactId>
<version>1.5.1.4-SNAPSHOT</version>
… 和 project-impl/pom.xml
包含:
<groupId>de.tarent.example</groupId>
<artifactId>project-impl</artifactId>
<version>1.5.1.4-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>de.tarent.example</groupId>
<artifactId>project-common</artifactId>
<version>${project.version}</version>
</dependency>
有没有个父POM。
这里的想法是通常对他们全部使用project-common
的版本,但偶尔可以只对一个项目进行单独发布;在那些情况下,依赖版本当然必须手动更改,但没关系。
现在,我们正在使用 Jenkins 的“执行 Maven 发布”来创建我们的发布。 (好吧,我们希望。项目直到最近才发布,所以我们的开发人员手工构建它们,包括临时文件、未使用的文件、本地更改、XML 配置中的 LDAP 密码、编辑器 .swp
文件等——你可以明白为什么我被派去改变这个,尽管我不知道 Java™ or Maven or Jenkins。或者,也许是因为它。)
project-common
的发布顺利进行,但 project-impl
在第一阶段失败,检查是否没有 SNAPSHOT 依赖项。好吧。 (除了 project-common
之外还有 none。)覆盖 maven-release-plugin
以跳过 SNAPSHOT 检查是不可能的。使用父 POM 在这里也不起作用,因为它们是完全独立的存储库,有时会独立发布。那么,如何在保留 Jenkins 和 Maven Release 舒适性的同时做到这一点?
继续:回答你自己的问题——分享你的知识,问答式……
阅读日志,我发现 Jenkins 是这样调用 Maven 的:
mvn -B -f /var/lib/hudson/jobs/project-impl/workspace/pom.xml \
-DdevelopmentVersion=1.5.1.5-SNAPSHOT -DreleaseVersion=1.5.1.4 \
-Dtag=1.5.1.4 -Dresume=false release:prepare release:perform \
-DpreparationGoals=clean install -e
-D
一定有什么用处,对吧?我可以像 shell 那样做 ${project.version:-${releaseVersion}}
,我问了一位同事(感谢 Umer!),他说,不是那样,但是 -D
覆盖了属性。
这让我有点停顿:我无法将版本放入 属性,因为 maven-release-plugin 只更新项目 <version>
元素。
值得庆幸的是,双重间接寻址有效。虽然这是一个丑陋的 hack,如果有人不使用 Jenkins 发布,或者如果有人在本地使用 -DreleaseVersion
,它 将 中断,但有两个小改动使这些项目可以发布:
首先,我们添加一个名为 releaseVersion
的 属性,它默认为(动态更新的)${project.version}
:
<properties>
<releaseVersion>${project.version}</releaseVersion>
</properties>
然后,我们更改依赖项以改为使用它:
<dependency>
<groupId>de.tarent.example</groupId>
<artifactId>project-common</artifactId>
<version>${releaseVersion}</version>
</dependency>
我在这个解决方案中看到的唯一其他问题是,如果 some{one,thing} 使用 Maven 存储库中已发布的 POM,因为它也包含此间接(我们不会在发布时过滤 POM)。但到目前为止效果很好。
如果需要 project-impl
,只需手动将 <version>${releaseVersion}</version>
行更改为 <version>1.5.1.4</version>
,就像以前一样(其他条件不变).