软件工业“流水线”
1概述
持續集成(Continuous Integration)是一種軟件開發實踐。在本系列文章的前一章節已經對其背景及理論體系進行了介紹。本小節則承接前面提出的理論構想進行具體的技術實現。
《Google軟件測試之道》:
"每天,Google都要測試和發布數百萬個源文件,億萬行代碼。數以億計的構建動作會觸發幾百萬次的自動化測試,并在好幾十萬個瀏覽器實例上執行。面對這些看似不可能完成的任務,谷歌是如何測試的呢?"
希望看完此文章的人,能夠自己找到自己的答案。
2主要環境及工具
Git代碼管理系統(如:GitOSC)
Linux操作系統(Ubuntu)
Jenkins系統軟件安裝包
Jenkins的Python語言的SDK
Python及Tornado Web框架
以上的技術選型,都是盡量使用開源且主流的系統,這樣的好處如下:
節省軟件購置成本
有豐富的參考資料
有能力的企業或者個人可以按照需求做自定義擴展
3原理分析
在上一篇文章里面,對持續集成繪制過一個基本的結構圖,如下:
基本流程如下:
開發人員推送代碼到Git
Git通知Jenkins
Jenkins開啟構建
構建完成開啟后續任務
自動化測試
自動化部署
Jenkins通知自動化發布系統
發布系統持續后續的任務……
這里面涉及的系統有:
代碼版本管理系統
自動化構建系統
自動化測試系統
自動化發布系統
關于自動化發布系統這個基本上屬于運維方面的內容,在互聯網產品領域情形和技術需求比較復雜,暫時不列入本部分的內容。但是Jenkins能夠有接口去通知相應的發布系統,以達到事件信息流的連續性
本文則主要從技術角度來將這些系統聯合起來。
4Jenkins安裝及配置
4.1下載和安裝
關于Jenkins的下載及安裝,可以參考其官網。
| 1 |
|
直接下載Ubuntu/Debian版本,在Ubuntu服務器上安裝即可。
由于過程比較簡單,網上相關教程很多,此處也不再贅述。但是一般Jenkins安裝完畢后,最初的權限配置會比較繁瑣,所以本文重點從相應的使用場景出發,實現一個完整的帶權限配置的解決方案。
5內網持續集成系統
對于只是在內網使用持續集成的團隊來說,權限的配置就相對簡單一些。因為只是在內網,所以可以將權限的要求放松,只要保證公司網絡之外的人無法訪問到Jenkins服務即可。
注意:如果要和git服務的webhook形成完整的事件流,則git服務也需要在內網,否則構建事件無法被代碼推送事件給觸發。
5.1權限配置
對Jenkins進行如下操作:
[系統管理]->[Configure Global Security]->[訪問控制]->[授權策略]->[項目矩陣授權策略]
對匿名用戶進行如下配置:
Overall: Read -> Enabled
Job: Read -> Enabled
具體配置界面如下:
注意:如果不這樣配置,則后面提到的基于git的構建觸發器將無法通過調用指定的url接口來觸發構建。因為webhook只能構造單次簡單的http請求,無法構造由多個請求組成的會話,故而無法調用需要身份授權的接口。
5.2構建觸發器
一般情況下,構建都是以代碼的發布作為起始事件點,所以需要和git服務器建立事件關聯,在Jenkins具體的項目的配置界面中,對構建觸發器進行配置。
目前網絡上一般都是介紹的這種方式,具體的細節,此處就不再贅述,感興趣的同學可以自行在網絡上搜索。
基本原理圖如下:
5.3最終效果
可以達到如下效果:
開發人員向內網的git服務器推送代碼
git服務的webhook向內網jenkins發送消息并觸發構建
Jenkins執行構建相關命令
以上的內網方案的特點如下:
優點:
配置簡單
不需要配置人員進行任何的開發活動
缺點
無法限制匿名用戶的權限
出于安全考慮,只能在內網使用
當然,對于開發資源相對匱乏的小團隊而言,推薦通過以上方法快速搭建自己的內部的持續集成系統,畢竟先快速生產自己的特色產品才是最重要的事情。
6公網持續集成系統
對于前面的內網持續集成系統的優點和缺點都介紹之后,作為一個以開放為主要精神的互聯網團隊來說,肯定是無法滿足這樣一個封閉的內部網絡系統的,所以下面就要隆重介紹公網持續集成系統。
對于內網系統在配置上進行了偷懶,但是實際上卻在其它地方付出了巨大的代價,這些代價包括:
無法使用市場上已經成熟的公網git服務(包括但不限于:bitbucket,github,git@osc)
團隊成員的工作地點將受到限制,必須局限于同一個內網環境中
所以,如果配置人員擁有一定的系統設計能力和開發能力,還是建議搭建公網持續集成系統。
公網方案具有如下特點:
缺點:
需要配置人員具備系統設計能力和開發能力
優點:
能夠將系統以登錄授權的方式部署在公網
未登錄的匿名用戶無法查看任何項目信息
登錄用戶可以配置不同的權限
能夠作為服務器來接受來自事件來觸發構建
可以通過公網git服務的webhook觸發
可以通過自定義的任何公網IT系統觸發(按鈕,短信,微信等等)
可擴展性強,理論上可以和任何的公共互聯網服務進行對接
6.1權限配置
公網持續構建系統對權限控制有如下要求:
未登錄的匿名用戶無法查看任何項目信息
登錄用戶可以配置不同的權限
對Jenkins進行如下操作:
[系統管理]->[Configure Global Security]->[訪問控制]->[授權策略]->[項目矩陣授權策略]
可以建立三類用戶并進行權限配置:
普通用戶
登錄后,可以查看相應的項目的名稱及構建的狀態(主要是基本的查看功能)
管理員用戶
登錄后,可以進行構建操作,對任務進行增加及刪除等等高級操作(主要是項目管理功能)
匿名用戶
未登錄用戶,不具備任何權限,只呈現登錄界面
有了這樣的登錄授權機制,就不用再使用網絡進行隔離了,此系統就可以放心地放到公網服務器上了。
前面提到的內網系統的解決方案,主要原因是:
基于git的webhook無法對需要認證的構建觸發器接口請求發起有效構建請求
將構建觸發器接口設置為不需要認證,會導致匿名用戶的權限過大
如果部署到公網,則需要解決如上的矛盾之處。一個比較好的思路就是:
按照要求配置好相應的用戶權限(見公網權限配置方案)
開發中間件來完成構建API的用戶登錄認證
6.2構建觸發器
在兼顧Git的webhook的特點和Jenkins構建特性的情況下,可以提出如下所描述的解決方案:
使用web服務作為中間件,來模擬用戶登錄:將本來需要多個請求組成的會話變成單一的Http請求(可以在單次請求的url里面加入授權的token),這樣就可以被Git的webhook所調用。
基本原理圖如下:
主要的通訊過程為:
Git Server接收代碼并向Web Server發起單次Http請求(參數帶上token)
Web Server先向Jenkins Server發起認證授權請求
Web Server再向Jenkins Server發起構建請求,觸發構建
當然,由于Jenkins提供了Pyhon語言的SDK,所以以上步驟2和3其實可以簡化為對其SDK的調用了。
安裝方法:
| 1 |
|
最簡單的使用示例如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
開發人員只需要在自己的web程序里面集成此SDK,并進行參數化,即可完成webhook和jenkins的中間件。
6.3最終效果
可以達到如下效果:
接收git服務的webhook請求
解析請求中代碼提供信息,包括但不限于:提交時間,提交人,分支,備注,項目名稱等等
進行條件過濾,并觸發Jenkins進行自動構建(例如:本文是對release分支進行監控,來觸發構建)
使用中間件的好處是,對構建的事件有很好的訂制性,包括分支監控,提交人權限等等。當然,也可以只使用最簡單的功能:只要有人向release分支提交了代碼,那么就會觸發自動構建流程,這樣就完成了整個流程了。
當然,構建成功之后到發布還有一些后續的流程,比如:
開發人員完成代碼,自測完畢后,推送代碼到release分支
觸發自動構建,構建成功,并生成構建產物
將構建產物發布到測試服務器
觸發自動化測試腳本
如果測試不通過,發送消息給相關人員,終止后續流程
如果測試通過,通知自動化發布系統
由自動化發布系統完成構建產物向生產服務器發布的過程
6.4其它說明
在得知Jenkins有Python語言的SDK之前,其實還有個其它方法也能夠完成登錄授權并調用構建接口。直接通過接口來模擬用戶登錄行為(因為Jenkins登錄處不需要驗證碼),然后獲取登錄成功的sessionid,以此作為授權token來調用構建的接口。
具體的技術實現的代碼細節不在本文的討論內容中出現,只要了解登錄的原理,很容易就開發出來。
此處做一些說明的目的是,其實只要了解原理,即使官方沒有提供一些工具,仍然也是有辦法完成想要的功能的。
7持續集成的應用場景
持續集成的平臺搭建完畢后,關于其可應用的項目也進行一些簡單的介紹。
基本上任何的軟件項目,從生產到最終發布都可以劃分為如下幾個過程:
代碼開發
構建生成發布產物
發布上線
不同類型項目,無非就是構建過程不同而已,本文也簡單的列舉一下幾類項目的應用方式的流程,關于具體的技術手段就由各人根據各自的項目去做相應的訂制開發了。
7.1腳本類服務端項目
主要的代表有:Php,Python等等。
它們的構建產物就本身的源代碼,所以整個持續集成的過程如下:
開發人員發布代碼到Git倉庫
Jenkins同步代碼到本地(做好發布產物的備份,方便回滾)
部署好測試服務器
執行自動化測試腳本
發布到生產服務器或者駁回
7.2需要編譯的服務端項目
主要的代表有:Java等。
過程如下:
開發人員發布代碼到Git倉庫
Jenkins同步代碼到本地,并使用構建工具(如:Ant等)生成字節碼的構建產物
將構建產物統一備份到相應目錄,做好發布產物的備份,方便回滾
部署測試服務器
測試……
發布……
7.3Web前端項目
主要代表有:Javascript,css等。
過程如下:
開發人員發布代碼到Git倉庫
Jenkins同步代碼到本地,并使用前端構建工具(如:Grunt等)生成構建產物
將構建產物統一備份到相應目錄,做好發布產物的備份,方便回滾
部署測試服務器
測試……
發布……
7.4移動端App項目
主要代表有:Android等。
過程如下:
開發人員發布代碼到Git倉庫
Jenkins同步代碼到本地,并使用構建工具生成構建產物Apk
將構建產物統一備份到相應目錄,做好發布產物的備份,方便回滾
安裝到設備,執行測試
測試
如果測試通過,發布到各大應用市場
如果測試未通過,發現bug后駁回
8運行效果
Jenkins系統運行界面:
Jenkins本身可以實現如下功能:
完成項目持續集成及持續發布
對構建過程進行記錄
構建完畢后可以發郵件或者微信通知相應的人員,形成良好的反饋機制
再通過文章前半部分提到的系統,團隊就可以達到持續交付和持續部署的目的,從而實現項目的快速迭代。
持續交付:
持續部署:
當然,還有后續的更多的擴展功能,就需要測試開發人員去實現了。
9小結
此文作為持續集成系列文章的具體技術實現部分,介紹了一個通用的技術框架的解決方案。剩下的就是各種針對自己的工程特性是編寫各種腳本和安裝各種環境了。這樣 理論加實踐,就構成了能夠提供生產力的持續集成系統,大家Enjoy it吧。
目前以Google為代表的大型的互聯網公司,基本上都是保持著這樣的開發節奏。《Google軟件測試之道》里面提到了這樣的生產方式,但是沒有給出具體的技術解決方案,本文則將這種構想進行技術落地,并發布此方案,希望能夠給后來者一些幫助吧。
(如果大家有興趣,后面可以針對某個具體的項目,來一個完整的持續集成示例,包括構建代碼的編寫,及過程的截圖等等。但是如果反響不大,就不再浪費時間了)
| 作者: | Harmo哈莫 |
|---|---|
| 作者介紹: | https://zhengwh.github.io |
| 技術博客: | http://www.cnblogs.com/beer |
| Email: | dreamzsm@gmail.com |
| QQ: | 1295351490 |
| 時間: | 2016-02 |
| 版權聲明: | 歡迎以學習交流為目的讀者隨意轉載,但是請【注明出處】 |
| 支持本文: | 如果文章對您有啟發,可以點擊博客右下角的按鈕進行【推薦】 |
總結
- 上一篇: 温湿度监测系统设计:基于 STM32 的
- 下一篇: Kindle退出中国市场 国产iRead