用 Shell 腳本實作簡單的 CI/CD
在現代軟體開發中,持續整合與持續部署(CI/CD)通常依賴 Jenkins、GitLab CI 或 GitHub Actions 等複雜工具。然而,對於小型專案、個人開發者或初學者而言,這些工具往往顯得過於沉重。其實,透過簡單的 Shell 腳本,我們就能建立一套輕量級、透明且易於維護的自動化流程。這篇文章將帶你如何用原生 Shell 指令,實作一個具備基本功能的 CI/CD 腳本。
核心概念與環境準備
CI/CD 的核心在於「自動化」。我們需要模擬一個典型的開發流程:程式碼拉取、依賴安裝、編譯或測試、以及部署。為了確保範例通用性,我們將使用 Ubuntu 22.04 或 Debian 12 作為基礎環境,並假設我們正在處理一個簡單的 Node.js 專案(因為其依賴管理簡單,易於理解邏輯)。
首先,請確保你的系統已安裝必要的基礎工具。打開終端機,執行以下指令來安裝 git 和 curl,並確認 nodejs 與 npm 已安裝:
sudo apt update
sudo apt install -y git curl nodejs npm
實作自動化腳本
我們將創建一個名為 deploy.sh 的腳本。這個腳本將扮演 CI(持續整合)與 CD(持續部署)的角色。它會執行以下步驟:
- 檢查當前目錄是否為 Git 倉庫。
- 拉取最新程式碼。
- 安裝依賴並執行測試。
- 模擬部署動作。
請建立檔案 deploy.sh 並貼入以下內容:
#!/bin/bash
# 設定顏色輸出,提升可讀性
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 定義專案根目錄,這裡假設腳本位於專案根目錄
PROJECT_DIR=$(pwd)
echo -e "${GREEN}=== 開始 CI/CD 流程 ===${NC}"
# Step 1: 檢查 Git 狀態
echo -e "${YELLOW}[Step 1] 檢查 Git 狀態...${NC}"
if ! git rev-parse --is-inside-work-tree > /dev/null 2>&1; then
echo -e "${RED}錯誤:當前目錄不是 Git 倉庫${NC}"
exit 1
fi
# Step 2: 拉取最新程式碼 (CI 階段)
echo -e "${YELLOW}[Step 2] 拉取最新程式碼...${NC}"
git pull origin main 2>/dev/null
if [ $? -ne 0 ]; then
echo -e "${RED}警告:拉取失敗,可能是本地有未提交的變更${NC}"
# 在實際 CI 環境中,這裡通常會直接 exit 1 終止流程
# 為了教學演示,我們繼續執行
fi
# Step 3: 安裝依賴與測試
echo -e "${YELLOW}[Step 3] 安裝依賴並執行測試...${NC}"
if [ -f "package.json" ]; then
npm ci --silent
if [ $? -ne 0 ]; then
echo -e "${RED}錯誤:npm ci 失敗${NC}"
exit 1
fi
npm test --silent
if [ $? -ne 0 ]; then
echo -e "${RED}錯誤:測試失敗,中止部署${NC}"
exit 1
fi
echo -e "${GREEN}測試通過!${NC}"
else
echo "未發現 package.json,跳過 npm 步驟。"
fi
# Step 4: 模擬部署 (CD 階段)
echo -e "${YELLOW}[Step 4] 執行部署...${NC}"
# 這裡模擬將檔案複製到伺服器或重新啟動服務
if [ -d "dist" ]; then
rm -rf /tmp/deploy-target
cp -r dist /tmp/deploy-target
echo -e "${GREEN}部署成功!檔案已複製至 /tmp/deploy-target${NC}"
else
echo "沒有 dist 目錄,模擬部署完成。"
fi
echo -e "${GREEN}=== CI/CD 流程完成 ===${NC}"
儲存後,請賦予腳本執行權限:
chmod +x deploy.sh
執行與驗證
現在,你可以在任何 Git 倉庫目錄下執行該腳本:
./deploy.sh
若一切正常,你應該會看到綠色文字提示流程完成。若程式碼有錯誤或測試失敗,腳本會以紅色文字警告並中止後續步驟,這正是 CI/CD 的關鍵價值:早期發現問題。
常見問題與解決方案
1. 腳本在 CI 環境中權限不足或路徑錯誤?
在自動化環境中,環境變數與使用者權限是常見陷阱。建議在腳本開頭加入 set -e,讓腳本在任何指令失敗時立即停止,避免錯誤疊加。此外,使用絕對路徑或明確的變數定義專案路徑,可減少因工作目錄(CWD)變動導致的錯誤。
2. 如何處理敏感資訊(如密碼或金鑰)?
絕對不要將密碼寫在腳本中。應使用環境變數或 .env 檔案(需加入 .gitignore)。在腳本中透過 ${VAR_NAME} 讀取,並在執行 CI 系統或伺服器時設定對應的環境變數。例如:API_KEY=$API_KEY ./deploy.sh。
小結
透過這段簡單的 Shell 腳本,我們不僅實作了自動化部署,更理解了 CI/CD 的本質:將重複性手動工作轉為可重複、可追蹤的自動化流程。雖然它無法取代大型 CI/CD 平台的高階功能(如平行建構、雲端擴展),但對於小型專案而言,這種透明且輕量級的解決方案往往更具彈性與可維護性。建議你將此腳本作為起點,根據實際需求逐步加入日誌記錄、錯誤通知或平行任務等進階功能。