這是軟件工程系列知識總結的第七篇文章,也是最後一篇。
前面的文章,聊了軟件工程的基礎理論、項目管理、需求分析、架構設計、軟件測試以及線上服務的質量保障。
其中在架構設計和線上服務的質量保障中,我也提到了關於持續集成持續交付相關的內容。
軟件工程的本質是用工程化的方法去規範軟件開發,讓軟件開發項目可以按時保質完成的同時且成本可控。
交付的軟件產品除了質量之外,交付效率對團隊來說也是很重要的一點,而持續高效的交付高質量的軟件產品,更需要一個高效的持續交付技術體系支撐。
理解持續交付體系
無論是保障質量,還是提升效率,都需要某些持續的能力來支撐他們。
這種支撐能力,可以看作是一種工廠化的流水線能力,業內通常將其統稱爲持續交付。
從質量保障的角度總體來說,我將其分爲:CI持續迭代-CI持續集成-CD持續發佈-CO持續運營-CM持續度量。
持續迭代(Continuous Iteration)
技術是什麼呢?技術是工具,技術服務於架構設計,架構設計服務於產品,產品服務於業務,業務服務於商業。
這裏的持續迭代,更多指的是業務或者需求上的一種可持續的變化,通過需求不斷變化來驅動,持續迭代軟件產品,爲用戶提供更好的服務,達成商業價值變現。
持續集成(Continuous Integration)
持續集成可以幫助技術團隊更加頻繁的將代碼更改合併到共享分支或"主幹"中。
一旦對應用所做的更改被合併,系統就會通過自動構建應用並運行不同級別的自動化測試(通常是單元測試和集成測試)來驗證這些更改,確保這些更改沒有對應用造成破壞。
如果自動化測試發現新代碼和現有代碼之間存在衝突,CI 可以加快修復這些錯誤的過程。
持續發佈(Continuous Deployment)
這裏的持續發佈包括持續交付(Continuous Delivery)和持續部署(Continuous Deployment)。
完成 CI 中構建及自動化的測試流程後,持續交付可自動將測試通過的代碼發佈到存儲庫。持續交付的目標是擁有一個可隨時部署到生產環境的代碼庫。
在持續交付中,每個階段都涉及測試自動化和代碼發佈自動化。在流程結束時可以快速的將應用部署到生產環境中。
對於一個成熟的 CI/CD 管道來說,最後的階段是持續部署。作爲持續交付的延伸,持續部署可以自動將應用發佈到生產環境,持續部署在很大程度上都得依賴精心設計的測試自動化。
持續部署意味着開發人員對應用的更改在編寫後的幾分鐘內就能生效(假設它通過了自動化測試)。這更加便於持續接收和整合用戶反饋。
所有這些 CI/CD 的關聯步驟都有助於降低應用的部署風險,因此更便於以更快的節奏發佈對應用的更改。
不過,由於還需要編寫自動化測試以適應 CI/CD 管道中的各種測試和發佈階段,因此前期建設需要很大的資源投入。
持續運營(Continuous operation)
應用在生產環境發佈後,需要持續的跟蹤線上質量、用戶反饋建議以及線上可能發生的一些問題或者故障。
所有線上的用戶建議、可能發生的問題或者故障,其實從本質來說,和交付質量都息息相關。
因此這裏提出了持續運營,就是提倡質量的把控、驗證、度量即使到了生產環境,也需要持續不斷的將這套機制運行下去。
持續度量(Continuous measurement)
脫離數據講質量是空中樓閣,從需求質量到交付質量整個週期中,將每個階段的要做的事情,出現的問題,發生的風險以及結果都進行可量化的記錄展示,然後從中進行分析評估,找到不足之處。這就是持續度量,需要持續的投入。
持續交付優勢
- 儘快暴露問題;
- 極大提升效率;
- 提升交付質量;
- 降低項目成本;
持續交付體系工具
工具名稱 |
工具作用 |
Git、SVN、GitLab、Coding |
統一的源代碼管理工具 |
testNg、pytest、sonar、selenium |
單元/接口/UI自動化測試工具 |
Jenkins、Go CD、Travis CI、Pipelines |
持續集成和持續部署工具 |
持續交付的前提是整個研發測試發佈流程要做到高度自動化。要實現持續交付,項目一般需要滿足這些條件:
- 代碼構建的過程可以反覆高頻進行,且每次構建結果是一致穩定的;
- 所有環境配置信息都存於源代碼管理工具中(現在有了專門的配置中心組件如Nacos/Apollo);
- 針對不同環境需要部署的代碼包,需要自動編譯和創建不同版本;
- 所有環境的構建編譯部署發佈步驟必須是自動化完成;
DevOps和持續交付的關係
持續交付要求代碼可以反覆高頻的構建編譯,代碼包的測試部署發佈需要自動化來完成,但傳統的研發交付流程已經漸漸不適應當下的業務變化,因此纔有了近幾年的DevOps,甚至萬物皆可Ops。
其實DevOps並不是一種崗位,可以理解爲一種緊密協作的高效工作方式。無論是DevOps,還是所謂的TestOps,其實都指的是開發/測試和運維同學一起通過高效協作的方式來更快的構建、測試和發佈軟件。
DevOps的優勢
以DevOps爲例,當團隊採取這種工作協作方式後,帶來的好處如下:
- 軟件的構建測試和發佈過程高度自動化;
- 信息更加透明,交付質量更易於度量評估;
- 跨團隊和跨職能協作的效率和氛圍會更好;
要實踐DevOps,意味着團隊需要去做這些事:
- 構建自動化流水線系統,從構建測試到部署實現高度自動化;
- 建立完善精確的監控體系,盡力讓信息變透明,數據可度量;
- 建立跨團隊跨職能的溝通協作機制,形成團隊的流程和文化;
DevOps工程師要做的事情
- 幫助團隊建立持續交付工作流程和工具;
- 建立一套完善的監控報警系統和故障響應流程;
- 構建適用於團隊研發交付流程的基礎技術設施;
- 推動DevOps流程和文化在團隊落地;