2009-06-15 21 views
9

使用「一鍵式構建」將您的變更從開發環境轉移到現場服務器是非常好的並且經常被提倡的事情。如何爲LAMP項目實施「一步構建」?

我加入了一個運行在LAMP堆棧中的小團隊,並使用SVN進行版本控制,目前部署在單個生產服務器上(另一個用於開發的服務器,並且很快成爲單獨的mysql服務器)。我現在正在制定很多組織事項,在我加入之前就已經失蹤了。

我很好奇,看看

  1. 人是怎麼做這個(一步法構建)目前
  2. 看我如何能夠最好地實現它我的情況(小團隊,LAMP與SVN環境)

我感興趣的一些特殊挑戰是處理數據庫更改(模式)以及人們是否使用什麼樣的「包」來保持組織(例如RPM,PEAR等)。

回答

7

我們使用antHudson。像魅力一樣工作。

Hudson也可以與其他構建系統一起工作,而不僅僅是Java項目。它允許您設置多個構建目標,並自動或手動運行它們。它也迫使你實現一種從單個命令運行你的構建的方式。

它不能解決服務器在運行構建部署服務器所需時間內不可用的通信問題。

對於我們的架構更新和變化,我們建立我們的ant腳本做兩件事情:

  1. 更新只運行,如果有在SVN的不同的模式。
  2. 構建模式更改後檢入模式轉儲。
  3. 如果沒有更新的模式,簡單地使用轉儲加載數據庫

這確實需要一些嘗試,以得到正確的,但突然間我們已經解決了多個開發人員正對不同模式的問題。導入轉儲以更新您的開發模式非常簡單,您可以每天都這樣做。

+1

哈德森是真棒。 – stimms 2009-06-15 00:25:28

2

我們做。我們使用名爲Anthill Pro的產品來完成我們的所有構建和部署。它有一個工作流程過程,用於檢查文件,執行構建,運行單元測試,然後將代碼部署到服務器。你可以用它來部署任何東西,因爲進程可以運行命令行程序等。

1

UNIX(和Windows)上的「make」是你的朋友。雖然它有一個學習曲線,但它是值得的。你可以更新源代碼,編譯,測試等,等等。

2

我不認爲這有一個簡單的食譜答案,因爲這很大程度上取決於你的環境。無論你想出什麼,我都強烈推薦一種基於腳本的方法,其中部署腳本本身就是源代碼管理。這些腳本還將允許與構建解決方案更好地集成(見下文)。

在您的生產環境中運行的最簡單的這種腳本只是從源代碼控制獲取最新(或獲取特定版本)的命令。

下一個挑戰是數據庫部署。我最喜歡中小型項目的解決方案是在每個數據庫中維護一個模式版本表,並在源代碼管理中包含所有DDL和數據更新腳本(包括它們在壓縮存檔中使用的數據源)。腳本連續編號(開始000001 ...,000002 ...等),我運行的部署腳本首先備份現有數據庫,然後從模式版本表獲取最後一次運行數據庫腳本,然後運行以正確順序在源代碼管理中找到的任何新數據庫腳本,相應地更新模式版本表。

這種方法允許我很快從頭開始重建數據庫。

一起兩種方法使其能夠快速部署您的代碼庫,以幾種不同的分級機,你的QA環境,β等


對於只是一點點比較複雜的情況,你應該運行一個持續集成構建服務器,就像Kieveli et。人。建議,它基本上「定期」重建您的整個部署,因此包含腳本以完成您要在上面「手動」運行的內容。

通過爲每個數據庫腳本創建回滾腳本,還可以使數據庫部署更復雜。然後你應該編寫一個小控制器應用程序來處理這些應用有幾種OSS解決方案適用於這類東西,其中一種可能適合您的需求。

,但以後就不會再你的數據庫自動部署到生產環境;-)

2

最佳構建工具的PHP項目可能是Phing,這是相當類似螞蟻,但用PHP編寫的。它包含了你需要的所有必要的東西,比如從你的svn回購中獲取東西。

0

一旦構建完成,您可以輕鬆將其轉化爲連續構建。

在中央服務器上,我們已經完成了所有已完成的構建,標記爲構建的更改編號。當某些東西被提交時(我們使用Perforce,但這對SVN有效),我們的一個構建箱上的cronjob注意到有一個比構建更近的變化,引發了一個http請求來下載源碼樹,並開始構建(主要是GMake)。只需幾個簡單的步驟即可完成連續編譯:)

然後,讓您的所有測試自動化自動運行,這是一小步。在每次提交後完全構建並測試(可能可部署!)代碼。

0

對於腳本語言,像使用ant-variant或CruiseControl變體的常見建議並不意味着太多,因爲您不需要編譯任何東西。

讓我們堅持數據庫。涉及持續集成的三件重要事情是自動化,自動化和自動化。這意味着您必須擁有從構建空白數據庫,從外部數據導入以及升級到腳本化的新版本並準備好使用某些腳本運行的所有內容。一個很好的例子可能就像MediaWiki,讓我們使用php自己進行配置和安裝。我建議運行構建服務器在白天部署新的數據庫,運行單元測試併發送電子郵件(如果有失敗)。

0

我認爲它的方式是,你想一個腳本來拉都在一起,基本上是從源頭控制得到的所有文件\資源的在執行所有步驟來創建一個最終「產品」

離場這些步驟可能包括獲取最新的,編譯,獲得任何其他需要完成產品的文件,創建安裝程序(如果需要),運行單元測試,在服務器上共享輸出(無論對於特定項目而言可能意味着什麼),以及通知用戶已經創建了新版本(或者告訴他們是否沒有,以及爲什麼)。還有其他什麼你可能需要做的。

在過去,我通常從某種批處理文件開始,然後創建一些排序定製的構建exe。但保持這一點總是成爲一種痛苦。最終我將一個移動到第三方應用程序......現在我只使用以下兩種產品中的一種。

http://www.kinook.com/VBP/

http://www.finalbuilder.com/