如何在持续集成的情况下使用maven在存储库中安装版本化工件?

时间:2008-12-02 23:10:41

标签: maven-2 continuous-integration

我们正在将主要构建过程从ant转换为maven。我们将TeamCity用于持续集成服务器(CI)。

我们希望使用CI服务器启动(每晚)版本包含内部版本号的版本,如1.0.0.build#。这些构建将安装在我们的本地maven存储库中,供其他项目使用。因此CI服务器将管理版本,maven将构建项目,maven存储库将使构建可供其他项目访问。

我打算使用以下命令从CI服务器启动构建:

mvn -Dversion=1.0.0.25 install

项目的pom会有一个伪造的版本号,-D标志会覆盖它,如:

<version>0.0.0.0</version>

此方法的问题是maven安装插件仅使用pom文件中的版本,而不是命令行传入的版本。这在this maven issue中注明。

因此,自2006年8月以来这个问题已经存在并且尚未修复,我认为这不是' maven way '。所以我的问题是,如何在持续集成的情况下使用maven在存储库中安装版本化工件?

3 个答案:

答案 0 :(得分:6)

听起来您想要使用唯一版本构建SNAPSHOT版本。

因此,在您的POM中将版本声明为:

<version>#.#.#-SNAPSHOT</version>

然后,在POM的 distributionManagement 部分中,为 snapshotRepository 启用唯一版本(请参阅Maven的POM reference):

<snapshotRepository>
  <uniqueVersion>true</uniqueVersion>
  <id>your-snapshot-repo-id</id>
  <name>Your Snapshots</name>
  <url>http://your-snapshot-repo-url/maven</url>
</snapshotRepository>

仅供参考,请注意Maven conventions推荐版本被声明为major.minor.revision。所以,1.0.25而不是1.0.0.25。如果你能够使用这个版本控制方案,那么在Maven世界中,事情会更顺利。

答案 1 :(得分:5)

Matthew's answer提供了一个解决方案,其中工件上传到具有所需版本号的本地和远程存储库,即存储库中的路径包含正确的版本号,但是,Maven始终安装和部署源POM文件仍然包含版本元素中的${ciVersion}

如果你有一个像这样的共同父母的多模块:

<project xmlns="..." xmlns:xsi="..." xsi:schemaLocation="...">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>myParent</artifactId>
    <groupId>com.stackoverflow</groupId>
    <version>${ciVersion}</version>
  </parent>
  <artifactId>myChild</artifactId>
  ...
</project>

您将无法引用myChild模块的专用版本,因为依赖项解析将存在错误,无法找到版本为myParent的{​​{1}}模块

但是,您可以使用将{POM}上传到本地和远程存储库的resolve-pom-maven-plugin,其中POM中的所有变量都会被其实际值替换。为此,您必须将以下代码段添加到(父)POM中:

${ciVersion}

答案 2 :(得分:4)

Shek的答案可能是“maven方式”,所以我会接受它作为正确答案。但是,我们还没有准备好改变我们的约定,所以这是我们正在使用的解决方法。

通过使用间接级别,您可以在构建时将版本号传递到pom,并让安装和部署插件使用它们。例如:

<project xmlns="..." xmlns:xsi="..." xsi:schemaLocation="...">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.stackoverflow</groupId>
  <artifactId>stackoverflow</artifactId>
  <version>${ciVersion}</version>
  <packaging>jar</packaging>
  <name>StackOverflow</name>

  <properties>
    <ciVersion>0.0.0.0</ciVersion>
  </properties>

  ...

</project>

我们无法直接覆盖$ {project.version}。因此,我们添加第二个名为“ciVersion”的属性,并在属性部分中为其指定默认值“0.0.0.0”。现在,CI服务器可以通过覆盖命令行上的ciVersion属性来指定版本号。如:

mvn -DciVersion=1.0.0.25 install

安装和部署插件将使用在引用$ {project.version}时传递的ciVersion属性的值,如预期的那样,并且在命令行上未提供任何版本时将使用默认值。这使我们可以切换到maven,对我们的流程影响最小。此外,这种解决方法不引人注目,可以在需要时轻松切换到SNAPSHOT功能。