卷2:第2章 Firefox發(fā)布工程

2018-02-24 15:55 更新

原文鏈接:http://www.aosabook.org/en/cmake.html

作者:Chris AtLee,?Lukas Blakk,?John O'Duinn,?Armen Zambrano Gasparian

最近,Mozilla發(fā)布工程組在Firefox的發(fā)布自動(dòng)化方面取得了非常多的進(jìn)步。我們已經(jīng)減少了在簽字和發(fā)送通知時(shí)對(duì)人工參與的要求,并且自動(dòng)化了許多其它的小的手工步驟,因?yàn)榱鞒讨忻總€(gè)手工步驟都可能犯錯(cuò)。盡管仍不算完美,我們始終在盡最大努力自動(dòng)化發(fā)布過程,最終目標(biāo)是真正的一鍵式發(fā)布;最小化人工干預(yù)將會(huì)消除我們?cè)谥澳欠N半人工半自動(dòng)化的發(fā)布過程中所經(jīng)歷過的重復(fù)勞動(dòng)和許多令人頭疼的事情。在本章,我們將帶著你走入并領(lǐng)略構(gòu)成完整的Firefox快速發(fā)布系統(tǒng)的腳本和架構(gòu)的世界(到Firefox 10為止)。

你將會(huì)看到一個(gè)可發(fā)布的Mercurial變更集是如何成為候選發(fā)布,進(jìn)而成為公開發(fā)布的,此時(shí)就對(duì)全世界每日高達(dá)4億5千多萬的用戶完全開放了。我們將會(huì)從構(gòu)建和代碼簽名開始,接下來是定制的合作伙伴和本地化重打包,QA過程,以及如何為每個(gè)支持的版本、平臺(tái)和本地化生成更新。每一個(gè)步驟都必須正確的完成,一個(gè)發(fā)布才可以被推送到Mozilla社區(qū)的鏡像網(wǎng)絡(luò)上供用戶下載。

我們將會(huì)看到一些旨在改善此流程的決定;例如,健康檢查腳本,幫助消除了許多人工錯(cuò)誤導(dǎo)致的問題;自動(dòng)簽名腳本;移動(dòng)發(fā)布集成到桌面發(fā)布流程;補(bǔ)丁程序,用來創(chuàng)建更新;以及應(yīng)用更新服務(wù)(AUS - Application Update Service),將更新發(fā)送給使用著各種不同版本的用戶。

本章描述了如何產(chǎn)生Firefox發(fā)布構(gòu)建的機(jī)制,大部分篇幅都在講解一次構(gòu)建開始后發(fā)布流程的各個(gè)關(guān)鍵步驟。但是,在發(fā)布工程開始產(chǎn)生發(fā)布構(gòu)建之前,還需要做足夠的復(fù)雜的跨團(tuán)隊(duì)溝通。因此,我們就從這里開始吧。

2.1 在開始一個(gè)發(fā)布之前的N個(gè)工作

圖2.2:完整的發(fā)布時(shí)間線,以chemspill為例

2.2. 進(jìn)入構(gòu)建

誰來決定進(jìn)入構(gòu)建

在發(fā)布開始之前,一個(gè)人被指定負(fù)責(zé)協(xié)調(diào)整個(gè)發(fā)布過程。他/她需要參加類選會(huì)議、理解所有項(xiàng)目背景、公平的仲裁bug嚴(yán)重性上的爭(zhēng)議、批準(zhǔn)最新的變更、做出艱難的放棄決定等等。最后,在發(fā)布日,這個(gè)角色在現(xiàn)場(chǎng)負(fù)責(zé)與各個(gè)團(tuán)隊(duì)的所有溝通:開發(fā)、QA、發(fā)布工程、網(wǎng)站開發(fā)、公共關(guān)系、市場(chǎng)等等。

這個(gè)角色在不同的公司有不同的稱呼:發(fā)布經(jīng)理、發(fā)布工程師、Program Manager、項(xiàng)目經(jīng)理、產(chǎn)品經(jīng)理、產(chǎn)品沙皇、發(fā)布舵手等等。本章將使用“發(fā)布協(xié)調(diào)員”這一稱謂,因?yàn)槲覀冇X得這個(gè)詞最清楚的表達(dá)了該角色在我們的流程里起的作用。重點(diǎn)在于這個(gè)角色及其代表的最終權(quán)威能夠被每個(gè)人所清楚的理解,無論其背景或之前在其它地方的工作經(jīng)歷。在發(fā)布日,每個(gè)人都知道自己應(yīng)該遵守和信任這個(gè)角色所做出的協(xié)調(diào)決定。

發(fā)布協(xié)調(diào)員也是發(fā)布工程之外唯一一個(gè)有權(quán)在重大問題出現(xiàn)后發(fā)出“停止構(gòu)建”郵件的人。任何疑似重大問題報(bào)告也會(huì)被發(fā)送到發(fā)布協(xié)調(diào)員,由他/她來評(píng)估及做出go/no-go的決定,并及時(shí)的將此決定周知到每個(gè)人。在發(fā)布日,我們所有人必須遵守和信任這個(gè)角色所作出的協(xié)調(diào)決定。

如何發(fā)出“進(jìn)入構(gòu)建”信號(hào)?

早先通過IRC或者電話口頭的通知帶來了很多誤解,時(shí)常給進(jìn)行中的發(fā)布造成問題。因此,我們現(xiàn)在要求“go to build”信號(hào)通過電子郵件發(fā)送到一個(gè)包含了與發(fā)布過程相關(guān)的所有團(tuán)隊(duì)的每個(gè)人的郵件列表。郵件標(biāo)題包含“go to build”加上產(chǎn)品名及版本號(hào),例如:go to build Firefox 6.0.1。

類似的,如果出現(xiàn)了問題,發(fā)布協(xié)調(diào)員會(huì)發(fā)送一個(gè)新的“all stop”郵件給同樣的郵件列表。我們發(fā)現(xiàn)另外一種做法——回復(fù)該發(fā)布的最新的郵件——是不行的,因?yàn)橐恍┛蛻舳说泥]件會(huì)話功能會(huì)造成一些人注意不到藏的很深的“all stop”郵件。

在“Go to Build”郵件里有些什么?

  1. 構(gòu)建的代碼;理想情況下,是指向要生成發(fā)布構(gòu)建的源碼庫里的特定變更的URL。

a) 類似“使用最新代碼”這樣的指令是絕對(duì)不行的;曾經(jīng)有一個(gè)發(fā)布,在“go to build”郵件發(fā)出之后而構(gòu)建開始之前,一個(gè)好心的開發(fā)未經(jīng)批準(zhǔn)提交了一個(gè)變更到一個(gè)錯(cuò)誤的分支,導(dǎo)致發(fā)布將此變更包括在構(gòu)建中。幸好這個(gè)錯(cuò)誤在交付之前被發(fā)現(xiàn)了,但是,我們因而完全終止、全部重新構(gòu)建,并推遲了發(fā)布。

b) 在象CVS這樣的基于時(shí)間的版本控制系統(tǒng)里,要十分明確的使用準(zhǔn)確的時(shí)間;精確到秒,并指定時(shí)區(qū)。曾經(jīng)有一個(gè)發(fā)布,在Firefox還使用CVS的時(shí)候,發(fā)布協(xié)調(diào)員指定了一個(gè)構(gòu)建的截至?xí)r間但是未說明時(shí)區(qū)。當(dāng)發(fā)布工程注意到缺失時(shí)區(qū)信息時(shí),發(fā)布協(xié)調(diào)員睡著了。發(fā)布工程正確的猜想應(yīng)該是本地時(shí)間(加利福尼亞)。然而,在一次深夜的發(fā)布中,我們將PST看作了PDT,結(jié)果丟了最后一個(gè)關(guān)鍵的bug修復(fù)。這個(gè)錯(cuò)誤在交付之前被QA發(fā)現(xiàn)了,但是我們不得不停止并使用新的截至?xí)r間重新構(gòu)建。

2.對(duì)于特定發(fā)布的清晰的緊迫感。聽起來顯而易見,但在處理一些重要的特例時(shí)非常重要,簡(jiǎn)單總結(jié)如下:

a) 一些發(fā)布是例行的,可以在正常工作時(shí)間完成。這些都是預(yù)先安排的發(fā)布,也會(huì)按時(shí)完成,不存在緊急性。當(dāng)然,所有發(fā)布的構(gòu)建都需要及時(shí)的創(chuàng)建,只是不需要發(fā)布工程師熬夜趕工去完成。我們會(huì)事先做好安排,人們只需要在正常上班時(shí)間工作就可保證每件事情都按時(shí)完成。這將保持大家的體力,以便更好的應(yīng)對(duì)那些意料之外的緊急工作。

b) 一些發(fā)布屬于chemspill這樣緊急性的,需要爭(zhēng)分奪秒。典型的例子包括修復(fù)公開的安全漏洞,或者修復(fù)影響大量用戶的崩潰性問題。Chemspills需要被盡快創(chuàng)建,而不是按預(yù)先的安排。

c) 一些發(fā)布在例行和chemspill之間轉(zhuǎn)換。例如,當(dāng)一個(gè)例行發(fā)布的安全修復(fù)意外的泄漏了,就變成了一個(gè)chemspill發(fā)布。當(dāng)一個(gè)業(yè)務(wù)需求如給即將到來的一次會(huì)議公告準(zhǔn)備的“特供預(yù)覽”發(fā)布,由于商務(wù)原因被延遲時(shí),就從chemspill發(fā)布變?yōu)槔邪l(fā)布。

d) 一些發(fā)布的性質(zhì)存在爭(zhēng)議,因?yàn)閷?duì)相同的修復(fù)存在不同角度的理解。

正是發(fā)布協(xié)調(diào)員這個(gè)角色,負(fù)責(zé)平衡所有這些事實(shí)和觀點(diǎn),達(dá)成決定,并將有關(guān)緊迫性的決定清楚一致的周知到所有團(tuán)隊(duì)。一旦有新的信息,發(fā)布協(xié)調(diào)員會(huì)重新評(píng)估和周知。一些團(tuán)隊(duì)認(rèn)為一個(gè)發(fā)布是chemspill而另外的團(tuán)隊(duì)認(rèn)為是例行的,這種情形對(duì)跨團(tuán)隊(duì)的合作是非常有害的。

最后,這些郵件對(duì)于度量一次發(fā)布中的時(shí)間分配非常有用。盡管它們的準(zhǔn)確度不會(huì)超過掛鐘的時(shí)間粒度,但對(duì)于我們判斷下一步應(yīng)該把工作集中在哪里以加快速度來說已經(jīng)是非常有用的了。正如古老的格言所說,先有度量,才能改進(jìn)。

在Firefox的beta周期里,我們也在做mozilla-beta庫的周發(fā)布。每個(gè)這樣的beta發(fā)布都要經(jīng)過我們通常的完整的發(fā)布自動(dòng)化,與常規(guī)的最終發(fā)布幾乎一模一樣。為了最小化意外,發(fā)布自動(dòng)化流程或底層架構(gòu)在開始最終發(fā)布構(gòu)建之前不能有任何未經(jīng)測(cè)試的變化。

2.3. 打標(biāo)簽,構(gòu)建,源碼壓縮包

圖2.4: 對(duì)每一個(gè)語言進(jìn)行Firefox重打包

現(xiàn)在,我們將整個(gè)repacks分成六個(gè)作業(yè),放在六臺(tái)不同的機(jī)器上并行執(zhí)行。這種方法將時(shí)間減少到了原來的六分之一。這也使得我們可以在個(gè)別repack失敗時(shí)重做一部分作業(yè),而不是全部。我們可以將repacks分成更多、更小的并行的作業(yè),但發(fā)現(xiàn)這將會(huì)占用太多的機(jī)器,進(jìn)而影響到在持續(xù)集成系統(tǒng)上運(yùn)行的由開發(fā)啟動(dòng)的無關(guān)作業(yè)。

移動(dòng)發(fā)布(Andoid)流程稍有不同,因?yàn)槲覀儍H產(chǎn)生兩個(gè)安裝包:一個(gè)英語版的,一個(gè)多語言版的將一打語言一塊放進(jìn)安裝包里而不是每個(gè)獨(dú)立的構(gòu)建放一個(gè)。多語言版本的大小是一個(gè)問題,尤其是對(duì)移動(dòng)設(shè)備的慢速下載而言??赡艿囊粋€(gè)改進(jìn)是其它語言按需請(qǐng)求并從addons.mozilla.org取得。

在圖2.4里,可以看到語言信息依賴三個(gè)不同的源:shipped_locales,l10_changesets 和 l10n-changesets_mobile-release.json。(計(jì)劃合并成一個(gè)統(tǒng)一的JSON文件)這些文件包含不同本地化的信息以及某些平臺(tái)例外。特別的,對(duì)于某個(gè)給定的本地化,我們需要知道對(duì)于給定的發(fā)布使用庫的哪個(gè)修訂,以及是否它可以用于所有支持的平臺(tái)(例如,Mac上的日語來自于一個(gè)不同的庫)。Desktop發(fā)布有兩個(gè)這種文件,而移動(dòng)發(fā)布有一個(gè)(此JSON文件包含平臺(tái)列表和變更集)。

誰來決定發(fā)布哪種語言呢?首先,本地化負(fù)責(zé)人自己提名特定的變更集,然后由Mozilla的本地化小組評(píng)審,顯示在一個(gè)web儀表盤里,其中列出了每種語言需要的變更集。發(fā)布協(xié)調(diào)員也會(huì)在發(fā)出“go to build”郵件前進(jìn)行評(píng)審。發(fā)布的時(shí)候就可以獲取變更集列表,加入到重打包中。

除了本地化重打包以為,我們還進(jìn)行合作伙伴重打包。這是為希望定制其客戶體驗(yàn)的各個(gè)合作伙伴而當(dāng)定制的構(gòu)建。主要的變化是定制的書簽、主頁和搜索引擎,但是很多其它的事情也可以被改變。這些定制的構(gòu)建是為最新的Firefox發(fā)布生成的,不適用于beta版。

2.5. 簽名

為了讓用戶肯定他們下載的Firefox是真實(shí)的來自Mozilla且未經(jīng)篡改的版本,我們使用了幾種不同類型的數(shù)字簽名。

第一種簽名用于Windows版本,我們使用了Microsoft Authenticode(signcode)簽名鍵去簽署.exe和.dll文件。Windows可以使用這些簽名來驗(yàn)證應(yīng)用來自可信賴源。我們還用Authenticode鍵對(duì)Firefox的安裝程序進(jìn)行的簽名。

接下來我們使用GPG為所有平臺(tái)上的所有版本生成一系列MD5和SHA1校驗(yàn)和,為校驗(yàn)和文件及所有構(gòu)建和安裝程序生成分割的GPG簽名。這些簽名供鏡像網(wǎng)站及其它社區(qū)成員進(jìn)行下載驗(yàn)證。

出于安全目的,我們有一個(gè)專門的通過防火墻和VPN與外部鏈接隔離的簽名機(jī)器。Keyphrases, password和keystores通過安全通道在發(fā)布工程師間傳送,經(jīng)常是親自取送,以最小化泄漏的風(fēng)險(xiǎn)。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)