CI/CD自动化部署最佳实践
持续集成/持续部署(CI/CD)是现代软件开发的基石,它通过自动化构建、测试和部署流程,帮助团队快速、安全地交付软件。本文将介绍CI/CD的核心概念和实战配置。
一、GitHub Actions配置
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm run lint
- run: npm run test
- run: npm run build
deploy:
needs: test
runs-on: ubuntu-latest
if: github.ref == "refs/heads/main"
steps:
- uses: actions/checkout@v4
- name: Deploy to server
uses: appleboy/ssh-action@v1
with:
host: secrets.SERVER_HOST
username: deploy
key: secrets.SSH_PRIVATE_KEY
script: |
cd /var/www/myapp
git pull origin main
npm ci --production
npm run migrate
pm2 restart app
二、GitLab CI配置
# .gitlab-ci.yml
stages:
- test
- build
- deploy
variables:
DOCKER_IMAGE: registry.example.com/myapp
test:
stage: test
image: node:20
script:
- npm ci
- npm run test
coverage: "/Statements.*?(d+)%/"
build:
stage: build
image: docker:24
services:
- docker:24-dind
script:
- docker build -t DOCKER_IMAGE:CI_COMMIT_SHA .
- docker push DOCKER_IMAGE:CI_COMMIT_SHA
only:
- main
deploy_production:
stage: deploy
image: alpine:3.18
script:
- ssh deploy@server "docker pull DOCKER_IMAGE:CI_COMMIT_SHA && docker-compose up -d"
only:
- main
when: manual
三、Docker多阶段构建
# Dockerfile - 多阶段构建
# 构建阶段
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 生产阶段
FROM node:20-alpine AS production
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/main.js"]
四、部署策略
# 蓝绿部署
# 两套完全相同的生产环境(蓝/绿)
# 部署到空闲环境 → 验证 → 切换流量
# 滚动更新(Kubernetes)
kubectl set image deployment/myapp myapp=myapp:v2
kubectl rollout status deployment/myapp
# 金丝雀发布
# 先向新版本发送5%流量
# 逐步增加到25% → 50% → 100%
apiVersion: v1
kind: Service
metadata:
name: myapp-canary
spec:
selector:
app: myapp
track: canary
CI/CD不仅是工具配置,更是一种开发文化。自动化的构建和部署流程可以减少人为错误,加快交付速度,让团队更专注于业务开发。建议从简单的流水线开始,逐步增加自动化程度。