持續集成、持續交付(CI/CD)開篇,先來嘮嘮嗑

前言

現在稍微有點規模的系統,很多都是採用分散式/微服務架構,將一個大系統拆分為很多個功能模組進行開發、測試、發布、管理等,如果全部流程都採用人工的形式進行的話,效率肯定是超級不高效滴。而且現在很多項目都採用極限編程的模式,將原有比較複雜的過程分解為更小的周期進行管理,將開發的成果快速的體現給用戶,如果單純人工操作,就需要大量的人力成本才能達到要求(頻繁的開發、測試、部署是很耗時的),另外很容出錯。所以自動化的集成和交付是很有必要的,接下來就開始這系列的學習和分享,小夥伴們一起哦。

極限編程(ExtremeProgramming,簡稱XP)是一個輕量級的、靈巧的軟體開發方法;同時它也是一個非常嚴謹和周密的方法;XP是一種近螺旋式的開發方法,它將複雜的開發過程分解為一個個相對比較簡單的小周期;通過積極的交流、回饋以及其它一系列的方法,開發人員和客戶可以非常清楚開發進度、變化、待解決的問題和潛在的困難等,並根據實際情況及時地調整開發過程。 —摘自百度百科

正文

1. CI/CD簡介

需求變更頻繁、開發人員時間不夠用、傳統人工運維費事費力是項目遇到的三大難題,所以各種模式應運而生,比如常聽見的DevOps、CI/CD、敏捷開發等,其實最終的目的就是通過自動化的工具協作和溝通來完成軟體的生命周期管理,從而更快、更頻繁地交付更穩定的軟體產品,儘可能降低開發成本,滿足客戶需求。

有了自動化就不用加班了? 想多了,只是減少不必要的時間浪費,節省出來時間還得去做其他的更有意義的事,所以該加的還加。

1.1 CI持續集成

CI(Continuous integration)持續集成:根據開發情況,隨時將功能集成到整個項目中。

有點規模的系統都會分解為很多模組,每個模組又會分解為很多小功能,每個小功能還會分解成很多小操作,而這些功能模組可能都是不同的開發人員進行開發,持續集成的目的就是開發人員根據功能的完成情況,可以隨時將對應的開發成果合併到整體項目中,儘早的與其他模組集成並進行測試,儘早發現問題並解決

1.2 CD持續交付

CD(Continuous delivery)持續交付根據功能集成情況,小周期內形成小版本交付,快速迭代,讓用戶儘快的體驗到新功能

項目開發過程中,需求變更是避免不了的,通過短周期的小版本交付,實時獲取用戶回饋,有針對性的快速優化和完善,減少不必要的返工和大的需求變動,還可以降低累積功能交付的風險。另外一個角度來說,讓用戶快速使用到新功能,用戶的體驗感也不一樣(用戶就是上帝)。

2. CI/CD實操流程

實際工作中,其實通俗點說就是將原有的部分人為參與的步驟藉助自動化工具進行管理,使得整個流程自動化、標準化,降低人為操作錯誤的風險。人為操作和自動化操作流程如下:

  • 人為操作

    上圖簡述:

    1.開發人員將功能程式碼推送的伺服器;

    2.經過多輪測試,直到可發布;

    3.運維人員拉取可發布程式碼;

    4.然後進行打包;

    5.最後發布到應用伺服器上;

    當然也有開發人員把活全乾了的,但不管咋弄,假如發布的功能比較多或是發布比較頻繁,那對應的人員工作就只能幹發布這一件事了,而且人為操作出錯的概率比較高。

  • 自動化操作

    上圖簡述:

    1.開發人員將功能程式碼推送的伺服器,推送正式程式碼前會先自動化測試和人工測試(圖中沒體現);

    2.版本控制伺服器收到程式碼的同時,會觸發對應的鉤子程式(或定時程式)

    3.通知持續集成工具(Jenkins,Hudson等),工具會自動先使用安裝的git/svn插件從版本控制伺服器上拉取源程式碼

    4.工具會使用編譯/打包插件將拉取下來的程式碼進行自動編譯打包

    5.工具最後將打包的程式發布到應用伺服器上;(這裡根據打包的形式不一樣,發布方式也不一樣;比如直接運行,或者是鏡像方式,又或者是集成K8S,後續我們會逐步實操);這步使用插件根據部署場景不一樣,使用的也不一樣。

    6.在自動化期間如果發生錯誤,可以配置通知,相關人員會及時進行處理,從而快速響應,快速迭代

    相比人工操作,開發人員只需提交程式碼,後續就基本自動化了,這樣是不是很給力。 至於要不要這樣做,主要還是看業務和制度。

3. Jenkins 簡介及安裝

關於持續集成的工具有Jenkins,Hudson,gitLab-runner等,大家常用的就是Jenkins,接一下來就以它為工具的前提下進行實操演示。

3.1 Jenkins簡介

Jenkins是一個開源的軟體項目,是基於Java開發的一種持續集成工具,幫助開發人員自動構建項目;Jenkins通過插件化的方式可以集成不同開發語言、不同版本控制工具、不同流程部署等場景

3.2 Jenkins安裝

這裡還是採用Docker的方式進行安裝,採用的是雲伺服器(Linux),具體步驟如下:

  • 執行Docker命令進行安裝

     docker run -p 8080:8080 -p 5000:5000 --name jenkins \
     -u root \
     -v /mydata/jenkins_home:/var/jenkins_home \
     -d jenkins/jenkins:lts
    

    命令解析:

    -p 8080:8080 -p 5000:5000 指定主機和容器的映射埠;

    –name jenkins 指定容器名為jenkins;

    -u root 指定用戶,這裡root用戶下;

    -v /mydata/jenkins_home:/var/jenkins_home 掛載目錄;

    -d 是以後台形式啟動容器; 最後一串是代表使用的鏡像。

    訪問8080埠看效果,如下:

  • 查找初始密碼

    命令方式,如下:

     docker logs jenkins # 看容器的啟動日誌
    

    進入容器內部看初始密碼文件的方式,如下:

  • 安裝插件

    登錄之後就提示進行插件安裝,剛開始直接安裝推薦插件即可;

    接下來就是等待插件安裝完成即可,如果安裝失敗,就多試幾次。

  • 新建用戶

    推薦插件安裝完畢之後,會出現新建用戶的介面,根據自己需要創建屬於自己的新帳號,如下:

  • 配置地址,這個地址先按默認的來,後續用到了我們再來解釋

  • 安裝完成

總結

其實對於項目周期的管理越是簡單高效越好,不要盲目使用工具; 就比如小小的單體程式,各種持續集成、部署工具都用上,那就是自己給自己添堵,一定要以解決問題為目的。

到這就先把Jenkins環境搭建好,後續的文章會陸續分享,從程式碼到最後容器化,咱們一步一步的來;之後的案例將會使用碼雲作為程式碼的版本控制伺服器,相對github來說比較快,不過原理都差不多。關注「Code綜藝圈」,和我一起學習吧;