容器是一種不斷發(fā)展的標(biāo)準(zhǔn)化便攜式包裝技術(shù),今天,我們也看到它們在嵌入式行業(yè)中被采用。容器在軟件開發(fā)的任何階段為嵌入式開發(fā)、測試、登臺和生產(chǎn)提供了相同環(huán)境的快速復(fù)制,從而提高了整體生產(chǎn)力、代碼質(zhì)量、減少了勞動力、節(jié)約了成本等。
有了容器,組織及其供應(yīng)商發(fā)現(xiàn)了驚人的敏捷性、靈活性和可靠性。公司使用容器來:
l 縮短軟件開發(fā)上市時間。
l 提高代碼質(zhì)量興趣。
l 應(yīng)對管理日益復(fù)雜的發(fā)展生態(tài)系統(tǒng)的挑戰(zhàn)。
l 在快速和不斷發(fā)展的市場中動態(tài)地響應(yīng)軟件交付試驗。
容器技術(shù)
開放容器倡議(OCI)是一個Linux基金會項目,由多家公司于2015年成立,旨在圍繞容器格式和運行時創(chuàng)建一個開放的行業(yè)標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)允許兼容容器在所有主要操作系統(tǒng)、硬件、CPU架構(gòu)、公共/私有云等中無縫移植。
容器是與其他組件或依賴項(如二進(jìn)制文件或特定語言運行庫和配置文件)綁定的應(yīng)用程序。容器有自己的進(jìn)程、網(wǎng)絡(luò)接口和裝載。它們彼此隔離,并運行在“容器引擎”之上,便于攜帶和靈活。此外,容器共享一個操作系統(tǒng),它們可以在以下任何一個上運行。
l Linux、Windows和Mac操作系統(tǒng)
l 虛擬機或物理服務(wù)器
l 嵌入式開發(fā)人員的機器或本地數(shù)據(jù)中心
l 公共云
理解容器引擎的作用很重要,因為它提供了關(guān)鍵的功能,如:
操作系統(tǒng)級虛擬化。
容器運行時管理容器的生命周期(執(zhí)行、監(jiān)督、圖像傳輸、存儲和網(wǎng)絡(luò)附件)。
內(nèi)核命名空間來隔離資源。
還有各種容器引擎,包括:Docker、runC、CoreOS rkt、LXD、CRI-O、Podman、Containerd、微軟Hyper-V、LXC、谷歌容器引擎(GKE)、亞馬遜彈性容器服務(wù)(ECS)等等。
其他值得一提的概念是容器映像和容器編排。
容器映像是一個帶有可執(zhí)行代碼的靜態(tài)文件,包含了容器運行所需的一切。因此,容器是容器映像的運行實例。此外,在大型復(fù)雜部署中,容器化架構(gòu)中可能有許多容器。管理所有容器的生命周期變得尤為重要。
容器編排通過供應(yīng)、部署、擴(kuò)展或縮減等方式管理工作負(fù)載和服務(wù)。在嵌入式開發(fā)中,流行的容器編排解決方案有Kubernetes、Docker swarm和Marathon。
現(xiàn)在,讓我們考慮一下將應(yīng)用程序與所有依賴項打包在一起的靈活性所帶來的技術(shù)和業(yè)務(wù)收益,以便它們可以快速可靠地從一個計算環(huán)境運行到另一個環(huán)境。
技術(shù)和業(yè)務(wù)收益
嵌入式軟件系統(tǒng)的開發(fā)生態(tài)系統(tǒng)可能過于復(fù)雜。讓大型團(tuán)隊都在一個公共或相同的環(huán)境中工作會增加復(fù)雜性。例如,開發(fā)團(tuán)隊環(huán)境包括編譯器、SDK、庫、IDE,在某些情況下,還包括人工智能(AI)等現(xiàn)代技術(shù)。所有這些工具和解決方案都協(xié)同工作,它們的所有依賴項也是如此,加上不斷發(fā)展的發(fā)布版本,這些版本提供了對已發(fā)現(xiàn)的安全漏洞的修復(fù)、對已識別缺陷的修復(fù)、許可等等。
此外,組織應(yīng)該為開發(fā)、測試/驗證、生產(chǎn)以及可能的災(zāi)難恢復(fù)提供單獨的環(huán)境。有了容器,組織可以通過輕松地擴(kuò)大或縮小應(yīng)用程序依賴關(guān)系、將開發(fā)環(huán)境恢復(fù)到特定狀態(tài)以及根據(jù)需要推出容器映像來有效地管理所有這些復(fù)雜的開發(fā)環(huán)境,從而確保每個嵌入式開發(fā)團(tuán)隊成員都獲得一致的開發(fā)環(huán)境。今天,許多組織在每臺開發(fā)人員/測試人員機器上復(fù)制開發(fā)和測試環(huán)境,為人為錯誤留下了空間。
嵌入式部署策略
使用容器的軟件開發(fā)可以通過多種方式進(jìn)行配置和部署。組織可以根據(jù)使用的現(xiàn)有工具、期望的自動化水平和團(tuán)隊組織來決定和發(fā)展容器的使用。
策略可以是在開發(fā)人員的主機上使用一個公共容器來制作、構(gòu)建和運行他們的應(yīng)用程序。這確保了每個開發(fā)人員都使用完全相同的構(gòu)建工具集和版本以及運行環(huán)境。
許多嵌入式團(tuán)隊雇傭Jenkins、GitHub、Azure、GitLab和其他人進(jìn)行持續(xù)集成和持續(xù)交付(CI/CD)。在這個例子中有兩個容器。一個容器制作和構(gòu)建應(yīng)用程序,而另一個容器運行應(yīng)用程序。這有助于表達(dá)容器提供的靈活性。
組織也可能有圖形化分布的團(tuán)隊。擁有容器圖像庫有助于共享容器,并消除重復(fù)勞動。這通過將現(xiàn)有的容器用于不同的目的來提高效率。共享容器確保了整個開發(fā)供應(yīng)鏈的質(zhì)量。
CI/CD管道中的嵌入式測試自動化
在嵌入式開發(fā)中,容器也被用于DevOps工作流中的軟件測試。通過將容器化的測試解決方案集成到CI/CD管道中,組織可以執(zhí)行靜態(tài)分析,以確保符合MISRA C:2012、MISRA C++ 202x、AUTOSAR C++14、CERT、CWE、OWASP等標(biāo)準(zhǔn)。
像Parasoft C/C++test這樣的軟件測試自動化工具提供了一個可以在Docker Hub中找到的容器。此外,還可以執(zhí)行單元測試,包括語句的結(jié)構(gòu)代碼覆蓋、分支和/或修改的條件決策覆蓋(MC/DC)。然后,只有在成功完成測試之后,軟件才會被提交到主分支。
構(gòu)建過程中的容器化部署在代碼開發(fā)和代碼質(zhì)量方面產(chǎn)生了驚人的效率。讓多名工程師在這個快速、自動化的持續(xù)集成周期中并行工作,可以確保在整個產(chǎn)品生命周期中生成和維護(hù)一個堅實的軟件基礎(chǔ)。
結(jié)論
構(gòu)建嵌入式實時安全和安全關(guān)鍵系統(tǒng)的組織正在采用包含容器的DevOps工作流。其他公司正在采用集裝箱化戰(zhàn)略。那些已經(jīng)構(gòu)建了CI/CD管道并且已經(jīng)使用了幾年的公司報告說,他們已經(jīng)能夠更好地預(yù)測軟件的交付,并且容易地適應(yīng)需求和設(shè)計的變化。隨著生產(chǎn)率的提高和測試成本的降低,嵌入式開發(fā)團(tuán)隊報告了產(chǎn)品質(zhì)量和上市時間的提高。