“一切都自動化”是持續(xù)交付部署流水線的一種重要原則颅痊,也是提升“持續(xù)交付驗證環(huán)”運轉(zhuǎn)速度的一個重要影響因素夫否,軟件配置管理是成為“一切自動化”的基石彻犁。
將一切納入配置管理
軟件配置管理:在整個軟件生命周期中,對生產(chǎn)與運行環(huán)節(jié)中相關(guān)產(chǎn)物的管理凰慈,包括產(chǎn)物自身及其唯一標識和修訂歷史汞幢,以及不同產(chǎn)物之間的關(guān)聯(lián)關(guān)系等。其目標是記錄并管理軟件產(chǎn)品演化的過程微谓,確保組織在軟件生命周期中的各個階段都能得到精確的產(chǎn)品配置森篷,并提升各角色間的協(xié)作效率。
配置管理的目標
獲得可追溯性和可重現(xiàn)性豺型,提升軟件整個生命周期管理的安全性仲智,并提高團隊協(xié)作效率。
- 可追溯性:任何在獲得授權(quán)的前提下触创,能夠找到該軟件的任何變更歷史
- 可重現(xiàn)性:任何人在獲得授權(quán)的前提下坎藐,能夠重現(xiàn)從過去到現(xiàn)在之間任意時間點的軟件狀態(tài)。
配置管理的范圍
在軟件的整個生命周期中哼绑,包括四類制品岩馍,即需求、源代碼抖韩、軟件包和環(huán)節(jié)蛀恩,這些事軟件配置管理的范圍。
軟件配置的管理原則
一切皆有版本
如果想要更快地發(fā)布軟件茂浮,僅僅對軟件的源代碼和發(fā)布上線的軟件包進行版本管理是不夠的双谆,這種程度并不充分也不全面,還需要包括:
- 操作系統(tǒng)層:操作系統(tǒng)席揽、網(wǎng)絡(luò)配置以及網(wǎng)絡(luò)及系統(tǒng)通用管理服務(wù)顽馋;
- 標準軟件層:應(yīng)用程序所依賴的標準化軟件包,以獨立進程形式運行幌羞,并為上層的應(yīng)用程序提供基礎(chǔ)服務(wù)寸谜,如數(shù)據(jù)存儲、消息通訊属桦、網(wǎng)絡(luò)服務(wù)熊痴、數(shù)據(jù)庫軟件(MySQL他爸、Redis等)、消息中間件(RabbitMQ等)果善、ZooKepper等诊笤;
-
應(yīng)用軟件層:團隊開發(fā)的應(yīng)用層序,以及該應(yīng)用程序運行時所依賴的第三方組件庫及相關(guān)數(shù)據(jù)巾陕。
持續(xù)交付中的版本管理內(nèi)容
共享唯一受信源
唯一受信源使得團隊成員能夠掌握任意時刻的軟件狀態(tài)讨跟,并確保所有人所獲得的信息都是一致的,其中包括三種數(shù)據(jù)惜论,即業(yè)務(wù)需求/缺陷许赃、源代碼和軟件包。
- 需求倉庫:保存有關(guān)產(chǎn)品的所有版本需求描述和驗收條件馆类,并且能夠記錄每一次團隊對需求達成共識后的版本變更記錄;
- 代碼倉庫:保存所有源代的變更歷史弹谁,除了源代碼乾巧,還包括軟件包整個生命周期中的所有以代碼形式存在的內(nèi)容,如測試代碼预愤、自動化腳本以及環(huán)境配置信息沟于、軟件包構(gòu)建依賴信息等;
- 軟件包倉庫:自動保存部署流水線生產(chǎn)加工出來的軟件包植康,滿足后續(xù)環(huán)節(jié)的快速取用旷太,包括三種倉庫:
- 臨時產(chǎn)物倉庫:作為團隊內(nèi)部在某個發(fā)布版本處于開發(fā)期間進行協(xié)作溝通的唯一的軟件包受信源,避免因環(huán)境不一致或重復打包等問題引入不必要的風險和浪費销睁;
- 正式發(fā)布倉庫:保存通過質(zhì)量驗證供璧,即將上線或者已經(jīng)上線的所有軟件包,通過在受控管理系統(tǒng)上通過人工標記和自動傳遞方式冻记,將經(jīng)過驗證達標的軟件包從臨時倉庫移到正式發(fā)布包倉庫睡毒;
- 外部軟件包倉庫:第三方軟件庫的私有服務(wù)器,用于存儲內(nèi)部所有軟件所需引用冗栗、包含或使用的外部第三方受信軟件包演顾。
標準化與自動化
基線管理:所有倉庫在某一個時刻的“快照”,在創(chuàng)建基線時隅居,對倉庫中的當前版本一個整體標記或復制钠至,以整體記錄此階段的成果。
軟件包的版本管理
集中式包管理服務(wù)
建立企業(yè)級的統(tǒng)一軟件包庫管理系統(tǒng)胎源,將所有軟件包納入其中棉钧,并且對企業(yè)內(nèi)部團隊提供穩(wěn)定的查詢、獲取和申請等服務(wù)乒融。企業(yè)既可以自己開發(fā)這樣的庫管理系統(tǒng)掰盘,也可以使用開源或商業(yè)的包管理軟件摄悯,比如Nexus和Artifactory等。其優(yōu)點在于:
- 統(tǒng)一存儲愧捕,空間占用少奢驯;
- 一致性。全公司使用統(tǒng)一的副本次绘,是所有軟件包的唯一來源瘪阁;
- 安全省心∮寿耍可以對軟件包進行統(tǒng)一的安全掃描管跺、法律審計管理。
- 下載速度快禾进。
軟件包的元信息
需要為每個軟件包設(shè)置一些信息來描述和定義軟件包倉庫中的每一個軟件包豁跑,以便于互相引用、溯源和檢索泻云。需要包括如下信息:
- 唯一標識信息
- 來源信息艇拍,如由誰提供、源代碼在哪里宠纯、現(xiàn)在的狀態(tài)如何等
- 依賴信息卸夕,是否引用了其他軟件包
包依賴管理
軟件包之間的依賴關(guān)系具有“重用”和“便捷性”兩大特點,為了做好包依賴管理婆瓜,需要從顯示聲明依賴快集、自動管理依賴和減少復雜依賴這三個方面入手。
- 顯示聲明依賴:將應(yīng)用程序在不同環(huán)境中所需的軟件包以及相應(yīng)的版本信息廉白,通過事先約定的描述方式記錄在文檔中个初。大多數(shù)的編程語言都有與其對應(yīng)的軟件包構(gòu)建管理工具,比如Maven和Gradle等蒙秒;
- 自動管理依賴:在顯示聲明對軟件包的依賴之后勃黍,當構(gòu)建、測試或部署軟件時晕讲,只要有工具能夠識別依賴描述文件覆获,即可自動從軟件包倉庫下載和更新依賴軟件包;
- 減少復雜依賴:軟件包倉庫需要額外提供一種能力瓢省,可以檢查每個軟件包的依賴關(guān)系弄息,發(fā)現(xiàn)其中的依賴問題、風險與隱患勤婚,比如依賴過多摹量、鏈條過長、依賴沖突和循環(huán)依賴等。
環(huán)境基礎(chǔ)設(shè)施管理
環(huán)境基礎(chǔ)設(shè)施:包括基礎(chǔ)操作系統(tǒng)層和標準應(yīng)用層缨称,它們是軟件運行的基礎(chǔ)上下文凝果,具有變更頻率低的特點。
環(huán)境準備的四種狀態(tài)
隨著業(yè)務(wù)的升級和基礎(chǔ)設(shè)施技術(shù)的不斷發(fā)展睦尽,環(huán)境準備工作內(nèi)容和工作方式也不斷變化器净,可分為四種狀態(tài):
- 以人腦+手工為代表的蠻荒狀態(tài):軟件較簡單、用戶數(shù)量不多時当凡,由開發(fā)人員自己搞定所有與軟件部署相關(guān)的問題山害;
- 以文檔+私有腳本為代表的規(guī)范化狀態(tài):在上線前提供上線部署文檔和規(guī)范化的上線部署流程,由運維人員來負責版本的變更沿量;
- 以辦公自動化為代表的標準化狀態(tài):開始搭建自動化平臺浪慌,將上線部署文檔和流程在web頁面上提交,運維人員按照步驟手工執(zhí)行朴则;
- 以受控式自動化腳本為代表的自動化狀態(tài):自動化平臺管理自動化腳本权纤,包括兩種腳本:
- 過程式腳本:最傳統(tǒng)的自動化腳本,通過模擬手工執(zhí)行步驟的自動化命令佛掖,缺點在于妖碉,不是冪等操作,每次執(zhí)行的結(jié)果可能不一致芥被;
- 狀態(tài)聲明式腳本:在腳本中指定環(huán)境的目標狀態(tài),由定義該狀態(tài)申明規(guī)范的平臺執(zhí)行這個腳本坐榆,該操作是冪等的拴魄。目前主流的狀態(tài)聲明式工具有,Puppet席镀、Chef匹中、Ansible和SaltStack等。
環(huán)境基礎(chǔ)設(shè)施即代碼
將環(huán)境基礎(chǔ)搭建的一系列準備工作以腳本的方式描述出來豪诲,并能夠通過自動化的方式來執(zhí)行這些腳本顶捷,即環(huán)境基礎(chǔ)設(shè)施即代碼,好處在于:
- 無論哪類環(huán)境出了問題屎篱,都可以快速自動化地構(gòu)建出一個全新的環(huán)境服赎;
- 只要獲得授權(quán),任何人都可完成這項任務(wù)交播,不需要其他人幫助重虑;
- 任何對環(huán)境的修改都可以被記錄和審計;
- 對不同環(huán)境來說秦士,只要將其代碼描述進行對比缺厉,就可以了解它們的差異而無需登錄到實際主機上查看。
軟件配置項的管理
軟件配置項:軟件構(gòu)建時或運行于不同環(huán)境中時,通過設(shè)定這些配置項所對應(yīng)的不同具體值提针,軟件能夠產(chǎn)生不同的行為命爬。
二進制與配置項的分離
一個軟件包通常由二進制文件與配置項組成,對其中任何配置項的修改辐脖,都會形成由二進制文件和新的配置項集合構(gòu)成的新的二元組饲宛,成為一個新的部署包。將兩者分離揖曾,從而實現(xiàn)只需要構(gòu)建一次落萎,在部署流水線的不同階段就可以重復使用的目的,從而確保在不同階段所驗證使用的二進制文件是完全相同的炭剪,只是由于運行環(huán)境的不同而使用取值不同的配置項练链。
配置信息的分類
根據(jù)配置項的內(nèi)容不同,可分為三類:
- 環(huán)境配置項:與運行環(huán)境相關(guān)奴拦,比如所用到的域名或IP地址媒鼓,與其他系統(tǒng)或服務(wù)通信的服務(wù)地址與端口號;
- 應(yīng)用配置項:與信息安全控制及應(yīng)用程序自身相關(guān)错妖,比如賬號密碼绿鸣、數(shù)據(jù)庫連接池大小、初始分配內(nèi)存大小暂氯、日志級別等潮模;
- 業(yè)務(wù)配置項:與應(yīng)用程序所執(zhí)行的業(yè)務(wù)行為相關(guān),每一配置項都有默認值痴施,如功能特性開關(guān)擎厢,商品定價策略等。
配置漂移與治理
配置漂移:隨時間發(fā)展辣吃,由于各種未預期原因而做出的配置修改引起計算機或軟件服務(wù)偏離了我們所希望的配置狀態(tài)动遭,通常是由于人的臨時修改而引起,也可能是為了緩解生產(chǎn)環(huán)境突然出現(xiàn)的某個嚴重問題而臨時調(diào)整了某些機器的網(wǎng)絡(luò)配置神得;配置漂移往往使得生產(chǎn)環(huán)境處于某種不確定的狀態(tài)厘惦,甚至會導致重大生產(chǎn)事故。
配置漂移治理:構(gòu)建好的軟件配置管理流程哩簿,比如宵蕉,將靜態(tài)配置放入版本控制庫中,并禁止直接登錄到主機環(huán)境修改配置信息卡骂,只能提交修改到代碼倉庫国裳,并通過自動化方式進行生產(chǎn)環(huán)境中配置的修改,避免由于人為操作遺漏造成的配置漂移全跨;還有一種更為嚴格的方式缝左,就是“不可變基礎(chǔ)設(shè)施”。
不可變設(shè)施
不可變基礎(chǔ)設(shè)施要求,需要對其中任何一層進行變更時渺杉,只能通過整體替換的方式進行蛇数,而不能通過對其中某一層的內(nèi)容直接進行更新或修改的方式進行,需要具備三個要求:
- 系統(tǒng)運行環(huán)境的準備均已自動化方式完成
- 一旦完成準備工作是越,該基礎(chǔ)設(shè)施的任何一個層次均不得更改
- 如果因為某種原因需要對該系統(tǒng)環(huán)境進行更改耳舅,則必須使用另一個不可變系統(tǒng)環(huán)境來替代之,而不是對原系統(tǒng)環(huán)境進行變更倚评。
實現(xiàn)不可變基礎(chǔ)設(shè)施
- 物理機鏡像技術(shù)和虛擬機鏡像技術(shù):使用鏡像工具(如Full Automatic Installer, SystemImager和ISO鏡像工具)對已經(jīng)安裝好應(yīng)用程序運行環(huán)境進行鏡像備份浦徊,并將鏡像文件保存到統(tǒng)一的鏡像倉庫中,可以直接拉取鏡像直接部署到宿主機上天梧,進行簡單配置調(diào)整后立即投入使用盔性。
- Docker容器技術(shù):更輕量級的容器技術(shù),它比物理機鏡像和虛擬機鏡像具有更低的成本呢岗。
優(yōu)勢
- 簡化運維工作:可以全自動完成
- 部署流程自文檔:只需要創(chuàng)建一個描述性文本文件說明如何正確生成應(yīng)用程序的運行鏡像即可冕香,不需要詳細的部署應(yīng)用程序的自動化步驟。
- 持續(xù)部署不停機后豫,故障更少:所有變更都可以由源代碼管理悉尾,通過部署流水線進行跟蹤,基礎(chǔ)設(shè)施的每一項均可以以腳本形式進行挫酿,將準備好的不可變基礎(chǔ)設(shè)施直接進行替換
- 減少錯誤和威脅:通過自動化替換而不是修復构眯,可以更頻繁且規(guī)律性地重新生成實例,減少配置漂移早龟。
- 多個環(huán)境基礎(chǔ)設(shè)施的一致性:虛擬化和容器化技術(shù)使得開發(fā)和測試環(huán)節(jié)就能夠以更廉價的方式得到與生產(chǎn)環(huán)境類似的環(huán)境基礎(chǔ)設(shè)施鸵赖,并對其進行驗證,從而減少因測試環(huán)境與生產(chǎn)環(huán)境過多的差異而導致的生產(chǎn)問題拄衰。
- 杜絕了配置漂移:整個不可變基礎(chǔ)設(shè)施被作為一個整體使用,若需要對其中任何信息進行修改饵骨,都要重新生成鏡像翘悉。
- 被測試的即是被使用的:一旦對代碼或配置修改完成,就會立即生成不可變的基礎(chǔ)鏡像居触,經(jīng)過整個部署流水線的驗證妖混,可以確保生產(chǎn)環(huán)境使用的一定就是被驗證的。
挑戰(zhàn)
- 為不可變基礎(chǔ)設(shè)施建立一套自動化運維體系在初期需要較高的成本轮洋;
- 生產(chǎn)環(huán)境中突發(fā)問題的修復時間可能會稍長制市,因為禁止直接通過SSH連接到當前有問題的服務(wù)器,只能通過重新生成鏡像再部署上線弊予;
- 對大規(guī)模軟件服務(wù)來說祥楣,將大尺寸鏡像分發(fā)到多臺宿主機上需要耗費大量的網(wǎng)絡(luò)資源,時間耗費也會不少;
- 有狀態(tài)存儲的軟件服務(wù)并不容易被直接替換误褪,比如數(shù)據(jù)庫實例责鳍,擁有大量的數(shù)據(jù)量。