使用 Jenkins 在单独的 git 存储库中发布插件和多个项目

maven release plugin and multiple projects in separate git repositories with Jenkins

我发现了很多关于 maven-release-plugin、多模块、多项目、父 POM 等的提示,但它们都不太适合我所拥有的:

我有几个项目(缩减的情况是两个:project-commonproject-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>,就像以前一样(其他条件不变).