DevOps核心原則-穩(wěn)定的工作流程
如果讓三個人描述DevOps,您將得到四個不同的答案。有時,從事運(yùn)營工作的開發(fā)人員被稱為DevOps。其他人則說這與基礎(chǔ)架構(gòu)和部署的自動化有關(guān)。有時,您可以看到DevOps是sysadmins的現(xiàn)代化標(biāo)簽。我們可以看到該術(shù)語很流行。那到底是什么呢?什么是DevOps?
DevOps的第一種方式是通過組織中各個職能領(lǐng)域(從收集需求到生產(chǎn)中的軟件運(yùn)維)創(chuàng)建平衡穩(wěn)定的工作流程。重點(diǎn)放在整個系統(tǒng)的全局目標(biāo)上,而不是單個部門的局部目標(biāo)上。為了使概念更清晰,讓我們看幾個關(guān)鍵要點(diǎn)。
1.1減少批次大小
進(jìn)行中(WIP)是已開始但尚未完成的工作量。大量在制品是多任務(wù)處理的標(biāo)志,并且會阻礙工作流程。為了限制在制品,我們應(yīng)該減小批量大小。這個想法源于精益制造。大批量生產(chǎn)零件在制造業(yè)中很常見。設(shè)置新機(jī)器并在工作之間切換既昂貴又費(fèi)時。因此,在設(shè)置好機(jī)械之后,盡可能多地制造零件被認(rèn)為是可行的。
例如,一家汽車生產(chǎn)廠將生產(chǎn)大量的車身面板以減少轉(zhuǎn)換次數(shù)。但是,這會產(chǎn)生大量的WIP。工作流程的可變性在整個制造工廠中級聯(lián),從而導(dǎo)致更長的交貨時間。想象一下,如果在組裝汽車時在車身面板上發(fā)現(xiàn)缺陷,會發(fā)生什么?最有可能的是,整個批次必須被丟棄和再生產(chǎn)。批量生產(chǎn)會延遲反饋,如果出現(xiàn)錯誤,則必須重做更多工作。
同樣的想法適用于軟件開發(fā)。但是,我們正在處理代碼,而不是機(jī)械和車身面板。對版本控制的每次提交都會增加軟件開發(fā)價值流中的批處理大小。
一個典型的例子是年度生產(chǎn)部署計劃。如果每年進(jìn)行一次部署,則批處理量很大。一步就可以部署一年。與汽車廠類似,如果出現(xiàn)任何問題,則必須將整個批次回退。然后必須付出更多的努力來重做被認(rèn)為已完成的工作。而且要發(fā)現(xiàn)并解決導(dǎo)致部署失敗的問題,例如6個月前,就具有挑戰(zhàn)性。
使用壽命較長的特性分支時,可能會遇到類似的問題。分支保持隔離狀態(tài)的時間越長,看到的更改越多,批處理大小就越大。隨著時間的流逝,將其集成回主干變得越來越困難。合并沖突的可能性很高。由于反饋被延遲,因此返工的可能性很高。這些因素破壞了工作流程并增加了部署前置時間。
為了縮短部署的交付時間,我們必須減小批量大小。不建議使用長期存在的功能分支。如果我們盡早集成并且以較小的增量部署軟件,則可以獲得更快的反饋。如果我們繼續(xù)減小批處理的大小,我們最終將達(dá)到單件流,其中每次提交都會流經(jīng)整個軟件開發(fā)價值流。一旦所有自動檢查都通過,更改將最終投入生產(chǎn)。
能夠?qū)崿F(xiàn)這一目標(biāo)的團(tuán)隊將利用基于主干的開發(fā),持續(xù)集成,持續(xù)交付和持續(xù)部署等實踐。他們在測試自動化方面進(jìn)行了投資,并為低風(fēng)險版本設(shè)計了他們的軟件。他們還組織了自己,以使所需的移交次數(shù)最小化。交接需要溝通和協(xié)調(diào)。不幸的是,即使在最好的情況下,一些知識也會丟失。這是一個潛在的錯誤點(diǎn),錯誤可能蔓延,工作可能堆積起來,從而中斷流程并增加部署提前期。
1.2消除約束
不斷發(fā)現(xiàn)和消除我們工作中的限制是提高產(chǎn)量和減少交貨時間的關(guān)鍵。Goldratt博士在《超越目標(biāo):約束理論》中指出
在任何價值流中,總是有一種流動的方向,并且總是只有一個約束。在這種約束下沒有做的任何改進(jìn)都是一種幻想。
技術(shù)價值流的一個例子是環(huán)境創(chuàng)造。如果建立測試環(huán)境需要花費(fèi)數(shù)小時,那么在價值流中進(jìn)行的任何改進(jìn)工作都是一種幻想。
例如,如果我們將構(gòu)建時間從10分鐘減少到3分鐘,則構(gòu)建速度會更快。但是總體上沒有什么事情做得更快。創(chuàng)建環(huán)境仍然是一個障礙。更糟糕的是,WIP增加了?,F(xiàn)在,新版本的堆積速度甚至更快,等待部署到測試環(huán)境。由于創(chuàng)建環(huán)境會阻止新的工作順利進(jìn)行,因此在我們應(yīng)該在價值流中找到約束,將其消除,然后找到下一個約束。