工作上慢慢發現開發人員跟 DevOps Team 打好交道其實會增加很多效率(EX. 開權限、買機器、調整機器效能等等),無奈菜鳥如我對於很多 DevOps 的專有名詞都不太熟悉QQ。
但既然都是工程師了,就想說來自己實作一個簡單的流程~順便當作筆記給記錄下來,今天這篇就先來個簡單的介紹。
在軟體開發業中,DevOps Team 最主要的職責就是 ios, Android, Frontend, Backend,...等各個開發團隊的 持續整合 Continous Integration 與 持續部署 Continous Deployment,並同時監控整個系統運行的效能,可說是責任重大!
所以到底什麼是 CI/CD ?
設想一個情境:今天我寫了一隻 hello_flask.py
,內容主要就是在本地的瀏覽器(127.0.0.1:8888)顯示「hello」的網頁,執行後結果:
程式中最關鍵的就是 print("hello")
字樣,因為它直接牽涉到了網頁的顯示,因此可以想像的是,當有人更新上傳了遠端的程式碼:比如說改成 print("hello world")
,這時候我在本地希望能夠更新成遠端的最新版本,那我就需要所謂的 持續整合 CI
可是除了這樣還不夠,更新完遠端的版本我還需要再執行一次 .py 讓網頁顯示的畫面更新成 "hello world" 字樣對吧?這時候我需要的就是一個穩定的機器及環境在更新後、幫我 持續部署 CD 這隻程式
講完了情境,在實作之前先來講解整體流程,現在最常被使用的 CI 軟體為 Jenkins,而剛剛所提到需要穩定的機器與環境,實務上會先將開發程式與環境 Docker容器化 後、統一交給 kubernetes(以下簡稱k8s)部署。
剛剛講了一大串會發現需要一些先驗知識XD,若對容器化服務還不熟悉的可以參考 這篇 看看,但簡單說,整體流程可分為以下步驟:
- 在一台遠端機器(可以是 VM、AWS EC2、或是 k8s cluster中其中一個node等)安裝 jenkins
- 設定 jenkins 利用 webhook 連結遠端 repository(github, gitlab, bitbucket),偵測當遠端倉庫有異動時、自動
git pull
到工作目錄上 - 設定 jenknis
git pull
更新完無誤後,進行「build 建置」的動作:
* 執行 shell scrpit -> docker build images
* 將 images 上傳至 docker hub
* 叫 k8s 利用最新版的 images 啟動 container 並執行後,建置完成 - 設定 jenkins 建置完成後,串接通訊軟體API(EX. slack, teams,...),發送通知建置成功 or 建置失敗
我知道,有點太複雜了
在實作上我也懶得自己在 AWS or GCP 上開一台測試機器來用,所以我就都用自己的本地電腦(macOS)來實作就好了~簡化的流程圖為以下:
- 在 macOS 安裝 jenkins
- 設定 jenkins 利用 webhook 連接自己的 github repo,如果我有推東西上去,會自動
git pull
到 jenkins 的工作目錄上(預設是存在 ~/.jenkins/workspace) - 設定 jenkins 進行建置動作
* docker build images
* 將 images 上傳至 docker hub - 安裝 minikube,替我們快速搭建簡易的 k8s 服務
* 呼叫 minikube k8s 拉取 docker hub 上最新的 images 並啟動 container - 建置完成後,透過 slack 發送通知
總而言之
為了要走完 CI/CD 整套流程,一步步的串接與理解是至關重要的!因為細節滿多的,之後的實作我大致上會分為A、B、C三個部分來執行:
A. jenkins + GitHub repo webhook 串接
B. minikube k8s 部署
C. A+B整合之串接 slack 通知
有興趣的讀者目前先心中謹記這個架構圖就好,之後我們就來慢慢操作囉
to be continued