[CI/CD 實作] (一) 基本介紹

PC Chen
程式乾貨
Published in
4 min readDec 31, 2020

工作上慢慢發現開發人員跟 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」的網頁,執行後結果:

http://0.0.0.0:8888/

程式中最關鍵的就是 print("hello") 字樣,因為它直接牽涉到了網頁的顯示,因此可以想像的是,當有人更新上傳了遠端的程式碼:比如說改成 print("hello world") ,這時候我在本地希望能夠更新成遠端的最新版本,那我就需要所謂的 持續整合 CI

可是除了這樣還不夠,更新完遠端的版本我還需要再執行一次 .py 讓網頁顯示的畫面更新成 "hello world" 字樣對吧?這時候我需要的就是一個穩定的機器及環境在更新後、幫我 持續部署 CD 這隻程式

講完了情境,在實作之前先來講解整體流程,現在最常被使用的 CI 軟體為 Jenkins,而剛剛所提到需要穩定的機器與環境,實務上會先將開發程式與環境 Docker容器化 後、統一交給 kubernetes(以下簡稱k8s)部署。

剛剛講了一大串會發現需要一些先驗知識XD,若對容器化服務還不熟悉的可以參考 這篇 看看,但簡單說,整體流程可分為以下步驟:

  1. 在一台遠端機器(可以是 VM、AWS EC2、或是 k8s cluster中其中一個node等)安裝 jenkins
  2. 設定 jenkins 利用 webhook 連結遠端 repository(github, gitlab, bitbucket),偵測當遠端倉庫有異動時、自動 git pull 到工作目錄上
  3. 設定 jenknis git pull 更新完無誤後,進行「build 建置」的動作:
    * 執行 shell scrpit -> docker build images
    * 將 images 上傳至 docker hub
    * 叫 k8s 利用最新版的 images 啟動 container 並執行後,建置完成
  4. 設定 jenkins 建置完成後,串接通訊軟體API(EX. slack, teams,...),發送通知建置成功 or 建置失敗

我知道,有點太複雜了

在實作上我也懶得自己在 AWS or GCP 上開一台測試機器來用,所以我就都用自己的本地電腦(macOS)來實作就好了~簡化的流程圖為以下:

  1. 在 macOS 安裝 jenkins
  2. 設定 jenkins 利用 webhook 連接自己的 github repo,如果我有推東西上去,會自動 git pull 到 jenkins 的工作目錄上(預設是存在 ~/.jenkins/workspace)
  3. 設定 jenkins 進行建置動作
    * docker build images
    * 將 images 上傳至 docker hub
  4. 安裝 minikube,替我們快速搭建簡易的 k8s 服務
    * 呼叫 minikube k8s 拉取 docker hub 上最新的 images 並啟動 container
  5. 建置完成後,透過 slack 發送通知

總而言之

為了要走完 CI/CD 整套流程,一步步的串接與理解是至關重要的!因為細節滿多的,之後的實作我大致上會分為A、B、C三個部分來執行:

A. jenkins + GitHub repo webhook 串接

B. minikube k8s 部署

C. A+B整合之串接 slack 通知

有興趣的讀者目前先心中謹記這個架構圖就好,之後我們就來慢慢操作囉
to be continued

--

--

PC Chen
程式乾貨

喜歡接觸與動手實作各種軟體技術的後端數據工程師 A data- backend engineer who is enthusiastic in learning and implementing any techniques in software engineering.