CI/CD自动化部署最佳实践


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不仅是工具配置,更是一种开发文化。自动化的构建和部署流程可以减少人为错误,加快交付速度,让团队更专注于业务开发。建议从简单的流水线开始,逐步增加自动化程度。


0.068760s