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