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

时间:2015-04-10 16:30:26

标签: maven jenkins maven-release-plugin multi-project multiple-repositories

我发现了很多关于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的“Perform Maven Release”来创建我们的版本。 (好吧,我们希望。这些项目直到最近都不可发布,所以我们的开发人员手工构建它们,包括临时文件,未使用的文件,本地更改,XML配置中的LDAP密码,编辑器.swp文件等。 - 你可以看到为什么我有责任改变它,尽管不知道Java™ Maven Jenkins。或者也许,因为它。)

project-common的发布顺利进行,但project-impl在第一阶段失败,检查没有SNAPSHOT依赖项。嗯。 (除了project-common之外没有。)覆盖maven-release-plugin以跳过SNAPSHOT检查是不可能的。使用父POM也不起作用,因为这些是完全独立的存储库,有时会独立发布。那么,如何保持Jenkins和Maven Release舒适度呢?

继续:回答你自己的问题 - 分享你的知识,Q&amp; A-style ......

1 个答案:

答案 0 :(得分:1)

阅读日志,我发现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必须对某事有好处,对吗?我可以${project.version:-${releaseVersion}}喜欢贝壳,我问一位同事(感谢Umer!),他说,不是那样,但是-D会覆盖属性。

这让我措手不及:我无法将版本放入属性中,因为maven-release-plugin只更新项目<version>元素。

谢天谢地,双重间接工作。如果有人不使用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>

我能用这个解决方案看到的另一个问题是,如果某个{one,thing}使用Maven存储库中发布的POM,因为它还包含这个间接(我们不会在发布时过滤POM)。但到目前为止它运作良好。

如果需要project-impl,则只需手动将<version>${releaseVersion}</version>行更改为<version>1.5.1.4</version>,就像之前一样( ceteris paribus )。