2015-04-30 95 views
7

我就被存儲在2個混帳回購PROJECT1和Project2的如何構建輸出從一個混帳回購協議集成到其它

PROJECT1是一個JavaScript項目2個項目工作。它有自己的回購(例如https://github.com/gandra/project1.git
Project2是一個java maven項目。它有自己的回購協議(例如https://github.com/gandra/project2.git

這裏是一個當前的工作流程,我想提高:

  1. 在PROJECT1提交更改,並在PROJECT1推到原點
  2. 運行的呼嚕聲。這會產生PROJECT1/build目錄
  3. 手動複製PROJECT1 /建設內容爲Project2中/庫/ PROJECT1-lib目錄
  4. Project2中
  5. Runk詹金斯共建提交更改(Project2的/庫/ PROJECT1-LIB)和部署

我想以某種方式避免第3步(Project1/build內容到Project2/libs/project1-lib目錄的手動副本) 我想過將Project1作爲子樹集成到Project2中,但是這種方法的問題恰恰相反獲取所有Project1目錄結構到Project2/libs/project1-lib,我只需要獲取子目錄o Project1(Project1/build/*)

一些重要注意事項: Project1更改僅在其自己的回購(https://github.com/gandra/project1.git)中發生,並且此更改應傳播到Project2。所以沒有PROJECT1的更新從Project2中/庫/ PROJECT1-lib的 換句話說:
- 犯PROJECT1影響Project2的
- 承諾Project2中不影響PROJECT1

+0

如果Project2依賴於Project1,則可以將Project1的回購作爲子模塊添加到Project2的回購中。然後添加建築物Project1作爲Project2構建腳本中的一個步驟。結果將處於可預測的位置。 – Biffen

+0

嘗試git submodules http://git-scm.com/book/en/v2/Git-Tools-Submodules – vitaly256

回答

1

好吧,讓我們在這裏回顧一下最重要的事實:

  1. Project2的是Maven項目(戰爭包裝可能,因爲你將部署它)。
  2. Project2的取決於PROJECT1,它需要一個路徑上他的輸出建立Project2中/庫/ PROJECT1-lib的

在我看來構建(即使是部分buils)的方式時,並不意味着是在任何的源代碼管理,所以我不會保留Project2的任何路徑,比如Project2/libs/project1-lib在git下。 Maven war插件有這個不錯的功能maven-war-plugin-overlays。 因此,如果Project2將Project1看作是戰爭類型packaginig的maven dependency,

<dependencies> 
    ... 
    <dependency> 
     <groupId>your.group.id</groupId> 
     <artifactId>project1</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <type>war</type> 
     <scope>runtime</scope> 
    </dependency> 
    ... 
    </dependencies> 

,你不會做任何應對到Project2的/庫/ PROJECT1-lib的位置,因爲這將Maven的在packaing的階段爲你做。 但要做到這一點,你必須將你的Project1的戰爭神器安裝到你的連結點。 這裏有幾個解決方案:

解決方法1)

  1. 讓PROJECT1是完全Maven項目,並建設完成了他的戰爭路徑./libs/project1-lib的肯定輸出。 由於Project1現在將用maven構建,因此您必須先集成Project1以前的構建工具(grunt,gulp或其他),以便在包裝階段之前的某個階段由maven調用。
  2. Project2中添加新的依賴是這樣的:

    <dependency> 
        <groupId>your.group.id</groupId> 
        <artifactId>project1</artifactId> 
        <version>1.0-SNAPSHOT</version> 
        <type>war</type> 
        <scope>runtime</scope> 
    </dependency> 
    

溶液2)。

  1. 使用當前的Project1構建器,確保使用以下結構將項目打包爲./libs/project1-lib。 使用相同的構建器將這個作爲戰爭神器安裝在你的連接點上(注意:你必須在你的連接點上安裝pom.xml,所以其他項目可以參考Project1) 如果幸運地使用grunt作爲js構建器,那麼這個np​​m組件grunt-nexus-deployer這將完成我在這裏描述的。
  2. 相同的解決方案1)...

說明:

當你把你的PROJECT1的改變你的CI將觸發任務,這將在Nexus上安裝 project1-1.0,SNAPSHOT.war完成後,Project2的CI作業將被觸發,它將包含project2構建所需的所有內容。

注: 在兩種方案中,刪除Project2中/庫/ PROJECT1-lib的層次,因爲它不再使用...

編輯:

對於解決2)也許你應該使用grunt-maven-tasks代替grunt-nexus-deployer,因爲它有更多的選擇,它更合適。

4

如果你控制你的服務器的Git使用,那麼你可以通過使用post-receiveserver-side hook來完成你所要求的。

但是,我不禁覺得應該有一個比Project1更改爲Project2更好的方法。 Project1顯然是Project2的依賴項。我更習慣於依賴關係的處理與他們Maven和搖籃做到這一點:

  • 有PROJECT1構建工具(如搖籃)發佈構建構件到一個構建神器庫(例如Artifactory的)。
  • 讓Project2的構建工具根據需要從構建工件存儲庫中提取最新工件。

,我在這種方法中看到的優點是:

  • PROJECT1是獨立於Project2中。由於Project2需要Project1(反之亦然),因此不應該由Project1負責保持Project2的更新。
  • Project2控制它如何消耗Project1。例如,您可以自由地凍結某個Project1版本中的依賴項(例如,因爲Project1當前已損壞,並且您希望繼續開發Project2而不等待修復)。
  • 您不會污染Project2提交的與Project2源代碼無關的更改。如果每次更新Project1,都會在Project2中得到一個新的提交,很快它會讓您的生活變得困難,當涉及到合併,重新組合,平分或其他任何您通常需要做的事情時。

的缺點主要在於基礎設施的要求(突然間,你需要另一個服務器),並在選擇和配置構建工具。談到Java時,我會推薦Gradle介紹構建工具和Artifactory的構建工件庫。但是你說你的Project1是Javascript,我沒有在這個生態系統中工作,所以我沒有任何好的建議。

編輯:我剛纔意識到我混合了Project1和Project2。問題是Project2消耗了Project1,而我的初始答案就像Project1消耗了Project2一樣。我現在解決了這個問題,以避免混淆。

+0

Git服務器不在我們的控制之下。我喜歡這個概念來構建一個javascript項目的工件,但是這不在我們的生態系統中。我必須調查是否可以將maven或gradle引入到JavaScript項目中。這可能有助於釋放人爲產物,而不是作爲其他項目的依賴消耗。 謝謝。 – gandra404

1

沃伊說的是正確的。這兩個項目的建設(按照你描述的方式)應該分離。如果最終產品需要兩個組件,那麼構建應用程序就是構建工具(jenkins)的工作。這兩個項目應該是彼此不可知論的。

我有一段時間沒有使用Jenkins,但是在竹中我有一個叫做BuildProduct的任務,它將有兩個任務(Build Project 1)和(Build Project 2),其中Project 2的建築將使用結果第一個構建(構建的JS)。

相關問題