Skip to content

於傳產 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 流程的話,再重新檢討佈署流程,建立更可靠的方案。


結語

本流程不會是最佳解,但是還是留個記錄,讓處境類似的人有機會參考。