11.2.3 部署流水线:自动化部署到生产环境
一句话破题
部署流水线实现代码合并后自动发布到生产环境,消除手动部署的繁琐和风险。
核心价值
配置自动部署能让你:
- 每次发布流程完全一致
- 减少人为操作失误
- 实现快速、频繁的发布
部署到 Vercel
Vercel 对 Next.js 项目提供开箱即用的支持:
yaml
# .github/workflows/deploy.yml
name: Deploy to Vercel
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy to Vercel
uses: amondnet/vercel-action@v25
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
vercel-args: '--prod'部署到自有服务器
通过 SSH 部署到自有服务器:
yaml
name: Deploy to Server
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install and Build
run: |
npm ci
npm run build
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /var/www/my-app
git pull origin main
npm ci --production
npm run build
pm2 restart my-app使用 Docker 部署
yaml
name: Deploy with Docker
on:
push:
tags: ['v*']
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and Push
uses: docker/build-push-action@v5
with:
push: true
tags: ghcr.io/${{ github.repository }}:${{ github.ref_name }}
- name: Deploy to Server
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
docker pull ghcr.io/${{ github.repository }}:${{ github.ref_name }}
docker-compose up -d部署环境区分
yaml
jobs:
deploy-staging:
if: github.ref == 'refs/heads/develop'
environment: staging
# ...
deploy-production:
if: github.ref == 'refs/heads/main'
environment: production
# ...部署后验证
yaml
verify:
needs: deploy
runs-on: ubuntu-latest
steps:
- name: Health Check
run: |
for i in {1..10}; do
if curl -s https://my-app.com/api/health | grep -q '"status":"ok"'; then
echo "Health check passed"
exit 0
fi
sleep 5
done
echo "Health check failed"
exit 1避坑指南
新手最容易犯的错
- 没有配置环境区分导致误部署到生产
- 部署后没有健康检查
- 没有准备回滚方案
- 在部署脚本中硬编码敏感信息
