iT邦幫忙

0

CI/CD 入門:從手動發布到自動部署

  • 分享至 

  • xImage
  •  

第一部分:CI/CD 是什麼

一句話

讓「改完程式」到「上線」這段路自動化,而且每一步都可以檢查、可以還原。


拆開看:CI 和 CD

全名 中文 在做什麼
CI Continuous Integration 持續整合 每次改動都自動建置檢查,確認「還能編譯、還能跑」
CD Continuous Deployment 持續部署 檢查通過後,自動送上伺服器

簡單說:

https://ithelp.ithome.com.tw/upload/images/20261013/20172100x6u2a2vrIR.png

CI 是守門員,CD 是搬運工。 守門員沒放行,搬運工就不會動。


為什麼需要它

傳統的手動發布長這樣:

https://ithelp.ithome.com.tw/upload/images/20261013/20172100CxuOj5qRET.png

問題不在於「慢」,而在於每一步都依賴人記得:

常見狀況 後果
忘記備份就覆蓋 出事回不去
複製到錯的資料夾 網站掛掉
只複製了部分檔案 新舊版混在一起,行為詭異
忘了某台機器也要更新 兩台行為不一致
換人操作 步驟不一樣,出錯機率變高

CI/CD 的價值是把這些步驟寫成固定流程,不會忘、不會漏、每次都一樣。


核心觀念

1. 失敗要早,不要晚

https://ithelp.ithome.com.tw/upload/images/20261013/20172100w7HuX7hgmM.png

程式編譯不過,應該在碰到伺服器之前就停下來,而不是傳上去才發現。

2. 備份要在動手之前

https://ithelp.ithome.com.tw/upload/images/20261013/20172100A8Atc4L6Uu.png

順序不能反。只要備份在前面,任何時候失敗都有還原點。

3. 失敗時不要自作聰明

系統應該停在安全的狀態,而不是嘗試自動修復。壞掉的版本悄悄上線,比停機還糟。


第二部分:實作範例

整體架構

https://ithelp.ithome.com.tw/upload/images/20261013/20172100MYT6nxLzB9.png

項目 我們用的
版控 自架 Gitea
CI/CD 引擎 Gitea Actions
建置機器 跟網站同一台伺服器
觸發方式 push 到 main 自動執行

手動 vs 自動

以前 現在
誰來發布 人工,一步一步做 系統自動
要多久 十幾分鐘,還要盯著 3-5 分鐘,不用管
會不會忘記步驟 會 不會,順序固定
出錯怎麼辦 靠記憶回復 完整備份,一行指令還原
誰能發布 會操作的人 任何能 push 的人
有沒有紀錄 沒有 每次都有完整執行紀錄

你要做的事

https://ithelp.ithome.com.tw/upload/images/20261013/20172100BcPcQi3oLr.png

第三步的位置:Gitea → 專案 → Actions 分頁

綠色勾勾=已上線,紅色叉叉=有問題。


系統會部署哪一個

不是每次都全部重來,系統會看你改了哪個資料夾:

https://ithelp.ithome.com.tw/upload/images/20261013/20172100sQj8BbvK2v.png

為什麼共用資料夾要全部部署:那些是三個系統共用的程式碼,改了它們等於三個系統的行為都可能變。

三個部署目標

系統 是什麼 類型
ApiSite 內部 API 網站
WebSite 業務系統 網站
Worker 排程程式 背景程式

一次部署做了哪些事

https://ithelp.ithome.com.tw/upload/images/20261013/20172100HL8RcYTSvl.png

使用者實際受影響的時間只有第 6-8 步,大約 15 秒。 前面的建置都不影響服務。


有些檔案不會被覆蓋

伺服器上有些東西是「這台機器自己的」,程式碼裡沒有:

檔案 為什麼要保留
資料庫連線設定 每台機器不一樣
報表定義 有些是直接在機器上加的
執行時產生的 log 不屬於程式碼
使用者產生的檔案 例如報表輸出

⚠️ 這些如果被誤刪就回不來了(版控裡沒有),所以系統特別排除它們。


出事了怎麼辦

情況一:建置失敗

程式編譯不過,系統在碰伺服器之前就停了。網站還是舊版,正常運作。

→ 修好再 push 一次。

情況二:部署到一半失敗

網站可能停在維護頁。系統不會自動恢復——這是故意的,寧可讓使用者看到維護中,也不要讓壞版本上線。

執行紀錄裡會有回滾指令,複製到伺服器執行即可回到部署前的狀態。

備份怎麼找

<備份根目錄>\<系統名>\20260101-083000_a1b2c3d
                      └─日期─┘└時間┘ └程式版本┘

看名字就知道是什麼時候、哪一版。

💡 為什麼用備份還原,不用 Git?
Git 裡只有程式碼,沒有伺服器上那些「機器自己的檔案」。備份是整個資料夾的快照,還原比較完整也比較快。


為什麼不容易出大事

保護 作用
建置失敗就停 編譯不過的程式碼永遠上不了線
備份排在更新之前 任何時候失敗都有還原點
檢查連線設定檔 缺了就停,避免網站變成錯誤頁
排除機器端檔案 使用者資料不會被程式碼蓋掉
失敗保留維護頁 壞版本不會悄悄上線
只部署有改的系統 沒改的完全不受影響

目前還沒有的東西

老實說,這套系統現在還有這些不足:

缺什麼 影響
自動化測試 只能檢查「編譯得過嗎」,不能檢查「功能對不對」
測試環境 只有一台正式機,push 上去就是上線
部署通知 出事不會主動通知,要自己去看
備份清理 備份會一直累積,需要定期手動清

其中最重要的是測試環境。現在等於「寫完直接上線」,如果改壞了,是使用者先發現,不是系統先發現。


常見問題

Q:我 push 了,網站怎麼沒變?
先確認 Actions 頁面是不是綠燈。另外檢查你改的檔案在不在該系統的資料夾底下。

Q:可以只部署某一個系統嗎?
可以。Actions → 執行工作流程,在 force 欄位指定目標。

Q:部署會中斷多久?
大約 15 秒,只有換檔案那段。前面建置的幾分鐘網站照常運作。

Q:可以回到更早的版本嗎?
可以,備份資料夾裡每次部署都有一份,挑要的版號還原即可。

Q:新同事 clone 下來要注意什麼?
連線字串不在版控裡,要自己建立(每個網站專案都有 .sample 範本可複製)。沒有這個檔案,網站會直接出錯。


延伸閱讀

想知道 看哪裡
精確的路徑、排除清單、環境需求 團隊內部規格文件
實際執行紀錄 Gitea → Actions
設定檔本身 repo 內 .gitea/workflows/

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言