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