由于項(xiàng)目比較偏前端,我們的UI自動(dòng)化采用了cypress
在選型好了工具以后,所有的自動(dòng)化也需要集成到j(luò)enkins流水線中集成,達(dá)到持續(xù)集成的目的
原始方案
一開始跑UI自動(dòng)化所使用的salve,我們選擇主流方案,使用跟編譯打包同樣的slave。
發(fā)現(xiàn)問題
- UI自動(dòng)化執(zhí)行的時(shí)間比較長(zhǎng),最短也需要執(zhí)行3分鐘左右。在限制了slave管道的情況下(考慮到資源消耗,我廠設(shè)置每臺(tái)slave最多同時(shí)執(zhí)行5個(gè)任務(wù)),UI自動(dòng)化持續(xù)獨(dú)占slave,導(dǎo)致研發(fā)同學(xué)持續(xù)提交的過程經(jīng)常被中斷,拖累了生產(chǎn)效率。
- 在實(shí)際執(zhí)行的過程中,因?yàn)榻?jīng)常會(huì)出現(xiàn)“卡case”(跑著跑著就不動(dòng)了)等問題。調(diào)查log后發(fā)現(xiàn)是跑case的時(shí)候自動(dòng)斷開瀏覽器session,升級(jí)cypress版本也無法解決問題。猜測(cè)可能是操作系統(tǒng)版本和xvfb等插件版本對(duì)chrome兼容性的問題。
改進(jìn)方案
占用生產(chǎn)的slave問題比較好解決,先嘗試用jenkins label分割slave群,獨(dú)占一個(gè)臺(tái)slave執(zhí)行UI自動(dòng)化。
Cypress卡case的問題,因?yàn)閼岩墒黔h(huán)境問題,于是首選嘗試使用官方提供的docker鏡像來運(yùn)行測(cè)試。同時(shí)將測(cè)試場(chǎng)景分成多個(gè)spec,每個(gè)spec文件中只有一個(gè)describe(調(diào)研發(fā)現(xiàn)卡case通常發(fā)生在初始化describe,即scenario的時(shí)候)
又發(fā)現(xiàn)問題
- 使用官方提供的鏡像后,發(fā)現(xiàn)卡case的問題雖然次數(shù)不那么頻繁,但是依然存在。
- docker中運(yùn)行chrome/electric市場(chǎng)崩潰。嘗試過增加初始內(nèi)存,但也只是緩解崩潰次數(shù)。
- 中途考慮過換自動(dòng)化方案,使用webdriver+selenium grid的上古方案。在docker環(huán)境下實(shí)際執(zhí)行過程中還是回碰到chrome崩潰的問題。另外項(xiàng)目中途換工具的成本其實(shí)也不低。還有就是爽過cypress以后,實(shí)際上已經(jīng)回不去webdriver了。。
終極方案
我廠大部分測(cè)試同學(xué)使用的是windows機(jī)器開發(fā)腳本。在碰到卡case啊,chrome崩潰等問題的時(shí)候,windows機(jī)器均無法復(fù)現(xiàn)跑得飛起。那是不是使用windows機(jī)器作為slave就可以解決上面碰到的所有問題了呢。
Windows slave的必要性
- 借助瀏覽器的headless模式,目前在持續(xù)集成中我們比較主流的做法是在linux slave中直接跑UI自動(dòng)化。
但是Cypress的本質(zhì)上是瀏覽器插件,chrome等瀏覽器目前支持的headless模式還無法提供對(duì)插件的支持。操作系統(tǒng)為L(zhǎng)inux的jenkins slave中必須按照官方提示安裝xvfb等插件來提供運(yùn)行支持。
apt-get install xvfb libgtk2.0-0 libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2
- 從用戶使用習(xí)慣上考慮,市面上絕大部分的用戶使用的是windows。使用windows及真實(shí)瀏覽器執(zhí)行出的結(jié)果是最可信的。
確定了必要性和可行性,就開始準(zhǔn)備做windows slave。
公司的jenkins等基礎(chǔ)設(shè)施建在云主機(jī)上。需要增加slave的時(shí)候,必須要走財(cái)務(wù)流程申請(qǐng)新的云主機(jī),流程冗長(zhǎng)復(fù)雜,而且還不便宜。
然后我突然想到辦公室里面有好幾臺(tái)空閑的的PC機(jī)器(win10),用作顯示CI monitor,略顯浪費(fèi)。那是不是可以把這幾臺(tái)windows pc做成jenkins slave集群,當(dāng)土生云使用呢。
給jenkins增加windows slave
通信問題
為了達(dá)到把本地機(jī)器裝載到j(luò)enkins slave集群中的目的,host和slave之間的通信問題得先解決。
找運(yùn)維同學(xué)配合,繞過各種IP、訪問限制,確保兩點(diǎn)即可
- host和slave之間可以相互訪問
- 開發(fā)機(jī)和slave之間可以相互訪問
在slave上安裝依賴環(huán)境
需要在slave上安裝執(zhí)行jenkins以及UI自動(dòng)化的環(huán)境
- java8
- nodejs
- git
等等
在slave上安裝jenkins agent
按照這個(gè)教程,做到第四步。后面,我們采用直接在slave上用bat文件啟動(dòng)agent.jar的方案。

其中
-Dfile.encoding=UTF8可以解決在console中的亂碼問題然后依次把其他slave機(jī)器設(shè)置好,執(zhí)行bat文件后,java進(jìn)程以cmd窗口的形式存在在slave上。
成功后,jenkins上查看結(jié)果。

做到這一步,只需要把UI測(cè)試配置上這個(gè)slave集群的label,然后就可以正常在流水線中跑UI自動(dòng)化了。
新的問題
按理來說現(xiàn)在自動(dòng)化也可以獨(dú)立跑了,cypress也不掛了,完美了啊。
結(jié)果在實(shí)踐中發(fā)現(xiàn)承載jenkins的命令行窗口,經(jīng)常因?yàn)椴煌脑驋斓?/p>
- 其他同學(xué)看到命令行習(xí)慣性的關(guān)掉
- win10的自動(dòng)更新機(jī)制(關(guān)了自動(dòng)更新服務(wù)也不起作用)會(huì)定時(shí)重啟機(jī)器
- 在命令行窗口中點(diǎn)擊了右鍵讓命令行窗口處于掛起狀態(tài)
所以又得想個(gè)辦法把這些窗口隱藏起來。
使bat變成windows服務(wù)
兩種方式可以達(dá)到目的
- 使用nssm.exe工具,借助工具的托管,可以輕松的讓bat變成windows services
nssm.exe install [服務(wù)名] [bat文件路徑]
- 根據(jù)教程第四步及以后的內(nèi)容做成服務(wù)。(不推薦,使用此方法做成服務(wù)后,刪除服務(wù)時(shí)候需要使用
sc命令。比較麻煩)
做成windows服務(wù)以后,再也不同擔(dān)心被誤關(guān)窗口了。而且重啟后也會(huì)自動(dòng)啟動(dòng)。
問題又來了
jenkins agent做成服務(wù)以后,跑UI自動(dòng)化的時(shí)候,發(fā)現(xiàn)cypress的viewport設(shè)置失效,始終會(huì)以手機(jī)的viewport來執(zhí)行測(cè)試。
經(jīng)過調(diào)查和多次驗(yàn)證,發(fā)現(xiàn)問題還真出在jenkins agent被.net框架包裝成服務(wù)時(shí)。同樣的bat文件,直接執(zhí)行就不會(huì)有viewport的問題。
所以必須要放棄服務(wù)化,用另外一種方式使agent以命令行方式執(zhí)行。
vbs
雖然start \min命令,可以使bat文件在一開始就以最小化的方式執(zhí)行。這種方式下我們還是能在任務(wù)欄看到這個(gè)命令行窗口。
所以最終還是直接選擇使用vbs來包裝這個(gè)bat文件。
- 在bat文件同目錄中創(chuàng)建記事本文件
- 鍵入下面腳本,其中Run命令后面跟的是用cmd來跑jenkins agent啟動(dòng)bat的意思。參數(shù)0表示啟動(dòng)后不在界面顯示(只能通過任務(wù)管理器查看進(jìn)程)。完了以后把擴(kuò)展名改成vbs。
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run("cmd.exe /c jenkins_slave_start.bat"), 0
-
右鍵創(chuàng)建這個(gè)腳本的快捷方式,在windows->run中輸入shell:startup打開啟動(dòng)項(xiàng),把快捷方式拖入到啟動(dòng)文件夾中。
原始目錄中的vbs文件和啟動(dòng)目錄中的快捷方式
雙擊啟動(dòng)這個(gè)進(jìn)程后,windows slave成功上線。服務(wù)器的界面上也看不到任何窗口了。而且服務(wù)器重啟的時(shí)候,也會(huì)通過啟動(dòng)項(xiàng)把這個(gè)服務(wù)啟動(dòng)起來。
同樣的方式,我們也用來啟動(dòng)了selenium grid等其他可以用bat啟動(dòng)的服務(wù)。
不完美的地方
至此,windows slave算搭建完成了。vbs隱藏界面的方式看上去很美好,但是也會(huì)有問題, 比如
- 操作反饋十分不友好,你甚至不知道自己有沒有點(diǎn)擊成功。需要去查看進(jìn)程。
- 無法看到log。如果服務(wù)出了問題沒辦法拿到日志。
所以后面還可以改進(jìn)的地方還挺多。
順帶提一下因?yàn)橹匦乱雡indows slave的關(guān)系,最近又重新?lián)炱鹆藇bs,開心 -v-
