[持續交付實踐] pipeline使用:Multibranch Pipeline


前言

在探討multiBranch Pipeline之前,很有必要先探討下如何制定有效的代碼分支管理規范,使用高效的版本控制系統,並對構建產物及其依賴進行管理。
我們首先要強調,需要進行版本控制的不僅是源代碼,還有測試代碼、數據庫腳本、構建和部署腳本、依賴的庫文件等,並且對構建產物的版本控制也同樣重要。只有這些內容都納入版本控制了,才能夠確保所有的開發、測試、運維活動能夠正常開展,系統能夠被完整的搭建。
制定有效的分支管理策略對達成持續交付的目標非常重要。看過《持續交付》這本書的同學都知道,持續交付建議的方式是基於主干的開發(Trunk Based Development,TBD)模式,所有開發者在主干上頻繁的提交代碼,然后通過持續集成的機制,對修改觸發快速的自動化驗證和反饋,Google就在堅持使用主干開發模式,所有人的所有更改直接提交到Trunk上。那持續交付為什么這樣建議呢,實際應用中又是否能夠適用?

常見分支管理策略

1.基於主干的開發
前面已經介紹過了《持續交付》更傾向使用基於主干的開發模式,所有項目成員把代碼都提交到主干上,提交后自動觸發持續集成進行驗證和快速反饋,通過頻繁的集成和驗證,在保證質量的同時提升效率。主干開發模式非常強調代碼提交習慣,包括頻繁、有規律的代碼提交(比如每人每天提交一次),而提交前需要進行充分的本地驗證和預測試,以保證提交質量,降低污染主干代碼的概率。

 


優點:
相比於分支開發,主干開發模式有很多優勢。首先是代碼提交到主干,可以做到真正的持續集成,在沖突形成的早期發現和解決問題,避免后期的”合並地獄”,這樣的整體成本才是最低的。
對持續集成來說,具體實施也將會變的非常簡單,只需要維護一條pipeline交付流水線,在有新代碼提交后,通過git的hook機制,當有新代碼提交的時候就會觸發pipeline的執行並反饋結果,如果有問題代碼提交人員必須要實時去解決。
難點:
主干開發模式有很多優勢,但具體實施過程中會發現,當一個項目開發者多了以后,如果沒有強力的制度約束和相關意識,推動起來會碰到不少的困難,比如:

 

  • 主干上功能開發完成時間有先有后,如果遇到有未完成的功能但又需要發布時,就需要一種方法屏蔽掉未完成功能,才能進行安全的發布;
  • 主干上功能開發完成后,如果需要比較長的時間進行驗收測試,那么此時為了確保發布功能的穩定性且所有功能是經過驗證的,可能會限制新功能的提交,有的團隊采用的封版、凍結主干的做法就是這種情況,這樣的確會影響開發效率;
  • 如果修改的功能非常復雜,或者要進行架構上的大范圍重構,以上問題就更加明顯和難以解決了;
  • 如果團隊規模比較大,同時工作在主干上的開發人員比較多,那么沖突的概率會比較大,持續集成的失敗率可能比較高; 這些問題並不是無解,比如通過功能拆解合理規划需求進行增量開發;通過配置隱藏未完成功能;以微服務的思想對大的架構進行拆分組件,每個組件獨立開發和部署等。前提是我們的系統要有良好的架構設計,以及我們的開發者要有良好編碼協作習慣。

2.基於分支的開發

 


這正是很多團隊經常默認使用的模式,具體表現為接到需求后拉出分支,后面的開發都在分支上提交,每個分支生命周期較長,並且可能有多個並行分支,直到快要上線時或者上線后才合並到主干。
優點:
多個功能可以完全並行開發,互不干擾。還可以按每個功能特性拉出分支,那么每次提交都是完整的功能特性,分支划分明確、版本控制的記錄也會比較清晰易懂。並且由於不同需求的開發進度不同,可以選擇某個先開發完成的功能特性進行合並、發布,而不會被其它分支上未完成的功能特性阻塞。
缺點:
引用電影《無間道》中的一句話,“出來混,總有一天要還的”,因為雖然使用分支暫時隔離了不同功能的代碼,但系統的多個功能或者多個組成部分最終還是要集成在一起工作的。如果不同分支代碼之間有交互,合並時可能會有大量沖突需要解決。
在實際項目中,進行代碼合並時通常很容易出錯,解決沖突也非常耗時,特別是到代碼合並時基本都已經到了項目后期,經常出現合並錯誤甚至遺漏合並的問題,對於QA來說,每個分支通過測試后,合並代碼以后又需要系統的重新測試一次,工作量巨大不說還很容易導致一些合並造成的bug遺漏到線上,經歷過的同學都能體會倒這種方式的痛苦。
對於持續交付來說,每條分支我們都需要搭建一條完整的pipeline與之對應,這意味着需要更多的部署環境和更多的重復測試,在合並代碼后所有的過程還需要重新來一遍以避免各種代碼合並錯誤。

 

3.權衡和建議
在某些情況下,有時迫不得已要采用分支開發的模式,比如並行需求太多且相互干擾,比如開發團隊的習慣無法驅動改變,拉出分支其實意味着已經在持續集成/持續交付上做出了妥協,那么我們建議至少要使用一些折中的方案。

  • 盡量縮短分支的周期,最長也不要超過迭代周期;
  • 每個分支上運行單獨的測試流水線,保證質量。雖然這種方式浪費資源,而且其實也沒進行”真正的“集成;
  • 分支只與主干合並代碼,分支彼此之間盡量不做合並;
  • 分支定期合並主干上的變更 具體到Jenkins Pipeline的實施,個人認為主干開發模式,或者分支比較少的分支開發模式,原來的普通pipeline模式已經足夠。但如果是並行分支比較多的分支開發模式,以個人實踐經驗,單條pipeline使用時沖突會變的比較嚴重,雖然pipeline也可以通過參數化的方式去適配多個分支使用,但這種方式的缺點是每個分支的結果可視化會變的比較糟糕,這種情況下我們更推薦使用MultiBranch Pipeline。

MultiBranch Pipeline

前面啰嗦了這么多,終於到了重點要介紹的multiBranch Pipeline部分內容,但理解持續交付的分支管理策略確實對我們pipeline的具體使用非常重要。
之前已經介紹過了,Pipeline as Code是2.0的精髓所在。multiBranch Pipeline的使用首先需要在每個分支代碼的根目錄下存放Jenkinsfile(Pipeline的定義文件),我們可以理解下maven的pom.xml文件,Jenkinsfile作為pipeline的管理文件也需要在源代碼中進行直接的配置管理。這就要求devops工程師(QA、運維等)首先要有代碼庫的權限,或者至少賦能給dev工程師jenkinsfile的設計能力。
1.新建multibranch pipeline job
對代碼地址和jenkinsfile路徑進行配置如下

 


2.自動為每個branch生成job
在multibranch pipeline job保存后,jenkins自動地檢查所有的branch,且自動地為所有的branch創建job,當然前提是存在jenkinsfile文件
例如上面的job,自動地生成了文件夾pipeline_expertPatient_multiBranch,且在此文件夾下自動地為trunk和branch生成了job。如果在代碼庫上某個branch分支被刪除,multibranch pipeline也會自動檢測變化並刪除相應的job。

 


3.Scan Multibranch Pipeline Now
第一次生成Multibranch Pipeline時,會自動掃描pipeline配置文件並建立相應的job,后續如果jenkinsfile文件有變更,也可以手動觸發掃描,日志輸出如下

 


這樣一個完整的MultiBranch Pipeline就建立完成,你可以根據不同的分支定制不同的pipeline策略,當然也可以采用參數化的方式使用通用的jenkinsfile文件。

 

結語

MultiBranch Pipeline可以理解為是針對某個工程所有分支代碼的pipeline集合,jenkins會自動發現源代碼中的jenkinsfile配置文件生成對應的分支job。
而MultiBranch Pipeline要求jenkinsfile配置文件存放在源代碼的方式,也是符合Pipeline as Code的理念。雖然這也會給一些沒有代碼提交權限的devops工程師帶來困擾。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM