圖片來源: 

iThome

在2014年,雅虎前執行長Marissa Mayer一聲令下,沒有通過持續整合(Continuous Integration,CI)的專案不得上線,不只美國團隊,頓時也對亞太地區的臺灣、日本雅虎團隊運作產生極大影響。

在臺灣雅虎,貢獻營收的重要三大電商App分別是超級商城、拍賣以及購物中心,在臺灣總共有超過千萬使用者,在2015年時,行動端的流量也已經超過PC端,目前總占臺灣雅虎流量的了6成。臺灣雅虎這些重要產品的開發也引入了CI工作流程。

現在臺灣雅虎也維持2周一個衝刺期(Sprint)發布新版本的步調,由於開發專案必須配合既定促銷活動,例如父親節、母親節、周年慶等活動,因此團隊所面臨的挑戰在於專案發布的快步調及複雜度。

即便在快節奏下開發產品,Yahoo亞太區電子商務產品研發工程部資深工程師李卿澄表示,開發團隊也得確保每次釋出版本的品質皆可靠。同時為了讓程式碼從最初的提交步驟,到最後進入線上環境過程中,都沒有任何人為介入,必須大量仰賴自動化流程,「要達到如此作業,雅虎必須建立CI流程。」他認為,導入自動化流程的重要性在於,讓開發人員的時間、精力都集中在開發新功能上,而測試、部署等例行公事,可以交由電腦自動化執行。此外,因為這些流程由電腦執行,比人類可靠許多,讓軟體開發品質上也能獲得一定提升。

通過自動化測試程式碼才能合併

在軟體專案開發流程中,最一開始的起點是工程師完成程式碼。在臺灣雅虎的工作流程中,要求工程師在送出合併請求(Pull Request)前,必須在本地開發環境進行基本的單元測試。李卿澄表示,接著就會進行Code Review,讓團隊成員互相了解對方所撰寫的程式碼,「同時也會開始進行CI自動化流程。」

在CI流程中,程式碼接著上傳至雅虎內部自行開發的持續部署(Continuous Delivery,CD)平臺Screwdriver。此工具結合Jenkins套件執行程式碼覆蓋率測試,並且產出後續的測試報告。不僅如此,Screwdriver也能進行水平擴充,讓開發者可以將測試範圍延伸至數個Jenkins叢集。李卿澄表示,除了基礎的測試外,開發者也可以利用Screwdriver執行UI介面相關的測試,像是App是否能開啟畫面,或是App開啟後,是否會發生閃退、當機的狀況。

當程式碼通過Code Review及Screwdriver的測試後,才可以被合併至既有的程式庫中。但開發流程還不在此打住,因為還不足以確定程式碼品質可以進入正式環境,必須通過3大自動化階段才算數。

首先是提交暫存(Commit Stage)階段,此階段的目的,除確保App可以正確運作外,也會對程式碼進行單元測試,檢驗輸入某參數是否會產出預期結果。同時也會進行App的覆蓋率測試。

李卿澄解釋,當覆蓋率越高,代表原始碼通過越多自動化測試,未來釋出的App也會有一定的品質保證。再者是驗收測試,此階段得進行煙霧測試,確保最重要的功能能正常運作。

最後,當App通過最後非功能性測試就可以釋出,此階段的重點在確保App執行穩定性及效能表現。臺灣雅虎在這引入了猴子測試(Monkey Test),撰寫腳本程式隨機地滑動App,測試其穩定性。而效能表現則執行冷開機測試、記憶體使用量等效能表現。李卿澄表示:「當程式碼通過這些自動化階段後,就是一個可以釋出的候選版本」,反之,當沒有測試過,工程師就得開始著手進行修改。

即使程式碼通過Code Review,也還不足確保該品質足以合併至正式環境中。因此臺灣雅虎還額外設定了3個自動化流程,包含提交暫存階段、驗收測試及非功能性測試,通過測試後即可成為候選版本。(圖片來源/臺灣雅虎)

著手發展適合臺灣雅虎的CI工作術

雖然當時Marissa Mayer強硬要求雅虎開發團隊引入CI的做法,引起內部不少聲浪、反對,但Yahoo亞太區電子商務產品研發工程部資深經理宋志峰表示,臺灣雅虎App開發團隊受到的影響不多,「我們還為此特別召開讀書會,一同討論、了解CI的原理。」他表示,在臺灣雅虎導入CI時,外界對於App開發引入CI的討論還不熱烈,因此,臺灣雅虎得要將教課書中的教條,轉換成符合自家工作流程的CI。

「在談CI時,其中一個重要精神就是吹口哨(Whistle),告知工程師程式碼發生問題」,他表示,傳統的警示方法,不是在儀表板收到警告,就是發送電子郵件給相關開發者,而臺灣雅虎想出了一個將示警資訊具象化的有趣作法,就是將一顆顆燈泡架設在工作桌面上,利用燈號變化作為警示,「顏色改變在工作環境中相當敏感。」宋志峰舉例,在程式碼建置過程中,燈泡會維持一定頻率的明滅狀態。當程式碼出現問題,燈泡就會開始閃爍紅燈。反之,程式碼正常無誤時,就會呈現藍色。

宋志峰認為,App開發流程,開發者較少討論CD的原因在於,無論是iOS或Android應用程式開發,「最後一段的部署工作還是得要引入人工作業。」他解釋,程式碼完整建置後會封裝成二進位檔案,接著開發者還得要撰寫相關的描述文件,後續再上傳至App Store、Google Play,「這也是為何相比App,基礎架構或Web應用比較有辦法引入CD」,他表示,雖然在CI、CD書籍都會介紹一套標準作法,但是在引入現實開發流程中,還得要根據業務需求微調。李卿澄則表示,即使開發者可以無間斷地向Google、Apple上傳程式碼,「瓶頸仍然在這些平臺商。」

CI的重要精神就在於告知開發者程式碼出現異常,當而臺灣雅虎將該資訊具象化的作法,就是將一顆顆燈泡架設在工作桌面上,利用燈號變化作為警示。當程式碼出現問題,燈泡就會開始閃爍紅燈。反之,程式碼正常無誤時,就會呈現藍色。(圖片來源/臺灣雅虎)

CI可提高開發者對程式碼品質的信任

相比過去沒有導入CI的開發流程的差異,宋志峰認為,因為程式碼發布前都得要通過CI流程中的測試程序,開發者自然會提高對軟體專案的信心。在應用程式功能越來越齊全下,如果沒有這些自動化流程,難以確保程式碼在通過合併請求後,是否會既有的App產生影響,「如果放任品質不確定的程式碼發布,等於讓使用者進行公測。」

在導入CI後,李卿澄也得出一些開發上的心得:「CI、CD的重要精神就在於,提早讓開發者察覺程式碼中的異狀。」相比1,000行程式碼與10行程式碼,他表示,開發者比較容易在後者發現異常之處。也因此,控管每次提交的合併請求程式碼數量得在一定範圍內,可以減輕人工作業的複雜度,「每次程式碼提交的行數不要太多,可以確保Code Review的品質。」

Yahoo亞太區電子商務產品研發工程部資深工程師李卿澄表示,CI、CD的重要精神就在於,提早讓開發者察覺程式碼中的異狀,因此,控管開發者提交的程式碼數量,可以降低Code Review作業的複雜度。

管控開發者每次合併請求的程式碼數量

而宋志峰也認為,提交過多的程式碼,除了拉高人工Code Review複雜度,開發者也難綜觀全局解讀程式碼。在實施CI之後,他表示,臺灣雅虎也整理出了經驗法則,得出單一合併請求得落在一定標準範圍內,「如果程式碼太多,就得要切割成更多小版本發布。」

雖然程式碼複雜度,經常與行數成正相關,不過臺灣雅虎並沒有做出強制規定,「重點還是在於執行測試的複雜度」,李卿澄舉例,即使開發者提出一個修改行數極多的合併請求,但其中的操作相當簡單,像是僅對錯字進行修改,「就算更動的程式碼很多,但是複雜度不高。」透過這樣措施,在多人協作開發時,也能減少開發者同時修改到同一功能的狀況。

宋志峰表示,雖然開發專案必須配合既定促銷活動,例如父親節、母親節、周年慶都已經事先規畫,雖然,開發團隊也能提早計畫發布計畫,「對開發流程不會產生太多影響。」李卿澄也認為,由於程式碼已經通過CI中的審核步驟,讓工程師每次發布品質都已達候選版本的水準,「目標是程式碼一離手,就是隨時可以發布的品質。」

前端框架開發也要靠CI流程

除了App開發,目前臺灣雅虎內部大量使用的前端開發框架AppDevKit,也是採用幾乎一樣的CI流程進行開發。主導這個內部框架工具開發的宋志峰表示,在開發超級商城、拍賣等電商App中,由於電子商務App的架構,或開發碰上的問題也都很類似,因此團隊才決定一同整併開發者經常使用的函式庫,減少開發者重造輪子的狀況。

電子商務App中,「最複雜的就是產品頁面,裡頭包含很多資訊」,宋志峰解釋,在同一頁面中,除產品的照片外,還要列出相關優惠及折價資訊。同時,系統也會依據產品性質,列出消費者可能會購買的推薦產品。

而考量超級商城、拍賣以及購物中心這3大App,在功能上都有所類似之處,因此AppDevKit也整合前端工程師經常使用的功能,像是調整排版、修改文字大小、下拉式更新(Pull to refresh),讓前端工程師不須碰上新專案,就得重新開發此功能。宋志峰表示,這些常見功能,不只電商App,也是其他種類App也可多加利用,「當初AppDevKit的設計,就是一個滿足通用的開發套件。」

在臺灣雅虎電商App中,UI開發也占了相當比例,利用程式碼覆蓋計算,光是UI程式碼就占了單一頁面了30%。因此宋志峰表示,利用AppDevKit,開發者大概可以減少3成的開發重工,讓工程師可以專心思考能對業務產生影響的新功能。

 

Yahoo亞太區電子商務產品研發工程部資深經理宋志峰表示,因為程式碼發布前都得要通過CI流程,開發者自然會提高對軟體專案的信心,如果放任品質不一的程式碼發布,等同讓使用者進行公測。

靠Crash Manager紀錄系統當機資料

但是,天底下並沒有完美的程式碼,就算通過一系列的審核流程,其中也一定會有Bug的存在。因此臺灣雅虎內部也有一個監控系統Crash Manager,用來監控使用AppDevKit開發的應用程式每日總共當機的次數。在應用程式當機之後,系統會自動傳送一份報告至Crash Manager,列出可能造成當機原因,接著,開發者就會開始著手修復,「App閃退、當機是我們最在意的問題。」李卿澄表示。

宋志峰進一步解釋,Crash Manager回傳的報告中,會按照年、月、系統版本等分類,紀錄App當機的次數。如果有故障排除的需求,開發者也可以瀏覽更多資訊。

在排除故障中,開發者得要透過App使用者在操作路徑上留下的麵包屑(Breadcrumb),重現應用程式發生當機的原因,「最怕不是找不出問題,而是害怕沒辦法重新驗證問題」,因此,李卿澄表示,開發團隊必須知道引起系統當機的原因,並且執行同樣的操作路徑,確定系統不再因此失靈,才可確認修改程式碼有效。

將AppDevKit開源,匯聚社群創新點子

近日,臺灣雅虎已經將 這個開發套件在GitHub上開源釋出。李卿澄笑說,開源會帶來很多好處,「好東西要跟大家一起分享」,臺灣雅虎歷經許多開發痛點,在解決這些惱人的問題後,也希望其他開發者不要碰上一樣的問題,「讓工程師更專注在新功能,而不是解決雜事。」此外,將AppDevKit放置在GitHub上面,也能集結外部開發者的意見,將合併請求加入主幹,使專案更加茁壯。他表示,即使未來有開發者推出更好的分支版本,「我們也很樂見,代表iOS社群不斷在改善這個專案,對臺灣雅虎也是受惠。」

宋志峰則認為,開源釋出AppDevKit,除了外部社群的力量,臺灣雅虎也會持續投入AppDevKit專案的開發,「匯聚來自內外的力量,可以讓AppDevKit的未來發展更好。」


Advertisement

更多 iThome相關內容