deploylisted
Install: claude install-skill AsiaOstrich/universal-dev-standards
# 無 CI/CD 部署助手
> **語言**: [English](../../../../skills/deploy-assistant/SKILL.md) | 繁體中文
引導無 CI/CD 平台環境下的可靠部署,採用三層架構:防錯、驗證、快速回復。
## 三層部署架構
```
Layer 1:防止錯誤部署 Layer 2:驗證正確性 Layer 3:快速回復
set -euo pipefail Smoke Test + /health Blue-Green 切換
版本 tag 強制 版本號比對 rollback.sh < 30s
deploy.lock 並發守衛 驗證失敗自動回滾
```
## 引導式問答
| 問題 | 選項 | 影響 |
|------|------|------|
| 專案類型 | node / python / go / docker | 建置指令 |
| 部署目標 | SSH+rsync / Docker Compose | 傳輸方式 |
| Blue-Green 支援 | yes / no | rollback.sh 是否生成 |
| 健康檢查 URL | URL 輸入 | verify.sh 目標 |
| 版本來源 | VERSION 檔 / package.json / git tag | 版本比對邏輯 |
## 生成的腳本組
### deploy.sh — 主要部署腳本
```bash
#!/usr/bin/env bash
set -euo pipefail
LOCK_FILE="/tmp/deploy.lock"
trap "rm -f $LOCK_FILE" EXIT
# 防並發守衛
if [ -f "$LOCK_FILE" ]; then
echo "❌ 已有部署進行中(PID: $(cat $LOCK_FILE))"
exit 1
fi
echo $$ > "$LOCK_FILE"
# 版本 tag 強制
CURRENT_TAG=$(git describe --exact-match --tags HEAD 2>/dev/null || echo "")
if [ -z "$CURRENT_TAG" ]; then
echo "❌ HEAD 沒有版本 tag。請執行:git tag vX.Y.Z && git push --tags"
exit 1
fi
echo "[1/4] 執行測試..."
# {TEST_COMMAND}
echo "[2/4] 建置產物..."
# {BUILD_COMMAND}
echo "[3/4] 同步至伺服器..."
rsync -avz --delete ./dist/ {USER}@{SERVER}:/app/
echo "[4/4] 驗證部署..."
./verify.sh || { echo "驗證失敗,啟動回滾..."; ./rollback.sh; exit 1; }
echo "{\"timestamp\":\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\",\"version\":\"$CURRENT_TAG\",\"operator\":\"$(whoami)\",\"re