交付是什么:CI/CD實(shí)踐指南)
持續(xù)交付是指團(tuán)隊(duì)能夠快速、安全、可持續(xù)地按需發(fā)布各類變更。對(duì)于希望提升 CI/CD 能力、優(yōu)化軟件交付流程、降低發(fā)布風(fēng)險(xiǎn)的團(tuán)隊(duì)來(lái)說(shuō)持續(xù)交付不是簡(jiǎn)單地“更頻繁發(fā)布”而是讓軟件始終保持可部署狀態(tài)。實(shí)踐持續(xù)交付的團(tuán)隊(duì)可以隨時(shí)以低風(fēng)險(xiǎn)方式發(fā)布軟件并對(duì)生產(chǎn)環(huán)境進(jìn)行變更包括在正常工作時(shí)間內(nèi)完成發(fā)布而不會(huì)影響用戶。持續(xù)交付的原則和實(shí)踐適用于各種軟件場(chǎng)景包括在復(fù)雜分布式系統(tǒng)中更新服務(wù)升級(jí)大型機(jī)軟件修改基礎(chǔ)設(shè)施配置變更數(shù)據(jù)庫(kù)架構(gòu)自動(dòng)更新固件發(fā)布移動(dòng)應(yīng)用的新版本。當(dāng)團(tuán)隊(duì)真正實(shí)踐持續(xù)交付時(shí)應(yīng)該能夠?qū)σ韵聠?wèn)題回答“是”我們的軟件在整個(gè)生命周期內(nèi)是否始終處于可部署狀態(tài)相比開(kāi)發(fā)新功能我們是否會(huì)優(yōu)先保證軟件的可部署性團(tuán)隊(duì)中的每個(gè)人是否都能快速獲得關(guān)于系統(tǒng)質(zhì)量和可部署性的反饋當(dāng)我們收到系統(tǒng)無(wú)法部署的反饋例如構(gòu)建失敗或測(cè)試失敗時(shí)是否會(huì)把解決這些問(wèn)題作為首要任務(wù)我們是否能夠隨時(shí)按需將系統(tǒng)部署到生產(chǎn)環(huán)境或交付給最終用戶持續(xù)交付與持續(xù)部署的區(qū)別持續(xù)交付經(jīng)常與持續(xù)部署混淆但二者是不同的實(shí)踐。持續(xù)部署是指團(tuán)隊(duì)盡可能快地將每一次代碼變更部署到生產(chǎn)環(huán)境。持續(xù)部署適用于 Web 服務(wù)但并不適用于固件、移動(dòng)應(yīng)用等所有軟件類型。持續(xù)交付則適用于所有類型的軟件包括固件、大型機(jī)系統(tǒng)以及高度監(jiān)管的環(huán)境。即使團(tuán)隊(duì)從未打算采用持續(xù)部署也可以而且應(yīng)該從持續(xù)交付開(kāi)始。持續(xù)交付和持續(xù)部署常常被誤認(rèn)為風(fēng)險(xiǎn)較高不適用于受監(jiān)管或安全要求極高的領(lǐng)域。事實(shí)上持續(xù)交付的目標(biāo)恰恰是降低軟件風(fēng)險(xiǎn)。DORA 的研究也持續(xù)表明高績(jī)效團(tuán)隊(duì)通常能夠?qū)崿F(xiàn)更高的可靠性和可用性。推動(dòng)持續(xù)交付的技術(shù)實(shí)踐例如持續(xù)測(cè)試、安全左移、全面測(cè)試和可觀測(cè)性在高度監(jiān)管和安全關(guān)鍵領(lǐng)域尤其重要。持續(xù)交付已經(jīng)在金融服務(wù)、政府等高度監(jiān)管領(lǐng)域多次成功落地。持續(xù)交付能帶來(lái)哪些價(jià)值盡管持續(xù)交付適用于各種軟件類型但它并不容易實(shí)現(xiàn)。不過(guò)它能帶來(lái)顯著收益。DORA 的研究表明做好持續(xù)交付可以帶來(lái)以下好處提升軟件交付績(jī)效和可用性這可以通過(guò)四個(gè)關(guān)鍵指標(biāo)進(jìn)行衡量提升質(zhì)量水平具體可以通過(guò)團(tuán)隊(duì)花在返工或計(jì)劃外工作上的時(shí)間占比來(lái)衡量降低職業(yè)倦怠水平提升工作滿意度并改善組織文化減少部署痛苦也就是降低部署過(guò)程中的破壞性、壓力感以及工程師和技術(shù)人員在將代碼推送到生產(chǎn)環(huán)境時(shí)感受到的恐懼和焦慮影響企業(yè)文化提升心理安全感并形成更具使命感的組織文化。持續(xù)交付只是實(shí)現(xiàn)上述成果的關(guān)鍵組成部分之一雖然它非常重要。DORA 研究中提到的其他文化能力和組織能力也會(huì)共同影響這些結(jié)果。團(tuán)隊(duì)可以通過(guò)實(shí)施本文所描述的技術(shù)實(shí)踐逐步實(shí)現(xiàn)持續(xù)交付。如何實(shí)施持續(xù)交付DORA 的研究發(fā)現(xiàn)以下技術(shù)能力是實(shí)現(xiàn)持續(xù)交付的關(guān)鍵驅(qū)動(dòng)因素。組織內(nèi)部的變革型領(lǐng)導(dǎo)力也會(huì)推動(dòng)這些技術(shù)能力的落地。為了幫助團(tuán)隊(duì)實(shí)現(xiàn)更高吞吐量和更低風(fēng)險(xiǎn)的發(fā)布可以重點(diǎn)實(shí)施以下持續(xù)交付實(shí)踐。測(cè)試自動(dòng)化。指使用一套綜合性的自動(dòng)化測(cè)試套件這些測(cè)試主要由開(kāi)發(fā)人員創(chuàng)建和維護(hù)。有效的測(cè)試套件應(yīng)該是可靠的也就是說(shuō)測(cè)試能夠發(fā)現(xiàn)真實(shí)故障并且只有可發(fā)布代碼才能通過(guò)測(cè)試。部署自動(dòng)化。指部署流程在多大程度上實(shí)現(xiàn)了完全自動(dòng)化并且不需要人工干預(yù)?;谥鞲傻拈_(kāi)發(fā)。其特征包括代碼庫(kù)中的活躍分支少于三個(gè)分支和 fork 分支的生命周期非常短例如不超過(guò)一天隨后就會(huì)合并回主線應(yīng)用團(tuán)隊(duì)很少或幾乎沒(méi)有代碼鎖定期也就是不會(huì)因?yàn)楹喜_突、代碼凍結(jié)或穩(wěn)定階段而禁止提交代碼或發(fā)起拉取請(qǐng)求。安全左移。指將安全融入軟件開(kāi)發(fā)過(guò)程的設(shè)計(jì)和測(cè)試階段。具體做法包括對(duì)應(yīng)用進(jìn)行安全評(píng)審讓信息安全團(tuán)隊(duì)參與應(yīng)用設(shè)計(jì)和演示過(guò)程使用預(yù)先批準(zhǔn)的安全庫(kù)和軟件包并將安全功能納入自動(dòng)化測(cè)試套件。松耦合團(tuán)隊(duì)。指一種組織結(jié)構(gòu)使團(tuán)隊(duì)能夠按需測(cè)試和部署應(yīng)用而不需要與其他服務(wù)或團(tuán)隊(duì)進(jìn)行復(fù)雜協(xié)調(diào)。團(tuán)隊(duì)結(jié)構(gòu)和技術(shù)架構(gòu)高度相關(guān)松耦合架構(gòu)能夠讓團(tuán)隊(duì)獨(dú)立工作減少對(duì)其他團(tuán)隊(duì)支持和服務(wù)的依賴從而提升效率并為組織創(chuàng)造價(jià)值。DORA 研究顯示松耦合架構(gòu)是持續(xù)交付成功的重要預(yù)測(cè)因素之一達(dá)到可靠性目標(biāo)的高績(jī)效團(tuán)隊(duì)采用這類架構(gòu)的可能性明顯高于低績(jī)效團(tuán)隊(duì)。賦予團(tuán)隊(duì)選擇工具的權(quán)力。能夠自主選擇工具的團(tuán)隊(duì)在持續(xù)交付方面往往表現(xiàn)更好。沒(méi)有人比一線實(shí)踐者更清楚自己需要哪些工具才能高效完成工作。持續(xù)集成。持續(xù)集成是一種開(kāi)發(fā)實(shí)踐要求團(tuán)隊(duì)定期提交代碼每次提交都會(huì)觸發(fā)一組快速測(cè)試以發(fā)現(xiàn)回歸問(wèn)題開(kāi)發(fā)人員也會(huì)立即修復(fù)這些問(wèn)題。CI 流程會(huì)生成標(biāo)準(zhǔn)化構(gòu)建產(chǎn)物和軟件包供后續(xù)部署和發(fā)布使用。持續(xù)測(cè)試。指測(cè)試貫穿整個(gè)軟件交付生命周期而不是在開(kāi)發(fā)完成后才進(jìn)入一個(gè)獨(dú)立測(cè)試階段。通過(guò)持續(xù)測(cè)試開(kāi)發(fā)人員和測(cè)試人員可以并肩工作。優(yōu)秀開(kāi)發(fā)人員通常會(huì)實(shí)踐測(cè)試驅(qū)動(dòng)開(kāi)發(fā)在十分鐘內(nèi)獲得測(cè)試反饋并持續(xù)審查和改進(jìn)測(cè)試套件例如提升缺陷發(fā)現(xiàn)能力并控制測(cè)試復(fù)雜度。版本控制。指使用版本控制系統(tǒng)管理所有生產(chǎn)工件包括應(yīng)用代碼、應(yīng)用配置、系統(tǒng)配置以及用于自動(dòng)化構(gòu)建和環(huán)境配置的腳本。測(cè)試數(shù)據(jù)管理。有效的測(cè)試數(shù)據(jù)管理實(shí)踐包括擁有足夠的測(cè)試數(shù)據(jù)來(lái)運(yùn)行測(cè)試套件能夠按需獲取所需數(shù)據(jù)數(shù)據(jù)量不會(huì)限制測(cè)試運(yùn)行數(shù)量。我們建議團(tuán)隊(duì)盡可能減少運(yùn)行自動(dòng)化測(cè)試所需的測(cè)試數(shù)據(jù)量。全面監(jiān)控和可觀測(cè)性。指讓團(tuán)隊(duì)能夠理解系統(tǒng)運(yùn)行狀況。有效的監(jiān)控與可觀測(cè)性方案可以幫助團(tuán)隊(duì)監(jiān)控預(yù)先定義的指標(biāo)包括用戶實(shí)際體驗(yàn)到的系統(tǒng)狀態(tài)同時(shí)也允許工程師以交互方式調(diào)試系統(tǒng)探索系統(tǒng)屬性和運(yùn)行中涌現(xiàn)出的模式。主動(dòng)通知。指持續(xù)監(jiān)控系統(tǒng)運(yùn)行狀況使團(tuán)隊(duì)能夠提前發(fā)現(xiàn)并緩解問(wèn)題。數(shù)據(jù)庫(kù)變更管理。如果團(tuán)隊(duì)遵循一些關(guān)鍵實(shí)踐數(shù)據(jù)庫(kù)變更就不會(huì)拖慢交付速度。這些實(shí)踐包括將數(shù)據(jù)庫(kù)變更以腳本形式存儲(chǔ)在版本控制中并以與生產(chǎn)應(yīng)用變更相同的方式管理這些變更讓軟件交付生命周期中的每個(gè)角色包括工程師都能看到數(shù)據(jù)庫(kù)變更當(dāng)應(yīng)用變更需要數(shù)據(jù)庫(kù)變更時(shí)及時(shí)與所有相關(guān)方溝通。代碼可維護(hù)性。指通過(guò)系統(tǒng)和工具使開(kāi)發(fā)人員能夠輕松修改他人維護(hù)的代碼在代碼庫(kù)中找到示例復(fù)用他人的代碼并在添加、升級(jí)或遷移依賴項(xiàng)時(shí)避免破壞已有代碼。雖然持續(xù)交付通常與持續(xù)集成一起出現(xiàn)被統(tǒng)稱為 CI/CD但研究表明持續(xù)集成只是實(shí)現(xiàn)持續(xù)交付的一個(gè)要素。要實(shí)現(xiàn)可靠、低風(fēng)險(xiǎn)的發(fā)布需要軟件交付流程中所有參與者緊密協(xié)作而不僅僅是軟件開(kāi)發(fā)人員參與。同時(shí)團(tuán)隊(duì)也需要采用新的工作方式并學(xué)習(xí)新的技能。在實(shí)際落地時(shí)持續(xù)交付還需要把目標(biāo)、需求、開(kāi)發(fā)、測(cè)試、發(fā)布、監(jiān)控和復(fù)盤連接成一條可追蹤的研發(fā)鏈路。借助PingCode這類研發(fā)管理工具團(tuán)隊(duì)可以將需求清理、評(píng)審排期、開(kāi)發(fā)任務(wù)、測(cè)試驗(yàn)證、發(fā)布上線和 Wiki 知識(shí)沉淀串聯(lián)起來(lái)并與代碼倉(cāng)庫(kù)、CI/CD 等研發(fā)工具打通讓持續(xù)交付不只是流水線自動(dòng)化而是貫穿整個(gè)軟件交付生命周期的協(xié)作機(jī)制。實(shí)施持續(xù)交付的常見(jiàn)陷阱有些組織誤以為只要更頻繁地執(zhí)行現(xiàn)有部署流程就能實(shí)現(xiàn)持續(xù)交付。然而真正實(shí)現(xiàn)持續(xù)交付所需的技術(shù)能力通常需要團(tuán)隊(duì)對(duì)流程和架構(gòu)進(jìn)行重大調(diào)整。如果流程和架構(gòu)沒(méi)有改進(jìn)僅僅提高部署頻率很可能會(huì)導(dǎo)致更高的失敗率并讓團(tuán)隊(duì)筋疲力盡。許多關(guān)于持續(xù)交付的討論都集中在工具和模式上例如如何通過(guò)部署流水線將變更從版本控制系統(tǒng)部署到生產(chǎn)環(huán)境。然而如果沒(méi)有落實(shí)本文中提到的必要技術(shù)實(shí)踐和流程變更僅僅引入現(xiàn)代工具并不能產(chǎn)生預(yù)期效果。DORA 研究發(fā)現(xiàn)轉(zhuǎn)型項(xiàng)目中常常會(huì)出現(xiàn)典型的 J 型曲線。為了走出 J 型曲線底部團(tuán)隊(duì)需要同時(shí)考慮流程重設(shè)計(jì)與簡(jiǎn)化、架構(gòu)改進(jìn)、能力和技能發(fā)展以及自動(dòng)化和工具化建設(shè)。典型的 J 型曲線通常包含以下階段在轉(zhuǎn)型初期團(tuán)隊(duì)開(kāi)始轉(zhuǎn)型并尋找能夠快速見(jiàn)效的方法。在初步改進(jìn)階段自動(dòng)化可以幫助低績(jī)效團(tuán)隊(duì)提升到中等績(jī)效水平。在效率下降階段也就是 J 型曲線底部自動(dòng)化會(huì)增加測(cè)試需求而這些測(cè)試仍然需要人工處理大量技術(shù)債務(wù)也會(huì)阻礙進(jìn)展。隨著團(tuán)隊(duì)逐漸走出困境技術(shù)債務(wù)和不斷增長(zhǎng)的系統(tǒng)復(fù)雜性會(huì)導(dǎo)致變更過(guò)程中出現(xiàn)額外的手動(dòng)控制和多層流程從而拖慢工作速度。在達(dá)到高績(jī)效階段后持續(xù)不斷的改進(jìn)工作才能真正帶來(lái)卓越表現(xiàn)。優(yōu)秀團(tuán)隊(duì)能夠充分利用自身專業(yè)知識(shí)并從周圍環(huán)境中持續(xù)學(xué)習(xí)從而提升生產(chǎn)力。緩解 J 型曲線影響的一種有效方式是開(kāi)展價(jià)值流圖分析以發(fā)現(xiàn)并預(yù)測(cè)瓶頸的影響。在價(jià)值流圖分析中團(tuán)隊(duì)需要觀察單個(gè)變更從版本控制進(jìn)入生產(chǎn)環(huán)境的完整過(guò)程考慮每次變更必須經(jīng)歷的各種流程例如自動(dòng)化測(cè)試、手動(dòng)測(cè)試、安全審查、變更管理以及發(fā)布到生產(chǎn)環(huán)境測(cè)量變更從進(jìn)入版本控制到發(fā)布所需的總時(shí)間針對(duì)每個(gè)流程測(cè)量實(shí)際耗時(shí)和增值時(shí)間。實(shí)際耗時(shí)是端到端流程所消耗的時(shí)間增值時(shí)間則是真正完成有價(jià)值工作的時(shí)間記錄工作因?yàn)榈谝淮螞](méi)有正確完成而被退回的比例。這個(gè)指標(biāo)通常被稱為完成準(zhǔn)確率也就是 %C/A。價(jià)值流圖的目的是幫助團(tuán)隊(duì)發(fā)現(xiàn)流程中的低效環(huán)節(jié)。團(tuán)隊(duì)需要共同繪制一張價(jià)值流圖描述六個(gè)月后理想的價(jià)值流狀態(tài)并預(yù)留資源去實(shí)現(xiàn)這一目標(biāo)。隨后團(tuán)隊(duì)?wèi)?yīng)找出并消除那些流程耗時(shí)過(guò)長(zhǎng)尤其是相對(duì)于價(jià)值創(chuàng)造時(shí)間過(guò)長(zhǎng)或者完成準(zhǔn)確率較低的障礙。通常在實(shí)施部署流水線時(shí)需要對(duì)流程和架構(gòu)進(jìn)行重大重設(shè)計(jì)。由于部署流水線覆蓋從代碼提交到發(fā)布的完整過(guò)程并連接多個(gè)團(tuán)隊(duì)因此所有相關(guān)團(tuán)隊(duì)的代表都必須參與價(jià)值流圖繪制并就通用工具鏈和流程達(dá)成共識(shí)。例如團(tuán)隊(duì)需要共同確定部署到測(cè)試環(huán)境和生產(chǎn)環(huán)境的流程這些都應(yīng)成為未來(lái)目標(biāo)狀態(tài)的一部分。持續(xù)交付的實(shí)施是一個(gè)持續(xù)的、日常的改進(jìn)過(guò)程其指導(dǎo)原則是實(shí)現(xiàn)預(yù)期結(jié)果。工具和模式固然重要但它們只能服務(wù)于這項(xiàng)關(guān)鍵的改進(jìn)工作。如何衡量持續(xù)交付效果持續(xù)交付的最終目標(biāo)是確保團(tuán)隊(duì)能夠在正常工作時(shí)間內(nèi)以低風(fēng)險(xiǎn)方式執(zhí)行發(fā)布。理想情況下不應(yīng)該要求任何人在正常工作時(shí)間之外完成部署或發(fā)布。因此對(duì)這一點(diǎn)進(jìn)行衡量非常重要。持續(xù)交付的成效最終體現(xiàn)在成果上。你可以通過(guò) DORA 快速評(píng)估查看團(tuán)隊(duì)在關(guān)鍵持續(xù)交付指標(biāo)上的表現(xiàn)常規(guī)變更和緊急變更的前置時(shí)間都很短理想狀態(tài)是能夠使用常規(guī)流程處理緊急變更變更失敗率較低發(fā)生故障或服務(wù)降級(jí)時(shí)可以在較短時(shí)間內(nèi)恢復(fù)服務(wù)發(fā)布頻率能夠確保高優(yōu)先級(jí)功能和錯(cuò)誤修復(fù)及時(shí)交付。正如本文開(kāi)頭所討論的實(shí)施持續(xù)交付還應(yīng)該降低返工率減少部署痛苦并減少團(tuán)隊(duì)花在返工和計(jì)劃外工作上的時(shí)間。歸根結(jié)底持續(xù)交付不是簡(jiǎn)單地“更頻繁發(fā)布”也不是只搭建一條 CI/CD 流水線。它要求團(tuán)隊(duì)持續(xù)保持軟件可部署狀態(tài)通過(guò)自動(dòng)化測(cè)試、部署自動(dòng)化、主干開(kāi)發(fā)、安全左移、可觀測(cè)性和低耦合架構(gòu)降低交付風(fēng)險(xiǎn)。只有當(dāng)這些技術(shù)實(shí)踐與團(tuán)隊(duì)協(xié)作方式、組織能力建設(shè)和持續(xù)改進(jìn)機(jī)制結(jié)合起來(lái)持續(xù)交付才能真正提升軟件交付績(jī)效和組織可靠性。