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

Mat*_*ula 7 continuous-integration maven-2

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

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

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

mvn -Dversion=1.0.0.25 install
Run Code Online (Sandbox Code Playgroud)

该项目的pom将有一个虚假的版本号,-D标志将覆盖它,如:

<version>0.0.0.0</version>
Run Code Online (Sandbox Code Playgroud)

此方法的问题是maven安装插件仅使用pom文件中的版本,而不是命令行中传递的版本.这是在这个maven问题中注意到的.

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

she*_*hek 6

听起来你想用独特的版本构建SNAPSHOT版本.

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

<version>#.#.#-SNAPSHOT</version>
Run Code Online (Sandbox Code Playgroud)

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

<snapshotRepository>
  <uniqueVersion>true</uniqueVersion>
  <id>your-snapshot-repo-id</id>
  <name>Your Snapshots</name>
  <url>http://your-snapshot-repo-url/maven</url>
</snapshotRepository>
Run Code Online (Sandbox Code Playgroud)

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


Joe*_*ern 5

Matthew的答案提供了一个解决方案,其中工件上传到具有所需版本号的本地和远程存储库,即存储库中的路径包含正确的版本号,但是,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>
Run Code Online (Sandbox Code Playgroud)

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

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

...
<build>
  <plugins>
    <plugin>
      <groupId>com.sap.prd.mobile.ios.maven.plugins</groupId>
      <artifactId>resolve-pom-maven-plugin</artifactId>
      <version>1.0</version>
      <executions>
        <execution>
          <id>resolve-pom-props</id>
          <goals>
            <goal>resolve-pom-props</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
...
Run Code Online (Sandbox Code Playgroud)