部署(Deployment)是軟體開發生命週期的最後階段,將經過測試的程式碼、配置與依賴從開發環境正式推送到生產環境,讓使用者能存取並使用應用程式。它包含硬體配置、軟體安裝、環境變數設定、資料庫遷移等一系列活動,確保系統穩定、安全且高效運行,是「開發完成」到「服務上線」的關鍵橋樑。
部署的核心流程與階段
完整部署流程涵蓋多個階段,形成標準管道:
程式碼 → 建置 → 測試 → 容器化 → 部署 → 監控 → 回饋
Git Push → Docker → QA → Staging → Production → Observability
典型步驟:
-
建置(Build):編譯程式碼、打包依賴(如
npm build、mvn package) -
測試:自動化單元、整合、端到端測試
-
容器化:Docker 映像檔封裝應用與環境
-
部署:推送至伺服器、雲端平台或 Kubernetes
-
驗證:健康檢查、煙霧測試(Smoke Test)
-
監控:日誌、效能指標、錯誤追蹤
部署環境的分類
現代開發採用多環境策略:
| 環境 | 用途 | 配置 | 資料 |
|---|---|---|---|
| 開發(Dev) | 功能開發 | 模擬生產 | 假資料 |
| 測試(Test/QA) | 功能驗證 | 接近生產 | 測試資料 |
| 預備(Staging) | 最終驗證 | 完全複製生產 | 生產副本 |
| 生產(Prod) | 正式服務 | 正式配置 | 真實使用者資料 |
部署策略比較
| 策略 | 停機時間 | 風險 | 複雜度 | 適用場景 |
|---|---|---|---|---|
| 傳統部署 | 長(數分鐘) | 高 | 低 | 小型專案 |
| 藍綠部署 | 零停機 | 低 | 中 | 高可用服務 |
| 金絲雀發布 | 漸進 | 中 | 中 | 新功能測試 |
| 滾動更新 | 短暫 | 中 | 高 | Kubernetes |
| 無伺服器 | 零 | 低 | 低 | 事件驅動 |
藍綠部署範例:
藍環境(舊版,承載 100% 流量)
↓ 部署新版
綠環境(新版,0% 流量)
↓ 切換路由器(5 秒)
藍環境(舊版,0% 流量)← 回滾備用
綠環境(新版,100% 流量)
現代部署技術棧
容器化與容器編排
# Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
# docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
depends_on:
- db
db:
image: postgres:15
CI/CD 管道(GitHub Actions)
name: Deploy to Production
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build Docker
run: docker build -t myapp .
- name: Deploy to Server
uses: appleboy/[email protected]
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_KEY }}
script: |
docker pull myapp
docker stop myapp || true
docker run -d -p 80:3000 --name myapp myapp
雲端部署平台
| 平台 | 特色 | 定價模式 |
|---|---|---|
| Vercel | 前端部署、Serverless | 按使用量 |
| Netlify | 靜態網站、Jamstack | 按流量 |
| Heroku | PaaS、Git 部署 | Dynos/小時 |
| Railway | 全端部署、內建 DB | 按資源 |
| Render | Docker、原生支援 | 按運行時間 |
| AWS | 全功能雲端 | 複雜計價 |
部署自動化最佳實務
1. 基礎設施即程式碼(IaC):
# Terraform
resource "aws_instance" "app" {
ami = "ami-12345678"
instance_type = "t3.micro"
tags = {
Name = "my-app-server"
}
}
2. 健康檢查與回滾:
# Kubernetes
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
3. 監控與觀測性:
日誌:ELK Stack、Loki
指標:Prometheus、Grafana
追蹤:Jaeger、OpenTelemetry
告警:PagerDuty、Slack
部署清單(Checklist)
- 建置成功,測試通過
- 環境變數正確配置
- 資料庫遷移執行
- 靜態資源壓縮/CDN
- HTTPS/SSL 憑證
- 健康檢查通過
- 煙霧測試 OK
- 監控告警設定
- 回滾方案就緒
- 文件更新
常見問題與解決方案
停機問題:使用藍綠部署、金絲雀發布
配置漂移:GitOps、IaC、ConfigMap
密鑰洩漏:Secrets Manager、Vault
效能瓶頸:容器資源限制、負載平衡
部署是軟體交付的生命線,從手動 FTP 到自動化 CI/CD,代表開發成熟度。現代 DevOps 強調「頻繁、小幅度、安全」部署,實現真正的持續交付(Continuous Delivery)。掌握部署技能,就能將程式碼轉化為穩定服務,成為完整的全端工程師。