什么是 CI/CD
我的資源庫網站:https://www.byteooo.cn
在開發階段,許多編譯工具會將我們的源碼編譯可使用的文件。例如 vue-cli
的項目會被 webpack
打包編譯為瀏覽器的文件,Java
項目會被編譯為 .class/jar
文件以供服務器使用。
但是,開發人員過多關注構建和部署過程是很浪費時間的。以之前古老的的構建部署流程為例子,需要經歷以下步驟:
- 開發人員將源代碼,經過編譯、壓縮等一系列流程打包為制品(意思為打包后的成品)
- 將制品上傳到服務器。
- 在服務器將編譯后的文件,手動可用的容器服務內(例如
Nginx,Tomcat,Apache
等服務)
顯而易見,這種流程不僅繁瑣,且容易出錯,是非常影響開發效率的。開發人員要花一些時間浪費在這上面。那么有沒有高效率,簡單便捷一些的方式呢?
這就要提到 CI/CD
了。CI
的意思是 持續構建
。負責拉取代碼庫中的代碼后,執行用戶預置定義好的操作腳本,通過一系列編譯操作構建出一個 制品
,并將制品推送至到制品庫里面。常用工具有 Gitlab CI,Github CI,Jenkins 等。這個環節不參與部署,只負責構建代碼,然后保存構建物。構建物被稱為 制品,保存制品的地方被稱為 “制品庫”
CD 則有2層含義: 持續部署(Continuous Deployment)
和 持續交付(Continuous Delivery)
。 持續交付
的概念是:將制品庫的制品拿出后,部署在測試環境 / 交付給客戶提前測試。 持續部署
則是將制品部署在生產環境。可以進行持續部署的工具也有很多: Ansible
批量部署, Docker
直接推拉鏡像等等。當然也包括我們后面要寫到的 Kubernetes
集群部署。
為什么要學 CI/CD
相信大家在了解它們的用途后,會有幾點以下疑問:
- 這不是運維干的活嗎?
- 好像和業務代碼不相關,那我了解它有何意義?
- 全是服務器知識,我不了解相關知識怎么學習?
相信這是許多前后端同學一致的疑問。的確,對于曾經的我,也有過這些疑問。門檻高,和工作內容不相關。那他的意義在哪里?
但是當我通過學習這些知識和在團隊中實踐這些流程后,我在知識面上得到了很大的擴展。對操作系統,對實際的構建部署,甚至對工程化擁有了全新的認識。甚至可以提出建議,如何更好的優化這些流程。這些都是你可以獲得成長和學習的地方。你也可以選擇將這部分知識點寫入你的簡歷,作為面試和篩選的加分項。從更高的角度看整個項目的全貌,往往產生思考的維度是和一般的角度不同的。你會成長更快,漸漸地突破思維天花板。
當然,如果你對 Linux
操作系統不是很熟悉,建議先補習下基礎的系統安裝,操作命令,基礎概念等知識(系統推薦 CentOS
/ Ubuntu
),在小冊中將不會對基礎Linux
命令有過多解釋。當然,如果遇到部分不懂的現場搜索也可以,相信你學起來這部分知識可以更加得心應手。
小冊整體架構設計
在開始學習之前,我們先來了解下小冊的整體內容技術架構設計:
上面是一張全景架構圖,小冊內容和章節將圍繞該圖展開編寫內容。其中不包含單元測試和代碼掃描環節,只關注構建和部署環節。
換成文字敘述就是這樣的:
- 你寫完了代碼,提交到了
Git
代碼庫 - 隨后,代碼庫配置的
WebHook
鉤子或人工手動啟動了Jenkins
的構建流程 Jenkins
啟動構建流程。按照你之前配置好的構建腳本,將代碼編譯成功。- 編譯成功后,將編譯后的文件打包為
docker
鏡像,并將鏡像上傳到私有鏡像庫。 - 隨后,使用
kubectl
指定遠程的k8s集群,發送鏡像版本更新指令 - 遠程的k8s集群接收到指令后,去鏡像庫拉取新鏡像
- 鏡像拉取成功,按照升級策略(滾動升級)進行升級,此時不會停機。
- 升級完畢。
服務器搭配方案
學習這本小冊,動手能力要具備,當然服務器資源也要準備好。這里推薦幾種服務器搭配方案用來學習測試使用:
系統選用 CentOS 7:https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso
1. 全本地虛擬機 / 全上云
這里所有主機都必須為云服務器/本地虛擬機。要保持統一
配置 | 技術棧 | 類型 | 標簽 |
---|---|---|---|
2核4G | Jenkins + Nexus + Docker | 本地虛擬機 / Cloud | 構建機 |
2核4G | Docker + Kubernetes | 本地虛擬機 / Cloud | Kubernetes Master |
1核1G | Docker + Kubernetes | 本地虛擬機 / Cloud | Kubernetes Node |
2. 半云半本地虛擬機
構建機器放本地,要部署的機器放云上面。否則的話構建機找不到要部署的機器
缺點:無法使用 Git 的 Webhook
配置 | 技術棧 | 類型 | 標簽 |
---|---|---|---|
2核4G | Jenkins + Nexus + Docker | 本地虛擬機 | 構建機 |
2核4G | Docker + Kubernetes | Cloud | Kubernetes Master |
1核1G | Docker + Kubernetes | Cloud | Kubernetes Node |