1. 程式人生 > >你準備好持續交付(CD)了嗎?

你準備好持續交付(CD)了嗎?

文章目錄

持續交付(CD, Continuous delivery)就是說每次提交程式碼時立即構建,並可以將構建部署到生產環境中,本文將分享一些持續交付相關的方法和經驗。

自動化(Automation)

自動化對於完善的CD管道來說必不可少,我們理應儘可能的用自動化取代手動工作以獲得最大利益。

過去,我們的開發團隊可能在將程式碼釋出到生產環境之前一般會做測試,其中一些可能是手動的,一些則是自動的。但在持續交付的情況下,每次提交都要進行程式碼測試,因此最好的辦法就是“自動化一切可自動化的東西”,並且不應僅限於開發團隊。

軟體中所有重要部分的自動化都是必要的——

  • 測試(Tests) - 單元測試、整合測試、UI測試、迴歸測試、效能測試…
  • 資料庫的安裝、備份和恢復
  • 產品及其依賴項的安裝和測試
  • 程式碼文件和使用者文件

根據我們的產品不同,可能還會有很多其他可自動化的部分,例如基於雲端計算的產品,可以自動配置基礎架構。

經常提交、儘快提交(Commit often, Commit soon)

CD流程的第二個重要基礎是“經常提交、儘快提交”的能力,在交付軟體時,快速的反饋週期可以帶來極大的不同。

然而不幸的是,大爆炸開發方法和部署(Big bang development approach and deployments)仍是業界的常態。用這種方式,每隔幾個月、一次性發布大量程式碼到生產環境中很常見。

而在程式碼中引入大量更改並將其部署到生產系統中可能會產生意外後果。很難確切地知道出了什麼問題,而且診斷起來很困難。以這種方式更新的大型系統很難恢復到工作狀態,因為您無法輕鬆回滾。

持續交付要求您經常將更改與主分支整合。每次更改程式碼時,請將更改推送到版本控制。

如果我們沒有整天commit,一般無法確切知道我們的commit如何適應系統的其他部分,或者它是否已經破壞了任何東西。如果我們使用的是版本控制系統,開發人員可以切換到過去任何給定時間點的程式碼。

頻繁提交的另一個積極結果是我們可以更快地獲得有關專案狀態的反饋,我們很快就會發現某個解決方案走錯了方向,而如果出現問題,我們只需要除錯一些潛在的部分。另外,不要忘了有意義的提交備註很重要!

當開發人員長時間彼此孤立地工作時,實現CD幾乎是不可能完成的任務。在大公司中,持續數月的開發週期並不罕見。當開發工作以這種方式發生時,在開發階段結束時需要進行大量測試,這也就意味著在相當長的一段時間裡,我們無法瞭解應用是否正常工作。

避免這種不確定性需要開發人員經常commit他們的工作,儘快讓更改對其他人可用。在大型團隊中,這一點很重要,這使得合併衝突和由大型提交引起的其他問題變得不那麼頻繁且更易於解決。

開發和運維(Developers and Operations)

先進的軟體開發公司一般都至少遵循了Agile/Scrum方法的一部分。例如,Scrum的一個儀式是團隊每天進行討論:昨天做了什麼、今天要做什麼以及有什麼困難,這麼做的目的是讓整個團隊瞭解正在進行的工作。

提高開發團隊生產環境知識的一種簡單方法是讓運維工程師參加,讓開發團隊能夠更好地瞭解運維所做的工作。

從長遠來看,我們需要DevOps,避免開發和運維成為兩個孤島。

生產環境(Production Environment)

CD的最後邊界是部署到生產環境中。對於生成程式碼庫的每次提交,不需要進行生產部署,但每個構建都需要生產就緒。

大多數開發團隊對實際生產環境、硬體和軟體的規範、配置、安全規則等了解不多,甚至根本無法訪問生產環境。

改善這種情況需要採取的第一步,是建立一個儘可能接近真實生產環境的臨時環境。

打破一體化(Breaking Monoliths)

有效實施CD的常見障礙是克服一體化架構程式碼庫的“遲緩”,緩慢的構建、脆弱的程式碼庫、複雜的程式碼和架構是一些常見的問題。

常見的方法是重新構建整個系統,但一般方法會涉及到大量的時間、資源和資金,以及技術挑戰。

對於那些不專注於軟體開發的公司來說,要獲得管理層的批准要困難得多,因為這需要額外的預算和精力分配到可能只是微不足道的邊際收益的事情上。

對於其他更注重軟體的公司而言,從長遠來看,重新構建整個解決方案可能是最好的方法。

我們建議的入門方法是將程式碼庫拆分為多個儲存庫,每個儲存庫都集中在整個產品的較小子集上。這些較小的儲存庫中的每一個都應該是自包含的,它們應該有自己的構建指令碼、測試等。

如此一來,CD流程可以更快實現,而無需對系統進行徹底“檢修”。從長遠來看,應使用微服務架構方法將這些單獨的儲存庫進一步細分為更小的部分。

關於Rainbond

Rainbond(雲幫)是"以應用為中心”的開源PaaS, 深度整合基於Kubernetes的容器管理、ServiceMesh微服務架構最佳實踐、多型別CI/CD應用構建與交付、多資料中心資源管理等技術, 為使用者提供雲原生應用全生命週期解決方案,構建應用與基礎設施、應用與應用、基礎設施與基礎設施之間互聯互通的生態體系, 滿足支撐業務高速發展所需的敏捷開發、高效運維和精益管理需求。