2008-12-02 42 views
7

我們正在將我們的主要構建過程從ant轉換爲maven。我們將TeamCity用於我們的持續集成服務器(CI)。如何在持續集成情況下使用maven在版本庫中安裝版本化工件?

我們希望使用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 install插件只使用pom文件中的版本,而不是在命令行上傳遞的版本。這在this maven issue中註明。

因此,自從08/2006以來這個問題已經存在,並且還沒有被修復,我認爲這不是'maven way'。所以我的問題是,如何在持續集成的情況下使用maven在版本庫中安裝版本化的工件?

回答

6

聽起來就像你想建立獨特版本的SNAPSHOT版本。

所以,在你的POM聲明版本:

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

然後,在你的POM的distributionManagement部分,使通過(見Maven的POM reference這個)爲snapshotRepository獨特的版本:

<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世界中事情會更順利。

4

石的回答可能是'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功能。

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模塊的專用版本,依賴解析將因錯誤而存在它無法找到版本號爲${ciVersion}myParent模塊。

但是,您可以使用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> 
... 
相關問題