前端持續(xù)集成實(shí)踐

編寫代碼只是軟件開發(fā)的一小部分碉碉,更多的時(shí)間往往花在構(gòu)建(build)和測(cè)試(test)。之前介紹了前端的單元測(cè)試,這篇再介紹和實(shí)踐一下前端的持續(xù)集成(Continuous integration),簡(jiǎn)寫為CI媒怯。

什么是持續(xù)集成

持續(xù)集成是一種軟件開發(fā)實(shí)踐,即團(tuán)隊(duì)開發(fā)成員經(jīng)常集成他們的工作髓窜,通過(guò)每個(gè)成員每天至少集成一次扇苞,也就意味著每天可能會(huì)發(fā)生多次集成欺殿。每次集成都通過(guò)自動(dòng)化的構(gòu)建(包括編譯,發(fā)布鳖敷,自動(dòng)化測(cè)試)來(lái)驗(yàn)證脖苏,從而盡早地發(fā)現(xiàn)集成錯(cuò)誤。

持續(xù)集成的益處:

  • 減少風(fēng)險(xiǎn)
  • 減少重復(fù)過(guò)程
  • 任何時(shí)間定踱、任何地點(diǎn)生成可部署的軟件
  • 增強(qiáng)項(xiàng)目的可見性
  • 建立團(tuán)隊(duì)對(duì)開發(fā)產(chǎn)品的信心

集成工具

GitHub 上比較主流的持續(xù)集成工具有 Travis CICircle CI棍潘;分別占市場(chǎng)占有率前兩位,兩者的功能和使用都比較相似崖媚,其中Travis CI用的最多亦歉,就選擇Travis CI進(jìn)行介紹。

Travis CI 只支持 Github畅哑,不支持其他代碼托管服務(wù)肴楷。這意味著,你必須滿足以下條件荠呐,才能使用 Travis CI赛蔫。

  • 擁有 GitHub 帳號(hào)
  • 該帳號(hào)下面有一個(gè)項(xiàng)目
  • 該項(xiàng)目里面有可運(yùn)行的代碼
  • 該項(xiàng)目還包含構(gòu)建或測(cè)試腳本

Travis有兩個(gè)網(wǎng)址,org的那個(gè)是非盈利的泥张,為GitHub上public的repository提供免費(fèi)服務(wù)呵恢;com的那個(gè)是盈利的,可以對(duì)private的提供付費(fèi)服務(wù)媚创。com前100次build是免費(fèi)的瑰剃,此后按月收費(fèi)。

使用很簡(jiǎn)單筝野,用GitHub 賬號(hào)登錄后,Travis 會(huì)列出 Github 上面你的所有倉(cāng)庫(kù),以及你所屬于的組織粤剧。此時(shí)歇竟,選擇你需要 Travis 幫你構(gòu)建的倉(cāng)庫(kù),打開倉(cāng)庫(kù)旁邊的開關(guān)抵恋。一旦激活了一個(gè)倉(cāng)庫(kù)焕议,Travis 會(huì)監(jiān)聽這個(gè)倉(cāng)庫(kù)的所有變化。

travis.jpg

流程很簡(jiǎn)明弧关,但絕大多數(shù)復(fù)雜度都集中在這個(gè).travis.yml文件盅安。這是一個(gè)YAML文件,主要用來(lái)做CI的配置世囊。Travis會(huì)按照這個(gè)文件配置的方式來(lái)運(yùn)行别瞭。
以下是項(xiàng)目中使用travis的簡(jiǎn)單例子:

language: node_js

node_js:
  - "8"

install:
  - npm install -g codecov
  - npm install


before_script:
  - "export DISPLAY=:99.0"
  - "sh -e /etc/init.d/xvfb start"
  - sleep 3 # give xvfb some time to start

script:
  - cross-env TRAVIS=true karma start --single-run
  - codecov

Travis 的運(yùn)行流程很簡(jiǎn)單,任何項(xiàng)目都會(huì)經(jīng)過(guò)兩個(gè)階段株憾。

- install 階段:安裝依賴
- script 階段:運(yùn)行腳本

Node 項(xiàng)目的install和script階段都有默認(rèn)腳本蝙寨,可以省略晒衩。

- install 默認(rèn)值:npm install
- script 默認(rèn)值:npm test

完整的生命周期,從開始到結(jié)束是下面的流程:

1. before_install
2. install
3. before_script
4. script
5. aftersuccess or afterfailure
6. [OPTIONAL] before_deploy
7. [OPTIONAL] deploy
8. [OPTIONAL] after_deploy
9. after_script

更多用法可查閱官方文檔墙歪,官方文檔比較詳細(xì)听系。

在上面的例子中,每次代碼 push 以后虹菲,Travis 會(huì)自動(dòng)開始構(gòu)建靠胜,并運(yùn)行單測(cè),最后得到構(gòu)建
狀態(tài)如下

travis-status.jpg

點(diǎn)擊狀態(tài)圖標(biāo)毕源,可以在彈出界面中得到該項(xiàng)目的狀態(tài)圖標(biāo)鏈接浪漠。放到repository的README.md中,就可以在GitHub頁(yè)面得到編譯狀態(tài)的展示了脑豹。

另外郑藏,如果多次提交同時(shí)push,默認(rèn)只在最新提交執(zhí)行一次build瘩欺;在git commit中如果包含[skip ci][ci skip]必盖,該提交就不會(huì)觸發(fā)一次build。

集成測(cè)試覆蓋率工具

代碼覆蓋率報(bào)告可以為編寫測(cè)試程序提供參考俱饿,通過(guò)一些工具歌粥,還可以及時(shí)的把你的代碼的測(cè)試情況及時(shí)的反饋給用戶,讓用戶感知你的測(cè)試是否完備拍埠。

GitHub 上比較主流的代碼覆蓋率集成工具有 codecovcoveralls失驶;兩者也差不多,在之前travis的例子中選擇使用了codecov枣购。

同樣使用GitHub 賬號(hào)登錄嬉探,第一次使用時(shí),默認(rèn)是沒(méi)有 repository 的棉圈,需要通過(guò)點(diǎn)擊 + Add my first repository 來(lái)添加需要 codecov 管理的 repository涩堤。無(wú)論 codecov 還是 coveralls,它自身都不會(huì)去運(yùn)行測(cè)試用例來(lái)獲得項(xiàng)目代碼的覆蓋率分瘾,而是通過(guò)收集覆蓋率報(bào)告及其他關(guān)鍵信息來(lái)靜態(tài)分析胎围。codecov 可以接收 lcov, gcov 以及正確的 json 數(shù)據(jù)格式作為輸入信息。

該例子就是在travis CI 平臺(tái)中跑完測(cè)試用例后德召,將測(cè)試報(bào)告中的 lcov 和 json 文件提交至codecov 平臺(tái)進(jìn)行覆蓋率分析白魂,同樣分析的覆蓋率結(jié)果的徽章圖標(biāo)也能從平臺(tái)中獲取,可以加入到GitHub repository 的README.md中上岗。

language: node_js

node_js:
  - "8"

install:
  - npm install -g codecov
  - npm install


before_script:
  - "export DISPLAY=:99.0"
  - "sh -e /etc/init.d/xvfb start"
  - sleep 3 # give xvfb some time to start

script:
  - cross-env TRAVIS=true karma start --single-run
  - codecov

跨瀏覽器集成測(cè)試

瀏覽器端使用的庫(kù)福荸,在各個(gè)瀏覽器端的兼容性也是非常重要的‰戎溃跨瀏覽器測(cè)試同樣有 2 個(gè)選擇逞姿,SAUCELABSBrowserStack辞嗡,可以進(jìn)行瀏覽器兼容性測(cè)試。這里沒(méi)有詳細(xì)實(shí)踐過(guò)滞造,怎么操作可以去參考文章看续室。


至此,CI 除了能跑跑測(cè)試谒养、顯示覆蓋率之外挺狰,還能自動(dòng)部署發(fā)布,怎樣部署也在 yaml文件中進(jìn)行腳本編寫买窟,這里就不舉例子了丰泊。以上說(shuō)的都是源代碼放在 Github 上的開源代碼,但相信大家接觸得更多的應(yīng)該是公司的私有代碼始绍,私有代碼的項(xiàng)目也有 CI 解決方案瞳购,就是Jenkins,其前身是 Hudson (相信大家都見過(guò)亏推,我們用的所謂的編譯平臺(tái)就是這個(gè)東東学赛,但估計(jì)主動(dòng)去用的不多)。

Jenkins

這里 搭建了一個(gè) Jenkins吞杭, http://10.134.72.178:8080/jenkins/盏浇,搭建過(guò)程不細(xì)說(shuō),說(shuō)下能解決什么問(wèn)題芽狗。比如有這樣的場(chǎng)景:

  1. 前后端分離后希望將前端主干代碼部署至服務(wù)器绢掰;
  2. 新項(xiàng)目尚未接入考拉平臺(tái),希望可以部署至服務(wù)器供聯(lián)調(diào)童擎;
  3. 能每次代碼提交后都能自動(dòng)構(gòu)建自動(dòng)部署滴劲,無(wú)須任何操作;
  4. 項(xiàng)目緊張時(shí)顾复,領(lǐng)導(dǎo)希望能看到每天程序員提交代碼后班挖,項(xiàng)目的進(jìn)展情況等。

這些場(chǎng)景下捕透, Jenkins 都能幫助解決,凡是需要自動(dòng)構(gòu)建自動(dòng)部署的碴萧,它都能幫上忙乙嘀。這里舉例大致說(shuō)下怎么使用,就以將某個(gè)業(yè)務(wù)系統(tǒng)前端代碼自動(dòng)構(gòu)建部署至nginx服務(wù)器為例破喻。

第一步:新建項(xiàng)目虎谢,左邊菜單第一項(xiàng)。


step1.jpg

step1.jpg

第二步:進(jìn)行相關(guān)配置曹质,填寫源碼配置婴噩,可選擇倉(cāng)庫(kù)源擎场,git和svn都支持。


step2.jpg

第三步:進(jìn)行構(gòu)建觸發(fā)配置几莽,可設(shè)置觸發(fā)構(gòu)建的情形迅办,例如代碼提交時(shí)構(gòu)建,按日程表構(gòu)建等章蚣。


step3.jpg

第四步:填寫構(gòu)建部署腳本站欺。


step4.jpg

第五步:保存并進(jìn)行構(gòu)建,查看構(gòu)建情況纤垂。


step5.jpg

詳細(xì)配置可以上Jenkins中查看矾策,構(gòu)建過(guò)程包括自動(dòng)更新svn代碼,安裝或更新npm包峭沦,進(jìn)行webpack打包贾虽,將打包后的代碼部署至靜態(tài)資源服務(wù)器。至此完成前端代碼的構(gòu)建和部署吼鱼,每次提交代碼蓬豁,構(gòu)建過(guò)程全自動(dòng)運(yùn)行,當(dāng)狀態(tài)指示燈變藍(lán)時(shí)就表示構(gòu)建成功蛉抓,我們可以訪問(wèn)服務(wù)器前端資源了庆尘。

這只是一個(gè)比較簡(jiǎn)單的例子,還有不少其他功能巷送,Jenkin有很多插件驶忌,總之很強(qiáng)大。當(dāng)然不同的項(xiàng)目可能會(huì)有不同的構(gòu)建過(guò)程笑跛,可以自己按需設(shè)定構(gòu)建過(guò)程付魔。

結(jié)語(yǔ)

結(jié)尾來(lái)個(gè)段子:

以前我堅(jiān)持認(rèn)為代碼應(yīng)該是 clean 的,架構(gòu)應(yīng)該是簡(jiǎn)潔的飞蹂,流程應(yīng)該是自動(dòng)化的几苍,文檔應(yīng)該是齊全的,技術(shù)是應(yīng)該分享的陈哑。 效率較高不加班妻坝,結(jié)果 kpi 被差評(píng),領(lǐng)導(dǎo)認(rèn)為我無(wú)所事事惊窖。 最近半年我換了風(fēng)格刽宪,架構(gòu)重度設(shè)計(jì),類名變量模糊不清界酒,沒(méi)有注釋圣拄,現(xiàn)在大家都離不開我了,kpi 也上去了毁欣。

段子笑一笑而已庇谆,最后還是希望能運(yùn)用到前面的持續(xù)集成工具來(lái)實(shí)現(xiàn)流程自動(dòng)化岳掐,重復(fù)性的工作盡量交給機(jī)器自己動(dòng)。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饭耳,一起剝皮案震驚了整個(gè)濱河市串述,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哥攘,老刑警劉巖剖煌,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異逝淹,居然都是意外死亡耕姊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門栅葡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茉兰,“玉大人,你說(shuō)我怎么就攤上這事欣簇」媪常” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵熊咽,是天一觀的道長(zhǎng)莫鸭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)横殴,這世上最難降的妖魔是什么被因? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮衫仑,結(jié)果婚禮上梨与,老公的妹妹穿的比我還像新娘。我一直安慰自己文狱,他們只是感情好粥鞋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瞄崇,像睡著了一般呻粹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苏研,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天等浊,我揣著相機(jī)與錄音,去河邊找鬼楣富。 笑死凿掂,一個(gè)胖子當(dāng)著我的面吹牛伴榔,可吹牛的內(nèi)容都是我干的纹蝴。 我是一名探鬼主播庄萎,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼塘安!你這毒婦竟也來(lái)了糠涛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤兼犯,失蹤者是張志新(化名)和其女友劉穎忍捡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體切黔,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砸脊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纬霞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凌埂。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诗芜,靈堂內(nèi)的尸體忽然破棺而出瞳抓,到底是詐尸還是另有隱情,我是刑警寧澤伏恐,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布孩哑,位于F島的核電站,受9級(jí)特大地震影響翠桦,放射性物質(zhì)發(fā)生泄漏横蜒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一秤掌、第九天 我趴在偏房一處隱蔽的房頂上張望愁铺。 院中可真熱鬧,春花似錦闻鉴、人聲如沸茵乱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瓶竭。三九已至,卻和暖如春斤贰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荧恍。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留送巡,地道東北人摹菠。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像骗爆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子摘投,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 持續(xù)集成【Continuous integration (CI)】是一種開發(fā)實(shí)踐,它要求團(tuán)隊(duì)的開發(fā)人員定期集成他們...
    sollian閱讀 1,553評(píng)論 0 0
  • 在前一篇文章持續(xù)集成入門篇中我大概介紹了下持續(xù)集成的概念及工具(抱歉犀呼,在前一篇文章中我查的資料不夠與時(shí)俱進(jìn)幸撕,工具介...
    craneyuan閱讀 1,763評(píng)論 0 7
  • 今天印象深刻的有下面幾點(diǎn): 1〉彭彭講她一個(gè)朋友未雨綢繆,提前起草離婚協(xié)議書N個(gè)版本外臂,最后真的離婚了,不提前作消極...
    夏蘇的花園閱讀 456評(píng)論 2 1
  • 與其臨淵羨魚挑童,不如退而織網(wǎng) 越是堅(jiān)持不下去的時(shí)候跃须,就越要堅(jiān)持 30歲不是一個(gè)新的20歲,所以規(guī)劃好你的成年生活菇民,獲...
    江鳥閱讀 199評(píng)論 0 1