在不斷發(fā)展的嵌入式系統(tǒng)世界中,迫切需要采用軟件領(lǐng)域的最佳實踐來確保及時、一致和高質(zhì)量的發(fā)布。嵌入式CI/CD是幫助革新嵌入式軟件開發(fā)方式的實踐之一。
持續(xù)集成(CI)和持續(xù)部署/交付(CD)構(gòu)成了現(xiàn)代軟件開發(fā)實踐的基礎(chǔ)。如果你是嵌入式開發(fā)人員,你可能聽說過這些實踐,但沒有時間采用它們并更新你的工作流。
今天是使用CI/CD和VS Code以及恩智浦SDK簡化開發(fā)系列文章的第一篇。你將了解為什么CI/CD至關(guān)重要以及如何設(shè)置Github操作隨著VS代碼擴(kuò)展的NXPs MCUXpresso。我們先看看基本的CI/CD概念,并了解它們對嵌入式軟件開發(fā)人員的價值。
CI/CD在嵌入式產(chǎn)品開發(fā)周期中的價值
在傳統(tǒng)的軟件開發(fā)中,開發(fā)人員和團(tuán)隊長時間隔離工作,偶爾會合并變更。結(jié)果是“合并地獄”,協(xié)調(diào)不同的代碼片段可能會花費(fèi)大量時間,并有可能在代碼中引入錯誤。孤立的開發(fā)不起作用,這就是CI/CD發(fā)揮作用的地方。
持續(xù)集成強(qiáng)調(diào)經(jīng)常集成來自不同團(tuán)隊成員的代碼。每個集成都是自動構(gòu)建、分析和測試的,以確保盡早發(fā)現(xiàn)集成缺陷。
持續(xù)部署/交付(CD)是CI的邏輯延伸。一旦你的代碼被集成和測試,它就會自動部署到生產(chǎn)環(huán)境中(持續(xù)部署)或為部署做好準(zhǔn)備(持續(xù)交付),從而減少手動干預(yù)并加快發(fā)布速度。
CI/CD有可能極大地改進(jìn)嵌入式軟件開發(fā)實踐。對于嵌入式開發(fā)人員來說,你會發(fā)現(xiàn)以下優(yōu)勢:
l 加快上市時間通過定期測試和隨時部署的代碼來減少總體開發(fā)時間。
l 質(zhì)量提高通過自動測試,可以減少錯誤并提高產(chǎn)品質(zhì)量。
l 增強(qiáng)協(xié)作這是因為當(dāng)團(tuán)隊朝著一個通用的、集成的代碼庫工作時,他們更好地保持了一致。
你可能認(rèn)為這些好處聽起來很棒,但是你正在編寫具有硬件依賴性的嵌入式軟件!嵌入式軟件不同,不太適合CI/CD!嗯,事實并非如此。你可以使用CI/CD管道輕松地將CI/CD應(yīng)用于嵌入式軟件開發(fā)。讓我們探索一下典型的嵌入式CI/CD管道可能是什么樣子的。
嵌入式CI/CD管道概述
CI/CD管道是將軟件從開發(fā)階段轉(zhuǎn)移到生產(chǎn)階段的過程。典型的CI/CD管道包括自動構(gòu)建、測試、分析和向最終用戶部署軟件。它是開發(fā)人員、QA和運(yùn)營人員用來改善不同團(tuán)隊之間的協(xié)作并獲得以下好處的工具:
l 提高軟件質(zhì)量
l 減少調(diào)試花費(fèi)的時間
l 降低項目成本
l 提高按時完成任務(wù)的能力
l 簡化軟件部署流程
CI/CD不應(yīng)被視為開發(fā)運(yùn)維流程中唯一必要的組成部分。它只是一個工具。例如,你可能會發(fā)現(xiàn)類似下面圖1的整體DevOps流程。如你所見,該流程規(guī)劃了開發(fā)新軟件功能、測試它們以及將它們部署到現(xiàn)場的交互。
圖1:嵌入式DevOps交付管道流程示例
圖1中隱藏的是CI/CD管道。典型的CI/CD管道包括三個簡單的活動:
l 建筑物
l 測試
l 部署
從概念上講,管道很簡單,但細(xì)節(jié)經(jīng)常讓開發(fā)人員感到困惑。例如,如果要列出構(gòu)成CI/CD管道的各種組件,將包括以下內(nèi)容:
l 倉庫–為構(gòu)建提取源代碼的位置。(可能一個或多個)。
l 自動化構(gòu)建系統(tǒng)–通常是可以自動構(gòu)建軟件的容器化系統(tǒng)。
l 自動化測試–包括單元、集成、系統(tǒng)和回歸測試。
l 靜態(tài)代碼分析–軟件分析,包括對照編碼標(biāo)準(zhǔn)、度量分析、語言正確性等進(jìn)行檢查
l 硬件仿真/模擬–使用虛擬硬件測試和驗證軟件的正確性。
l 部署機(jī)制–一種在產(chǎn)品成功通過所有自動測試和手動檢查后向產(chǎn)品交付新固件的方法。
l 監(jiān)測和報告–監(jiān)控進(jìn)度和報告軟件狀態(tài)以及可能需要調(diào)查的任何問題的機(jī)制。
l 證券分析–分析以識別安全漏洞并確保系統(tǒng)受到保護(hù)。(安全性可以進(jìn)行靜態(tài)分析,但我認(rèn)為值得單獨(dú)列出,因為它很容易被忽略)。
要實現(xiàn)這些功能,并對其進(jìn)行配置將是大量的工作。實施你自己的CI/CD解決方案需要深謀遠(yuǎn)慮和時間投入,但是該解決方案應(yīng)該是什么樣的呢?每個團(tuán)隊都有自己的需求,但所有CI/CD管道都有一些標(biāo)準(zhǔn)功能。讓我們來看看幾個領(lǐng)域,并為嵌入式開發(fā)人員定義一個通用的CI/CD管道。
定義典型的嵌入式管道
典型的嵌入式CI/CD管道將根據(jù)你團(tuán)隊的需求而變化。雖然你可以進(jìn)行大量定制,但第一輪CI/CD管道至少應(yīng)包含以下內(nèi)容:
l 建設(shè)–構(gòu)建作業(yè)將獲取你的固件并生成發(fā)布二進(jìn)制文件。
l 分析–分析構(gòu)建作業(yè)將靜態(tài)分析你的代碼。典型的分析將包括圈復(fù)雜度、代碼度量和代碼標(biāo)準(zhǔn)遵守情況,如樣式指南、MISRA和/或CERT。
l 測試–測試工作將執(zhí)行運(yùn)輸產(chǎn)品所需的所有測試。你可能包括單元、功能、集成、系統(tǒng)和性能測試。
l 報告–報告作業(yè)將從以前的作業(yè)中收集結(jié)果,以提供有關(guān)構(gòu)建成功、分析結(jié)果、測試覆蓋率和結(jié)果等信息。
l 合并–當(dāng)所有作業(yè)成功時,合并作業(yè)會將新功能合并到部署分支中。這里經(jīng)常有一個人為因素,但這也可以自動化。
l 部署–合并作業(yè)成功完成后,部署作業(yè)將運(yùn)行并啟動現(xiàn)場部署流程。部署通常與車隊部署軟件進(jìn)行交互,該軟件可以將固件推送到現(xiàn)場設(shè)備。
如果你將管道可視化,你會發(fā)現(xiàn)它如圖2所示。使用這種典型流程的開發(fā)人員會將代碼提交給他們的版本控制系統(tǒng)(VCS)并生成一個拉請求。一個自動構(gòu)建系統(tǒng),即CI服務(wù)器,會自動獲取最新的代碼并構(gòu)建軟件。此外,根據(jù)管道的設(shè)置方式,自動測試和分析將在構(gòu)建過程成功完成后進(jìn)行。如果測試成功通過,代碼將被部署到生產(chǎn)或試運(yùn)行環(huán)境中以供進(jìn)一步審查。
圖2:一個理想的CI/CD管道,結(jié)合了構(gòu)建和部署現(xiàn)代嵌入式軟件所需的基本工作。
行業(yè)工具:CI/CD工具集
當(dāng)你探索工具領(lǐng)域時,你會發(fā)現(xiàn)許多工具可幫助你構(gòu)建嵌入式CI/CD管道。這些工具從涵蓋CI/CD渠道一小部分的工具到完整的集成解決方案。最受歡迎的工具包括:
l 像Git這樣的版本控制系統(tǒng)
l 像Make和CMake這樣的構(gòu)建工具
l 像Jenkins、Travis CI和CircleCI的CI服務(wù)器
l 像Docker和Kubernetes這類能幫助一致地復(fù)制環(huán)境并支持管道作業(yè)執(zhí)行的集裝箱化工具。
除了這些工具之外,像GitHub和GitLab這樣的集成平臺將所有這些功能打包到一個解決方案中。你選擇的確切平臺或工具組合將取決于你和你團(tuán)隊的需求。
結(jié)論
盡管CI/CD通常與web和軟件應(yīng)用程序相關(guān)聯(lián),但它為嵌入式系統(tǒng)領(lǐng)域提供了不可否認(rèn)的優(yōu)勢。使用恩智浦SDK等平臺和VS Code等多功能ide可以徹底改變嵌入式開發(fā)人員的產(chǎn)品開發(fā)方式。