iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
Software Development

全端實戰心法:小團隊的產品開發大小事系列 第 25

小團隊的 CI/CD 流(一):建置、服務定版

  • 分享至 

  • xImage
  •  

如果我們開發的產品沒這麼大,沒有什麼微服務到人工無法執行測試、部署,而一定要程式自動處理的地步,也會需要套用 CI/CD 的流程嗎?

我的建議是,就算是小到單人開發的產品也很值得加入這個流程,在 CI/CD 的幫助下也能夠省去非常多「處理雜事」的時間,更重要的是減少佔用你的「心理頻寬」。

CI/CD,軟體出版的專屬編輯

所謂的 CI/CD (Continuous Integration and Continuous Deployment),中文可以翻譯成:持續整合/持續部署,其中的 CD 也可以是 Continuous Delivery(持續交付)。

一般來說程式開發完畢後,都會經過兩個步驟:建置(Build)和部署(Deployment)。

建置就是將你寫好的程式碼編譯、打包等等將你程式碼轉換成能夠被執行的程式,例如 Docker Image 或是前端一整包的 HTML、JavaScript 。在建置前通常為了確保轉換後的程式碼不會執行起來就壞掉,會跑一些測試,如 Unit Tests、API Tests 等。

而部署就是將建置完可執行的程式碼、Image 丟到執行他們的機器上跑。像是將一個後端 Docker Image 複製到 AWS EC2(一種提供 Virtual Machine 的服務)上面,並且執行 docker run 的指令讓程式在 Docker Container 內執行起來。

回到 CI/CD,前半部分的 CI 就是每次當你寫好程式後,自動幫你跑測試,並且執行建置;接著後半部分的 CD 則是當每次有新的建置完成後,自動幫你部署到目標的機器上。

聽起來是否很像是一個出版社的編輯呢?當你寫好稿之後幫你校稿、整理成書,然後出版。

但是,這些動作在產品的規模不大時,我們工程師小貓幾隻自己手動下些指令不就可以了?這麼大費周章地花時間引入 CI/CD 的流程有這麼大的好處嗎?

且讓我們看看實務上的建置、測試、部署會遇到怎麼樣的問題吧!

建置

所謂建置,就是將你寫好的程式碼轉換成可執行的程式。例如將後端的 Java 程式碼編譯後得到可被執行 .jar 檔;將 Python 寫的 Web Server 用 Docker 打包成 Image;又或者前端的 JavaScript、HTML、CSS 透過 Webpack 打包成方便瀏覽器渲染的檔案。這些「可執行檔」就是建置的最終輸出。

在建置的過程中,有些重要的元素值得特別拿出來說,例如將版號定好這件事。

服務定版

先來說我們所提供的服務定版,假想團隊中有專門測試的 QA,正在驗證一個使用者管理的頁面,卻發現無法獲取使用者的列表,此時要怎麼傳達這個錯誤給 RD?

  1. 「上週剛更新的 /user/list API 回傳 404」

  2. 「版本 2.2b24 的 /user/list API 回傳 404」

  3. 「版本 2.2b24、後端 2.17 的 /user/list API 回傳 404」

第 1 種傳達錯誤的方式只有大致的日期,RD 需要透過日期來看這段時間後端到底修改了什麼,而開發的時候一天上幾個 Commit 也是常見的事情,要精準的 Locate 哪個 Commit 把 API 改壞了通常要多花點時間。

第 2 種傳達就清楚多了,我們將整個系統定版成 2.2b24,就能更容易的反推回前後端的 Commits 分別是哪一個,和 API 壞掉之前的版本做對比,更清楚地得知改了哪幾段 Code。

一般小團隊的定版策略用第 2 種其實就足夠了,但如果能將系統中的每個 Component 都定版,如第 3 種表達所示,再確認是 API 的問題後,就能更精確的定位到後端的某個版本。

第三方服務:函式庫、Complier、Interpreter 定版

我們在開發的服務上定版能減少溝通成本,而在第三方服務的定版同樣也能減少溝通成本,但更重要的是降低 Debug 的成本。我曾有過不只一次,因為第三方服務沒有定版導致的耗時除錯經驗。

通常使用常見的程式語言開發,配套的 package 管理程式如 pip、npm 都有將安裝的函式庫定版並記錄在某份檔案的功能(如 requirements.txt、package.json)。

但若是你在開發時有使用過 Docker Image 當作 Build 的 Base Image,請務必加上版號,而不要使用 :latest 的 tag,因為 latest 的實際 Image 是會隨著時間而改變的。

舉例來說,使用 Python 開發時,我們會將第三方的函式庫定版記錄起來,像是 numpy==1.19.5。然而這個 1.19.5 的版本只支援 Python 3.6 至 3.9,如果你開發的時候使用的是 Docker python:latest 的 Image 能正常運作,但是隔了幾個月後 latest 的 Python Image 卻變成 3.10,在建置的時候就會失敗。

如果又剛好遇到這幾個月你雖然完全沒有更新程式碼,卻發現沒辦法 Build 了,就會在你已經快不熟悉程式碼的情況鑽進去研究到底哪裡出錯。


上一篇
別理 CAP 了,你可能只需要一台機器
下一篇
小團隊的 CI/CD 流(二):測試、環境
系列文
全端實戰心法:小團隊的產品開發大小事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言