於傳產 IT 環境建立自動佈署流程:Git、PowerShell、SFTP 與 SSH 的實務記錄
前言
由於公司是傳產,又橫跨多廠房,許多資訊系統都各自為政,主機、佈署環境、開發環境的管理人員和權責都不同, 因此,即便市面上有更好的工具或流程,也沒有辦法說導入就導入,造就了許多環境上的限制。
本流程的目標不是建立最先進或最完整的自動化佈署平台,而是在現有限制下:
- 減少重複的人工操作。
- 統一每次佈署的執行順序,以便於日後交接給其他人。
- 在佈署前檢查 Build 與必要設定,避免佈署到異常版本。
- 保存可供手動還原的歷史產物。
目前流程簡述
目前佈署的流程起點是由我手動執行 PowerShell 程式觸發,所以其實也不能算是完全自動化。 啟動佈署程式後的執行流程:
git pull要佈署的版本。- 選擇佈署目標是測試環境或正式環境。
- Build 後端 C# 專案和前端 Vue 專案。
- 若 Build 有拋錯則中止,人工檢查錯誤和通知對應開發人員。
- Build 成功後檢查關鍵設定是否符合。
- 設定也正確就將前後端專案分別做成壓縮檔。
- 依照一開始的選擇,建立 SSH 連線,使用 SFTP 將兩個壓縮檔上傳到對應的主機。
- 透過 SSH 下指令,在遠端主機上解壓縮後,執行遠端主機上的佈署程式。
- 遠端主機上的佈署程式由該主機管理員提供,所以後續流程不在本次文章範圍。
使用的技術列表
| 用途 | 使用技術 | 目前負責的工作 |
|---|---|---|
| 程式碼版本控制 | Git | 管理 C# 後端與 Vue 前端原始碼版本 |
| 流程主控 | PowerShell | 串接驗證、Build、打包、上傳與遠端指令 |
| 後端建置 | .NET CLI | 使用 dotnet publish 產生後端佈署檔案 |
| 前端建置 | pnpm | 執行 package.json 內定義的前端 Build Script |
| 壓縮打包 | 7-Zip | 將前後端產物分別壓縮成 ZIP |
| 遠端傳輸 | Posh-SSH/SFTP | 將 ZIP 產物上傳至遠端主機 |
| 遠端操作 | Posh-SSH/SSH | 遠端執行解壓縮與更新佈署程式 |
| 歷史產物 | 日期資料夾 | 依 yyyyMMdd 保存產物,供回溯與手動還原。目前佈署頻率很低,所以一天一版夠用。 |
詳細架構說明
text
手動取得最新版程式:git pull
│
▼
執行佈署程式,選擇佈署環境(測試環境/正式環境)
│
▼
後端建置:dotnet publish
│ └─ 失敗 → 中止
▼
佈署前防呆:驗證設定檔格式與關鍵值
│ └─ 缺值或格式錯誤 → 中止
▼
前端建置:pnpm run build
│ └─ 失敗 → 中止
▼
打包:7-Zip 分別壓縮前後端產物
│ └─ 失敗 → 中止
▼
上傳:透過 SFTP 傳送 ZIP
│ └─ 失敗 → 中止
▼
遠端解壓:透過 SSH 執行 unzip
│ └─ Exit Status 非 0 → 中止
▼
遠端套用:透過 SSH 執行更新佈署程式
│ └─ Exit Status 非 0 → 中止
▼
完成啟動佈署程式時,選擇佈署環境
- 啟動佈署程式時選擇目標環境:
- 測試環境。
- 正式環境。
- 依照環境載入不同設定:
- 遠端主機。
- SFTP/SSH 連線資訊。
- 本機專案與輸出路徑。
- 遠端上傳與佈署路徑。
- 前後端環境設定。
- 同一套佈署程式使用參數切換環境,避免分別維護多份流程邏輯。
佈署設定
- 主機、路徑及帳號等環境設定與 PowerShell 流程邏輯分離。
- 密碼不直接寫入佈署程式,另外從加密的密碼檔案讀取,或是執行時手動輸入。
- 除了密碼外,路徑和 IP 等都方便起見寫在程式內。
目前流程已解決的問題
- 將分散的 Build、壓縮、上傳與遠端操作整合成單一入口。
- 統一測試環境/正式環境的執行流程。
- Build 失敗時不再繼續佈署。
- 在上傳前檢查設定檔格式與必要欄位。
- 遠端指令失敗時可以取得 Exit Status 與錯誤訊息。
- 保存歷史 ZIP 產物,發生問題時仍有舊版可供手動還原。
未來可改進的地方
將佈署動作與 Git Commit 綁定
- 在正式機/測試機上建立程式監控 Git,或是定時檢查,如果佈署用分支有新版本就自動 Pull 下來佈署,這樣開發人員只要 Push 就可以自動佈署。
- 或是建立一台佈署用主機,監控或定時檢查 Git,抓新版本下來執行編譯檢查和佈署到對應主機。
- 相關的安全檢查和卡控都要記得做。
- 要另外建立還原舊版的操作流程。
加入佈署後 Health Check
- 建立檢查流程,在遠端更新完成後驗證:
- 後端 API 是否回傳成功。
- 前端首頁是否可存取。
- 服務程序是否正常。
- 不能只以檔案上傳或更新佈署程式執行完成,直接判定整個佈署成功。
增加 Log 與稽核資訊
- 可以將自動佈署的執行時間、Git 版本、結果等訊息另外存起來供日後備查。
- 可以存成
.log檔或是存入資料庫。
- 可以存成
Docker 佈署
- 有機會在佈署機安裝 Docker 的話,就可以將整體專案導入 Docker。
建立完整的 CI/CD 流程
未來有機會學習完整的 CI/CD 流程的話,再重新檢討佈署流程,建立更可靠的方案。
結語
本流程不會是最佳解,但是還是留個記錄,讓處境類似的人有機會參考。