一次開發,隨處部署
現代開發方法論快速發展,有代表性的包括Agile、SCRUM、CI/CD、DevOps等,其理念都是追求更快速度、更高質量地進行軟件開發工作。開發速度的衡量指標可以是推出新應用所需時間以及發現Bug之后發布更新版的時效等。質量指標則主要是代碼的信息安全性和功能安全性。當然也可能包含其他要求,這跟企業的目標密切相關?!耙淮伍_發,隨處部署”的目標是減少時間人力耗費,方法則是避免重復編寫功能相同的軟件代碼,并使其獨立于部署的目標硬件。
本文引用地址:http://www.j9360.com/article/202308/450015.htm
盡量減少開發工作量并確保結果可以運行在幾乎任何目標硬件,這種概念并不新鮮。“編寫一次,隨處運行”,這個概念早在1995年就形成了。Java就被用來創建跨平臺代碼。還有許多關于“一次構建、隨處部署”的探討,其思路是一樣的。
“一次構建”也代表著構建某種軟件并使其不再需要重復構建。在這種情況下,借助于容器之類的技術,可以幫助我們創建可以在許多系統上運行的微服務,并且不依賴任何外部庫。請注意,容器仍然對內核有依賴關系,而且這一點經常被忽略。
一次構建
為什么可以做到只需要構建一次?當今的開發人員不需要按下構建(Build )按鈕來將應用程序候選版本部署到目標環境中。我們有自動構建和測試自動化系統來管理這些工作。因此,只構建一次已不再復雜。
但是,“一次構建”存在一些根本性的問題。您不可能確保應用程序不需要升級或修復錯誤?即使您編寫的應用程序十分完美,它仍然取決于構建它的工具鏈以及動態或靜態鏈接的庫。如果編譯器中的錯誤致使應用程序不安全,將會發生什么后果?如果在庫中的錯誤致使應用程序不安全,又將會引發什么后果?庫通常又依賴于其他庫,這就使我們很難確定一個應用程序是完全沒有錯誤的。所以,您交付的軟件不可能是完美的,您幾乎肯定需要對應用程序進行更新。
一次開發
一次開發通常是要開發這樣一些東西——它可能是代碼、配置腳本或聲明性規范。應用場景即便有所不同,您也還是可以使用相同的開發工件來創建最佳交付軟件。
任何依賴項中的漏洞修復工作都有可能觸發重新構建。即使是配置中的一個很小的更改也可能觸發一個中等規模的漏洞。
Yocto Project是一個Linux Distribution Builder(分發構建器),這是一個很好的工具,可以在不定義如何部署及其環境的情況下進行代碼開發工作。開發人員用一個或多個配方(Recipe)來定義他/她自己的層(layer)。配方(Recipe)包含構建工件所需的全部信息?,F在,開發人員應該編寫盡可能好的代碼,以避免以后需要重寫。
有很多種方法可以用來避免重寫代碼。一個關鍵因素是編寫的代碼盡可能少——沒有代碼就沒有漏洞。有一種思路是確保代碼的高度模塊化,其中每個部分都只設定單一目標。這段代碼針對其功能進行優化,并對代碼量做出限制。
編程語言也可以幫助您避免代碼重寫。用高級聲明式語言(Declarative Language)編寫代碼可以減少代碼量。庫和工具負責把編程代碼解析為機器代碼。即便在源代碼中不存在Bug,但是在依賴項中仍然可能存在。另一種解決方案是使用一種內存安全的語言,比如Rust,它可以幫助您確保應用程序是內存安全的。
隨處部署
隨處部署意思是應用程序可以部署到任何地方。請注意,“任何地方”的含義可能有些不確定,具體取決于您的視角。有些人認為“任何地方”是指運行Linux的經典x86系統。但更廣泛的觀點是指任何硬件架構以及任何規模的系統,從大型服務器到小型嵌入式設備。
Yocto支持多種架構(如Power PC、ARM和x86)的跨架構構建。在這些主流體系架構中,對不同的指令集和硬件偏移(Hardware Skews)有著豐富的支持。應用程序開發人員不需要關心細節,因為它們是由構建系統來管理的。構建系統將為每個體系架構生成一個工件。工件、應用程序和依賴項都針對您的特定目標進行了優化。
有許多工具可用于創建工件,但它們通常依賴于預構建的映像和庫,這些映像和庫是為大多數特定類型的硬件而構建的。與Yocto不同,其結果沒有針對特定硬件的功能進行優化。
Yocto構建系統把應用程序構建從可部署構件的打包和創建工作中分離出來。構建系統創建deb、rpm或ipm包,這些包可以直接部署,也可以通過其他介質部署。構建系統可以生成幾種映像類型、SDK、系統容器或應用程序容器。Yocto包含標準配方(Recipe),您可以編寫自己的配方以便創建新的部署類型。其結果可被部署到任何硬件之上,從只運行精簡Linux安裝的小型ARM嵌入式設備到云環境中成熟的Kubernetes系統。
總結
開發軟件是一項艱巨的工作。通過編寫高水平的應用程序并將構建、打包和部署等工作交給工具去做,您可以提升敏捷性和速度。Yocto可以把最終工件的開發和創建分離開來,從而幫助開發人員實現這一目標,其工件針對獨立于體系結構的特定部署進行了優化。于是開發人員可以專注于應用程序的開發,而不必分心費力去開發最終工件。
評論