TL;DR
學會用 Claude Code 的自訂 Skill 打造/ship一鍵部署指令——結合 CLAUDE.md 設定檔和 Zeabur CLI,30 秒內完成 commit + 部署,不再手動敲 git 指令。
這篇文章適合:
- 用 Claude Code 開發,每次部署都要手動跑一堆指令覺得煩的人
- 想學 Claude Code 自訂 Skill(Agent Skill)實戰用法的開發者
- 用 Zeabur 部署專案,想把流程自動化的人
在開發過程中,「改完程式碼 → commit → 部署」是最常見的重複操作。如果每次都要手動執行 git 指令、再到雲端平台觸發部署,不僅耗時,還容易出錯。
這篇文章分享我如何透過 Claude Code 的自訂 Skill功能,搭配專案的 CLAUDE.md 設定檔,打造一個 /ship 指令——只需一句話,就能自動完成 commit 並部署到 Zeabur。
整體架構
整個流程由兩個部分組成:
- CLAUDE.md:在專案根目錄定義 Zeabur 的部署資訊(Project ID、Service ID)
/shipSkill:一個自訂的 Claude Code 指令,讀取設定後自動執行 commit + 部署
專案根目錄/
├── CLAUDE.md ← 部署設定(Zeabur ID)
├── src/
└── ...
~/.claude/skills/
└── ship/
└── SKILL.md ← /ship 指令定義步驟一:在 CLAUDE.md 設定 Zeabur 部署資訊
在專案根目錄的 CLAUDE.md 中,加入 Zeabur 的部署設定:
## Zeabur 部署設定
| 欄位 | 值 |
|------|---|
| Project | `698abc25405b9ae67f723ec1` (HRWorkshop) |
| Service | `698ac01a405b9ae67f7242d0` (offline-workshop) |
> **注意**:Zeabur CLI 只接受純 ID,不需要加 `project-` 或 `service-` 前綴。
部署指令:
\`\`\`bash
zeabur deploy --service-id 698ac01a405b9ae67f7242d0 -i=false
\`\`\`這裡的重點是:用表格同時保留人類可讀的名稱和機器需要的 ID,並用註解提醒前綴的注意事項。
步驟二:建立 /ship 自訂 Skill
在 ~/.claude/skills/ship/SKILL.md 中定義指令邏輯:
---
model: haiku
---
請執行以下步驟:
## 步驟一:準備變更
1. 執行 `git status` 確認有哪些變更
2. 如果沒有任何變更,製造一個微小的變更來觸發部署
3. 用 `git add .` 加入所有變更
4. 自動產生簡潔的 commit 訊息
## 步驟二:部署
讀取專案的 CLAUDE.md,檢查是否有定義 Zeabur 部署設定。
### 情境 A:有 Zeabur 設定
1. 先 commit 變更
2. 執行 `zeabur deploy --service-id <SERVICE_ID> -i=false`
3. 確認部署成功
### 情境 B:沒有 Zeabur 設定
1. 用 `git push origin main` 推送到 GitHub
2. 確認推送成功這個設計有幾個巧思:
- 使用
model: haiku:部署操作不需要太強的推理能力,用輕量模型即可,速度更快、成本更低 - 自動偵測部署目標:根據 CLAUDE.md 有無 Zeabur 設定,自動決定走 Zeabur 還是 GitHub 部署
- 無變更也能部署:如果只是想重新部署(例如環境變數改了),會自動製造微小變更觸發流程
步驟三:實際使用
在終端機輸入 /ship,Claude Code 就會:
- 檢查 git 狀態,確認有哪些變更
- 自動加入所有變更到暫存區
- 根據變更內容生成 commit 訊息
- 讀取 CLAUDE.md 取得 Zeabur Service ID
- 執行
zeabur deploy完成部署
整個過程大約 30 秒內完成,完全不需要手動操作。
踩坑紀錄:Zeabur CLI 的 ID 前綴問題
這個流程最大的坑是 Zeabur CLI 的 ID 格式。
在 Zeabur Dashboard 的 URL 中,ID 會帶有前綴:
https://zeabur.com/projects/project-698abc25405b9ae67f723ec1/services/service-698ac01a405b9ae67f7242d0但在 CLI 中,不需要 project- 或 service- 前綴:
# 正確
zeabur deploy --service-id 698ac01a405b9ae67f7242d0 -i=false
# 錯誤(會回傳 SERVICE_NOT_FOUND)
zeabur deploy --service-id service-698ac01a405b9ae67f7242d0 -i=false另外,非互動模式的參數是 -i=false,不是 --interactive=false。
這些細節如果沒踩過一次,很難從文件中直接發現。建議在 CLAUDE.md 中明確標註,避免未來重複踩坑。
小結
透過 CLAUDE.md + 自訂 Skill 的組合,我們實現了:
- 一句指令完成部署:不再需要記住 git 指令和 Zeabur CLI 參數
- 專案級設定:每個專案可以有自己的部署目標,設定跟著程式碼走
- 智慧判斷:自動根據設定決定部署到 Zeabur 或 GitHub
- 低成本執行:用 Haiku 模型處理機械性操作,節省 token
這個模式不只適用於 Zeabur,任何需要「讀取設定 → 執行部署」的場景都可以用類似的方式實現。
