讓「改完程式」到「上線」這段路自動化,而且每一步都可以檢查、可以還原。
| 全名 | 中文 | 在做什麼 | |
|---|---|---|---|
| CI | Continuous Integration | 持續整合 | 每次改動都自動建置檢查,確認「還能編譯、還能跑」 |
| CD | Continuous Deployment | 持續部署 | 檢查通過後,自動送上伺服器 |
簡單說:

CI 是守門員,CD 是搬運工。 守門員沒放行,搬運工就不會動。
傳統的手動發布長這樣:

問題不在於「慢」,而在於每一步都依賴人記得:
| 常見狀況 | 後果 |
|---|---|
| 忘記備份就覆蓋 | 出事回不去 |
| 複製到錯的資料夾 | 網站掛掉 |
| 只複製了部分檔案 | 新舊版混在一起,行為詭異 |
| 忘了某台機器也要更新 | 兩台行為不一致 |
| 換人操作 | 步驟不一樣,出錯機率變高 |
CI/CD 的價值是把這些步驟寫成固定流程,不會忘、不會漏、每次都一樣。

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

順序不能反。只要備份在前面,任何時候失敗都有還原點。
系統應該停在安全的狀態,而不是嘗試自動修復。壞掉的版本悄悄上線,比停機還糟。

| 項目 | 我們用的 |
|---|---|
| 版控 | 自架 Gitea |
| CI/CD 引擎 | Gitea Actions |
| 建置機器 | 跟網站同一台伺服器 |
| 觸發方式 | push 到 main 自動執行 |
| 以前 | 現在 | |
|---|---|---|
| 誰來發布 | 人工,一步一步做 | 系統自動 |
| 要多久 | 十幾分鐘,還要盯著 | 3-5 分鐘,不用管 |
| 會不會忘記步驟 | 會 | 不會,順序固定 |
| 出錯怎麼辦 | 靠記憶回復 | 完整備份,一行指令還原 |
| 誰能發布 | 會操作的人 | 任何能 push 的人 |
| 有沒有紀錄 | 沒有 | 每次都有完整執行紀錄 |

第三步的位置:Gitea → 專案 → Actions 分頁
綠色勾勾=已上線,紅色叉叉=有問題。
不是每次都全部重來,系統會看你改了哪個資料夾:

為什麼共用資料夾要全部部署:那些是三個系統共用的程式碼,改了它們等於三個系統的行為都可能變。
| 系統 | 是什麼 | 類型 |
|---|---|---|
| ApiSite | 內部 API | 網站 |
| WebSite | 業務系統 | 網站 |
| Worker | 排程程式 | 背景程式 |

使用者實際受影響的時間只有第 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/ |