Go是一款先進的持續整合和釋出管理系統,由ThoughtWorks開發。(不要和Google的程式語言Go混淆了!)其前身為Cruise,是ThoughtWorks在做諮詢和交付交付專案時自己開發的一款開源的持續整合工具。後來隨著持續整合及持續部署的火熱,ThoughtWorks專門成立了一個專案組,基於Cruise開發除了Go這款工具。
Go的官方網站是http://www.thoughtworks.com/products/go-continuous-delivery/,其文件是http://www.thoughtworks.com/products/docs/go/13.3/help/welcome_to_go.html。
在我目前的專案中,持續整合及部署工具使用的就是Go這款工具。使用Go來建立起一個專案的持續部署pipeline是非常快的,非常方便。
Go的架構設計
Go使用了Server-Agent的模式。Server用來展示和配置pipeline的DashBoard,並存放構建出來的Artifacts(存檔檔案,比如一個war包); Agent則用來執行真正的構建操作,一個Server可以和多個Agent建立連線,Agent支援多個主流的作業系統。
這樣的好處是:
測試可以執行在不同的平臺上,保證你的軟體在多個平臺都能良好的工作;
你可以將測試劃分為不同的群組並並行的執行在多個Agent上,節省執行測試時間;
可以方便的管理Agent,及時響應不同的環境要求。
Agent的lifecycle
下圖是Agent工作的生命週期。
每一臺Go的構建節點機器上都需要安裝Go Agent軟體(這個名字蛋痛,不是FQ的那個軟體),其用來建立起與Go Server的連線。 Go Agent會以輪詢的方式來詢問Go Server是否有當前有構建工作。如果有的話,Go Server會將其分配給處於ready狀態的Agent。該Agent會在自己機器目錄上建立一個目錄,並下載同步最新的材料(比如配置的SVN repo地址),然後執行指定的task,比如構建專案,執行單元測試或功能性測試等。如果配置了artifacts(比如構建的結果,一個war包),Agent執行完畢後將這個artifacts釋出到Go Server上,這樣artifacts就會被接下來的stage用到。
Go中的一些概念
Go對複雜的構建和部署活動進行了合理的抽象,並提供了GUI和XML兩種方式來配置pipeline。
在Go的世界中,多個pipeline可以共同組成一個group,這叫做pipeline group。沒個pipeline又由多個stage組成。假設一個pipeline需要做如下事情: 構建專案->部署到測試環境->部署到生產環境。那麼每一個環節都可以設定為一個stage。而一個stage則由1個或多個job組成。比如構建專案這個stage,可能會分為編譯及驗證->功能性測試,每一步可以作為一個job。job則由一個或多個task組成。比如功能性測試這個job可以分為兩個task來完成,先將artifacts部署到測試機上,再執行功能性測試。
Go和Jenkins的比較
Go在設計之初就是一款持續部署工具,而Jenkins其實只是一款持續整合工具,如果要實現持續部署需要安裝相應的外掛。 Go由於是收費軟體,有一定售後服務,而Jenkins作為開源軟體,雖然免費,但是出現問題要麼自己動手解決,要麼等待維護社群修復。 Jenkins作為開源產品,社群比較活躍,文件資料和外掛都比較多,而Go的文件或資料較少。
Go的設計思想還是挺前衛的,在別人還在做持續整合這一步時,它已經做到了持續部署這個層次。但是目前就國內而言能做到持續部署的公司真的不多,甚至很多公司連持續整合這個實踐都沒有達到。所以Go作為一款收費產品很難在國內開啟市場。
我覺得Go可以做出一個免費版來讓個人試用,提供一些基本功能。然後為企業應用定製一些高階功能,放置到收費版中,可以擴大自己的市場佔用率。