邵奇 年福豐
(中國直升機(jī)設(shè)計(jì)研究所 江西省景德鎮(zhèn)市 333001)
隨著嵌入式功能需求賦予軟件的能力越來越多,嵌入式軟件的復(fù)雜度在不斷上升,規(guī)模越來越大。然而,嵌入式軟件對可靠性、安全性和穩(wěn)定性的要求卻并未降低,特別是涉及到航空航天、汽車電子等領(lǐng)域的嵌入式軟件,更是在逐步提升軟件質(zhì)量和安全的標(biāo)準(zhǔn)。
面對上述趨勢,大型嵌入式軟件開始降低模塊間的耦合度,增加模塊數(shù)量,軟件開發(fā)模式也逐漸從瀑布開發(fā)模式向敏捷開發(fā)模式變化,多人多團(tuán)隊(duì)同時(shí)開發(fā)不同模塊和功能的場景愈發(fā)常見,軟件開發(fā)后期會(huì)經(jīng)歷痛苦的多模塊集成過程。為了解決這個(gè)問題,保證高質(zhì)高效的完成項(xiàng)目,開發(fā)人員開始提煉集成過程中重復(fù)且無需人工干預(yù)的任務(wù)如軟件構(gòu)建、自動(dòng)化測試等,并將這些任務(wù)交給計(jì)算機(jī)完成,全自動(dòng)化的持續(xù)集成模式開始出現(xiàn),通過這種模式可以使軟件研發(fā)過程中的回歸性和敏捷性達(dá)到最優(yōu)。因此,在未來的嵌入式軟件開發(fā)中引入持續(xù)集成是必須的,而如何開展持續(xù)集成工作和保證持續(xù)集成工作的高效性將成為軟件開發(fā)中的一個(gè)重要問題。
軟件持續(xù)集成的主要工作是通過持續(xù)集成平臺(tái),使項(xiàng)目團(tuán)隊(duì)可以頻繁的集成構(gòu)建以及測試代碼,并及時(shí)得到反饋。它是持續(xù)交付概念中的重要一環(huán),也是DevOps 中的重要組成部分,主要涉及軟件開發(fā)人員和測試人員。對于開發(fā)人員來說,通過持續(xù)集成可以讓“發(fā)現(xiàn)錯(cuò)誤的時(shí)間盡可能接近引入該錯(cuò)誤的時(shí)間”,開發(fā)人員通過高頻率的集成以及運(yùn)行他們的代碼更快的發(fā)現(xiàn)錯(cuò)誤,減少后期集成的工作難度,提高軟件開發(fā)效率。對于測試人員來說,持續(xù)集成將嚴(yán)格的軟件測試工作真正的貫穿到軟件生存周期的全過程中,更加高效的發(fā)現(xiàn)軟件問題,提高軟件質(zhì)量。
借助于持續(xù)集成平臺(tái)和相關(guān)工具,可以高效的組織不同團(tuán)隊(duì)間通過自動(dòng)化工具協(xié)作和溝通來完成軟件的生命周期管理,從而更快、更頻繁地交付穩(wěn)定軟件。當(dāng)前,持續(xù)集成正在快速推廣,尤其在軍工軟件領(lǐng)域,據(jù)報(bào)道,美空軍和海軍通過使用持續(xù)集成方式,已經(jīng)在軍事軍工體系的軟件研發(fā)中獲得重大收益。2019 年的一則報(bào)道指出,美軍在45 天內(nèi)將kubernetes 容器調(diào)度引擎、可彈性伸縮的微服務(wù)架構(gòu)用于F16 和F22 戰(zhàn)機(jī),并對10 萬人進(jìn)行過培訓(xùn),指導(dǎo)他們使用相關(guān)的新型技術(shù)工具。美國海軍更是提出了C2C24 DevSecOps 計(jì)劃,以期具備更快速的響應(yīng)以迎接挑戰(zhàn),面對國際競爭勢力日益彰顯的時(shí)代,搭建適用于軍工行業(yè)的持續(xù)集成平臺(tái),尤其是嵌入式軟件的持續(xù)集成平臺(tái),構(gòu)建符合國內(nèi)的軍事軍工體系的新型軟件研發(fā)迭代體系,顯得尤為迫切且重要。
針對上述問題可知,高效的持續(xù)集成過程是基于持續(xù)集成平臺(tái)的,如何搭建正確合理的持續(xù)集成平臺(tái)是解決持續(xù)集成問題的重點(diǎn)。建立持續(xù)集成平臺(tái)的目標(biāo)是能夠快速的開展代碼管理、軟件構(gòu)建、持續(xù)集成以及問題反饋等工作,為了便于開發(fā)人員更方便的使用持續(xù)集成平臺(tái),持續(xù)集成平臺(tái)的架構(gòu)經(jīng)常為B/S(Browser/Server)架構(gòu),在這種架構(gòu)下開發(fā)人員只要安裝了瀏覽器,就可以登錄服務(wù)器開展相關(guān)操作。
對于持續(xù)集成平臺(tái)的服務(wù)端,如圖1 所示其主要包括三個(gè)部分:唯一受信源、調(diào)度及展示平臺(tái)以及基礎(chǔ)支撐服務(wù)。唯一受信源提供代碼倉庫和開發(fā)分支的管理;調(diào)度及展示平臺(tái)是持續(xù)集成平臺(tái)的主要功能,通過與其它工具的協(xié)作,完成整個(gè)持續(xù)集成過程;而基礎(chǔ)支撐服務(wù)則提供了持續(xù)集成中需要用到的一些基礎(chǔ)能力,包括代碼提交、代碼編譯、代碼測試等功能。
圖1:持續(xù)集成平臺(tái)架構(gòu)圖
當(dāng)前實(shí)現(xiàn)上述三部分的工具集已經(jīng)較為豐富,其中受信源管理可以使用多種代碼倉庫如Github,Gitee,Bitbucket等搭配版本控制系統(tǒng)如SVN,ClearCase,CVS,Git 等;調(diào)度及展示平臺(tái)可以使用Jenkins,CruiseControl,Bamboo 等;對于基礎(chǔ)支撐服務(wù)則要結(jié)合具體的業(yè)務(wù)類型選擇,如針對嵌入式可能會(huì)使用到開發(fā)工具如VS Code,Source Insight,構(gòu)建工具Tornado,Workbench,測試工具Testbed、PcLint 等。
本文的持續(xù)集成平臺(tái)構(gòu)建方案主要針對嵌入式軟件,部分嵌入式軟件的開發(fā)環(huán)境較為獨(dú)立(如軍工行業(yè)),難以便捷的使用互聯(lián)網(wǎng)資源,本著方便快捷,環(huán)境穩(wěn)定易搭建的原則,選擇Bitbucket 作為代碼倉庫管理軟件,并使用Bamboo工具進(jìn)行持續(xù)集成實(shí)踐。
在構(gòu)建方案中,持續(xù)集成的基礎(chǔ)是服務(wù)器端的代碼倉庫(唯一受信源),本文使用BitBucket 作為代碼倉庫的管理軟件。下面對該軟件及代碼倉庫的管理思路進(jìn)行說明。
3.1.1 Bitbucket 介紹
Bitbucket 是和Github 旗鼓相當(dāng)?shù)募惺酱a托管系統(tǒng),可以采用Git 作為分布式版本控制系統(tǒng),具備fork、PR、Bug 跟蹤、自定義域名等常用功能,并且易于和其它Atlassian 產(chǎn)品聯(lián)合使用。對于Bitbucket 而言,支持Git 是其重要屬性,Git 是一個(gè)開源的分布式版本控制系統(tǒng),可以有效、高速得處理從很小到很大的項(xiàng)目版本管理,相較于另一款流行的版本管理工具SVN 而言,它提供了不依賴于服務(wù)器的分布式管理方式、靈活使用的分支系統(tǒng)以及更多可以操控的細(xì)節(jié),因而受到了廣泛的歡迎。Bitbucket 提供的Pull Request(PR)機(jī)制也會(huì)被頻繁使用。PR 是一種通知機(jī)制。該機(jī)制結(jié)合倉庫訪問策略,軟件擁有者或核心開發(fā)人員就可以可控的合并代碼,了解其它開發(fā)成員每次的更改內(nèi)容,并及時(shí)作出反饋。
3.1.2 基于BitBucket 和Git 的源碼庫管理
基于Bitbucket 和Git 進(jìn)行源代碼庫管理,主要分為兩方面,一是倉庫的管理,二是分支的管理。對于倉庫的管理選擇使用如下方式:Bitbucket 提供遠(yuǎn)端倉庫的訪問控制,管理人員和開發(fā)人員制定訪問規(guī)則,來限制不同用戶對于遠(yuǎn)端倉庫的操作。通過fork 功能,對中央倉庫進(jìn)行派生,阻止其它開發(fā)人員隨意向中央倉庫寫入,通過PR 來向中央倉庫寫入。通過這種倉庫管理方式,達(dá)到對開發(fā)倉庫和中央倉庫的隔離,如圖2 所示。
圖2:倉庫管理策略
其次,除了倉庫訪問具有策略以外,開發(fā)人員是在Git的分支上進(jìn)行開發(fā)的,因而要制定相應(yīng)的分支管理策略:使用GitFlow 來對倉庫中的分支進(jìn)行管理, GitFlow 最初由Vincent Driessen 提出,是現(xiàn)在比較流行的分支策略,如圖3所示,從總體上來看,GitFlow 屬于分支開發(fā),主干發(fā)布的分支管理策略。代碼最初只具有develop 分支,開發(fā)者基于該分支上的節(jié)點(diǎn)創(chuàng)建自己的分支用于開發(fā)新功能,功能開發(fā)完畢后,將其合并到develop 分支上,當(dāng)某階段所需功能開發(fā)完全后,選定某一時(shí)間點(diǎn),圖中對應(yīng)節(jié)點(diǎn)D,對開發(fā)分支進(jìn)行“功能凍結(jié)(feature freeze)”,基于該節(jié)點(diǎn),創(chuàng)建一個(gè)發(fā)布分支(release)或測試分支(test),用于測試和Debug,經(jīng)過一段時(shí)間的整體測試,確保代碼已經(jīng)達(dá)到要求,此時(shí)再將最終代碼發(fā)布到主分支上。
圖3:分支管理策略
在使用代碼倉庫管理代碼的基礎(chǔ)上,還需要一個(gè)持續(xù)集成平臺(tái)來開展持續(xù)集成工作,本文使用Bamboo 作為持續(xù)集成服務(wù)器軟件。下面對該軟件及其持續(xù)集成思路進(jìn)行說明。
3.2.1 Bamboo 介紹
Bamboo 是一款用于持續(xù)集成構(gòu)建的服務(wù)器軟件,可以提供編譯構(gòu)建管理服務(wù)、自動(dòng)化測試管理服務(wù)和基礎(chǔ)環(huán)境管理服務(wù),用戶可以使用該軟件進(jìn)行持續(xù)集成,持續(xù)部署和持續(xù)交付,將構(gòu)建,自動(dòng)化測試整合于單個(gè)工作流中。其中編譯構(gòu)建管理服務(wù)主要包括構(gòu)建任務(wù)管理和調(diào)度、構(gòu)建集群管理及執(zhí)行器調(diào)度,通過上述這些功能,Bamboo 可以接收和發(fā)送構(gòu)建請求,調(diào)度相應(yīng)任務(wù)到構(gòu)建機(jī)上、建立和管理構(gòu)建環(huán)境,以及通過執(zhí)行器調(diào)用相應(yīng)的構(gòu)建工具進(jìn)行構(gòu)建。同時(shí),Bamboo 也提供了自動(dòng)化測試管理服務(wù),主要包括測試任務(wù)管理、測試用例調(diào)度和測試集群管理,通過上述功能Bamboo 可以接收測試請求,反饋測試結(jié)果,按照需要執(zhí)行測試任務(wù),以及建立和監(jiān)控測試環(huán)境。
3.2.2 基于Bamboo 的持續(xù)集成
在Bamboo 中,可以針對具體的持續(xù)集成過程,制定相應(yīng)的持續(xù)集成計(jì)劃(Plan),每個(gè)計(jì)劃中,包含多個(gè)任務(wù)(task),如:代碼檢出任務(wù),構(gòu)建任務(wù)和測試任務(wù)等,任務(wù)會(huì)調(diào)用多種類型的腳本文件從而實(shí)現(xiàn)相關(guān)功能,完成持續(xù)集成實(shí)踐。
對于代碼檢出任務(wù)而言,Bamboo 可以獲知Bitbucket 代碼倉庫的狀態(tài),及時(shí)獲知代碼更新,以及快速的拉取指定代碼倉庫中的文件;對于構(gòu)建任務(wù)而言, Bamboo 可以通過調(diào)度服務(wù)使用遠(yuǎn)程代理功能,將構(gòu)建任務(wù)發(fā)送到對應(yīng)的構(gòu)建機(jī)上進(jìn)行構(gòu)建,如對Tornado 工程的構(gòu)建就發(fā)送到具有該編譯環(huán)境的機(jī)器上進(jìn)行編譯,并得到構(gòu)建結(jié)果;對于測試任務(wù)而言,Bamboo 可以進(jìn)行多種測試任務(wù)如“代碼規(guī)范審查”和“代碼動(dòng)靜態(tài)掃描”等。通過編寫相應(yīng)腳本,Bamboo 可以調(diào)用如Testbed等專業(yè)的軟件測試工具對代碼進(jìn)行掃描分析,并得到相應(yīng)測試和掃描結(jié)果。在完成持續(xù)集成計(jì)劃的制定后,便可以通過Bamboo 開展一次持續(xù)集成實(shí)踐,其實(shí)踐過程如圖4 所示。
圖4:Bamboo 持續(xù)集成流程圖
(1)開發(fā)人員提交代碼到Bitbucket 中的代碼倉庫中,Bitbucket 告知Bamboo 代碼已經(jīng)更新。
(2)Bamboo 持續(xù)集成服務(wù)器發(fā)現(xiàn)代碼變更后,通過任務(wù)管理功能,選擇相應(yīng)的持續(xù)集成計(jì)劃,開始執(zhí)行指定的持續(xù)集成任務(wù),完成對于代碼的構(gòu)建和審查。
(3)得到相應(yīng)的集成結(jié)果報(bào)告,并將該報(bào)告通知相關(guān)的開發(fā)人員。
上文已經(jīng)介紹了如何通過Bitbucket 管理代碼倉庫以及通過Bamboo 進(jìn)行持續(xù)集成工作,接下來將兩款軟件聯(lián)合使用,使用Bitbucket 管理代碼,使用Bamboo 開展持續(xù)集成過程,包括調(diào)用Tornado 進(jìn)行軟件構(gòu)建和Testbed 進(jìn)行代碼審查等功能,實(shí)現(xiàn)完整的持續(xù)集成過程。
為了使持續(xù)集成過程有效且穩(wěn)定的開展,形成一份盡量詳細(xì)的持續(xù)集成約定是必要的,開發(fā)人員應(yīng)當(dāng)嚴(yán)格按照該約定進(jìn)行持續(xù)集成工作。
限于篇幅原因,這里只展示部分重點(diǎn)約定:
(1) Bitbucket 中央倉庫僅對開發(fā)人員提供read 權(quán)限,新團(tuán)隊(duì)或成員加入時(shí),應(yīng)向管理人員申請可用的派生倉庫,來自于其它派生倉庫的PR 將不被接受。
(2)使用Gitflow 分支模式,開發(fā)分支應(yīng)當(dāng)被命名為Develop_功能名,測試人員使用test 分支進(jìn)行測試,且測試分支的代碼不允許與Develop 合并,避免合入測試代碼。
(3)工作人員檢出工作分支后,應(yīng)當(dāng)像軟件測試人員申請,關(guān)聯(lián)一個(gè)持續(xù)集成計(jì)劃。
(4)針對每次提交,均需要執(zhí)行持續(xù)集成計(jì)劃,且得到結(jié)果報(bào)告后,再開展后續(xù)開發(fā)。
(5)功能開發(fā)完成后,應(yīng)當(dāng)及時(shí)告知測試人員進(jìn)行用戶功能驗(yàn)收測試,并發(fā)起PR,PR 描述中應(yīng)當(dāng)包含關(guān)鍵內(nèi)容說明,附件中最好添加持續(xù)集成結(jié)果報(bào)告。
(6)在批準(zhǔn)PR 前,請核心團(tuán)隊(duì)完成代碼審查,并給出評價(jià),如果拒絕PR,則應(yīng)當(dāng)?shù)谝粫r(shí)間告知開發(fā)人員。
依據(jù)上述的持續(xù)集成約定,最終可以形成如圖5 所示的工作流。
圖5:持續(xù)集成工作流
圖5 展示了完整的持續(xù)集成過程,其中,代碼倉庫和分支的管理使用Bitbucket 實(shí)現(xiàn),而持續(xù)集成過程通過Bamboo完成。持續(xù)集成將貫穿整個(gè)功能開發(fā)階段和質(zhì)量保證階段,對于每一個(gè)分支上提交的代碼,均自動(dòng)執(zhí)行相應(yīng)的持續(xù)集成計(jì)劃,計(jì)劃中的任務(wù)包括,使用tornado 構(gòu)建工程、使用Testbed 掃描代碼、反饋相應(yīng)的分析報(bào)告等。該過程可以被分成4 個(gè)階段:
4.2.1 工作分配階段
如圖6 所示,該階段從主分支1.0 版本到A 節(jié)點(diǎn),在該階段,工作內(nèi)容和開發(fā)人員被確定,管理人員通過Bitbucket向開發(fā)團(tuán)隊(duì)派生開發(fā)倉庫。
圖6:工作分配階段
4.2.2 功能開發(fā)階段
如圖10 所示,該階段從A 到D 節(jié)點(diǎn),這個(gè)階段中,開發(fā)人員持續(xù)的進(jìn)行功能開發(fā),并使用代碼提交工具不斷的提交代碼(圖7),并執(zhí)行持續(xù)集成平臺(tái)已經(jīng)制定好的持續(xù)集成計(jì)劃(圖8)對提交的代碼開展構(gòu)建和測試工作,進(jìn)行持續(xù)集成。在得到軟件測試報(bào)告等反饋信息(圖9)后,開發(fā)人員需要確認(rèn)每次提交的代碼是否正確無誤,無問題后方可開展下一步的工作。
圖7:代碼提交
圖8:持續(xù)集成計(jì)劃圖
圖9:自動(dòng)化測試報(bào)告
圖10:功能開發(fā)階段
4.2.3 質(zhì)量保障階段
如圖12 所示,該階段從D 節(jié)點(diǎn)到E 節(jié)點(diǎn)間,此時(shí)所有功能開發(fā)完畢,測試人員和仿真人員可以開展軟件的完整功能驗(yàn)證和全面的代碼測試分析,并得到測試結(jié)果,如圖11所示,開發(fā)人員則通過反饋繼續(xù)完善代碼,并繼續(xù)使用平臺(tái)進(jìn)行持續(xù)集成工作,直到得到滿足用戶所有功能需求且通過測試的可發(fā)布軟件。
圖11:測試問題反饋
圖12:質(zhì)量保障階段
4.2.4 代碼提交階段
如圖15 所示,該階段從E 節(jié)點(diǎn)到最后主分支的2.0 節(jié)點(diǎn),在這個(gè)階段中,開發(fā)人員發(fā)起代碼合并請求,中心倉庫的管理人員對代碼進(jìn)行最后的審查,確認(rèn)代碼無誤且風(fēng)格統(tǒng)一后,合入并發(fā)布新版本(如圖13、圖14 所示),至此完整的軟件開發(fā)階段結(jié)束。
圖13:分支合并
圖14:合并記錄
圖15:代碼提交階段
基于上述的工作流進(jìn)行持續(xù)集成具有如下優(yōu)勢:
(1)倉庫用途明確,團(tuán)隊(duì)工作隔離。將開發(fā)倉庫和發(fā)布倉庫分離,將主分支和開發(fā)分支及功能分支分離,因而可以做到,在多個(gè)團(tuán)隊(duì)開發(fā)時(shí),避免相互干擾,且有利于保證開發(fā)倉庫的簡潔。
(2)開發(fā)流程和持續(xù)集成過程明晰,整個(gè)開發(fā)流程被分為了,工作分配,功能開發(fā),質(zhì)量保證,代碼提交四個(gè)大階段,在每個(gè)階段上進(jìn)行的工作都清晰明了,且執(zhí)行持續(xù)集成的時(shí)間點(diǎn)也有跡可循。
(3)代碼質(zhì)量可以得到較好保證,通過上述工作流,發(fā)布分支上發(fā)布的程序,必須經(jīng)過持續(xù)集成驗(yàn)證、測試人員測試和核心團(tuán)隊(duì)審核三次確認(rèn)才可以發(fā)布,因而可以保證較高的發(fā)布質(zhì)量。
(4)Bitbucket 和Bamboo 的關(guān)聯(lián)性較好,工作流實(shí)現(xiàn)較為便捷。
本文通過對持續(xù)集成方法的研究,采用代碼托管工具Bitbucket 和持續(xù)集成軟件Bamboo 構(gòu)建了適用于嵌入式軟件開發(fā)的持續(xù)集成平臺(tái),并使用該本平臺(tái)開展了代碼倉庫管理、嵌入式軟件構(gòu)建和自動(dòng)化代碼掃描等持續(xù)集成實(shí)踐,得到了完整的工作流。
使用該平臺(tái)進(jìn)行開發(fā)工作時(shí),可以在功能分支和開發(fā)分支上進(jìn)行高效的持續(xù)集成工作,及時(shí)發(fā)現(xiàn)軟件錯(cuò)誤,保障軟件質(zhì)量和安全性。并且,該工作可以通過腳本借助于相關(guān)軟件和工具自動(dòng)進(jìn)行,不需要開發(fā)人員花費(fèi)過多的額外精力,最大程度上減輕了集成工作的難度和工作量。