6DevOps 实践指南

技术实践

自动化与基础设施即代码

自动化IaC配置管理

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第6章:技术实践(Technical Practices)

一、导读

1.1 本章学习目标

本章聚焦 DevOps 的核心技术实践:持续集成、持续交付、自动化测试、基础设施即代码。

本章的核心学习目标包括:

  • 掌握持续集成(CI):频繁集成、快速反馈。
  • 掌握持续交付(CD):每次变更都可部署。
  • 理解测试金字塔:单元测试、集成测试、E2E 测试。
  • 掌握基础设施即代码(IaC):Terraform、Ansible。
  • 掌握部署策略:蓝绿部署、金丝雀发布。

1.2 为什么本章如此重要

技术实践是 DevOps 的落地手段。没有这些实践,DevOps 的原则就无法实现。CI/CD 是流动原则的核心实现,自动化测试是反馈原则的基础,IaC 是持续学习的前提。

1.3 核心问题引导

持续集成和持续交付的区别是什么?

测试金字塔如何指导测试策略?

基础设施即代码有什么优势?

蓝绿部署和金丝雀发布有什么区别?


二、核心概念详解

2.1 持续集成(CI)

持续集成的实践:

  • 频繁集成:每天至少集成一次
  • 自动化构建:代码提交触发自动构建
  • 自动化测试:构建后自动运行测试
  • 快速反馈:10分钟内知道结果
yaml
# GitHub Actions CI
name: CI
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
      - name: Install dependencies
        run: npm ci
      - name: Run tests
        run: npm test
      - name: Run lint
        run: npm run lint
      - name: Build
        run: npm run build

CI 的要求:

  • 快速:整个流程在10分钟内完成
  • 可靠:每次运行结果一致
  • 自修复:失败后自动重试或通知

2.2 持续交付(CD)

持续交付:每次变更都可部署到生产,但需要手动触发。

持续部署:每次变更自动部署到生产,无需人工干预。

yaml
# GitHub Actions CD
name: CD
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Build Docker image
        run: docker build -t app:$GITHUB_SHA .
      - name: Push to registry
        run: |
          docker login -u ${{ secrets.REGISTRY_USER }} -p ${{ secrets.REGISTRY_PASS }}
          docker push app:$GITHUB_SHA
      - name: Deploy to production
        run: |
          kubectl set image deployment/app app=app:$GITHUB_SHA

2.3 测试金字塔

/  E2E  \        ← 少量(10%)
       / 集成测试 \       ← 中量(20%)
      / 单元测试   \     ← 大量(70%)
  • 单元测试:测试单个函数/类,最快、最多
  • 集成测试:测试模块间交互,中等速度
  • E2E 测试:测试完整流程,最慢、最少
javascript
// 单元测试
describe('Calculator', () => {
  it('should add two numbers', () => {
    expect(add(1, 2)).toBe(3);
  });
});

// 集成测试
describe('User API', () => {
  it('should create user', async () => {
    const response = await request(app)
      .post('/api/users')
      .send({ name: 'John' });
    expect(response.status).toBe(201);
  });
});

// E2E 测试
describe('User Registration', () => {
  it('should register a new user', async () => {
    await browser.url('/register');
    await browser.setValue('#name', 'John');
    await browser.setValue('#email', 'john@example.com');
    await browser.click('#submit');
    await expect(browser).toHaveUrl('/dashboard');
  });
});

2.4 基础设施即代码(IaC)

IaC 的优势:

  • 可重复:相同代码创建相同基础设施
  • 可版本控制:变更记录在 Git 中
  • 可审计:谁在什么时候做了什么变更
  • 可自动化:CI/CD 流水线自动部署

Terraform

hcl
provider "aws" {
  region = "us-east-1"
}

resource "aws_instance" "web" {
  count         = 3
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.micro"

  tags = {
    Name = "web-server-${count.index}"
    Env  = "production"
  }
}

resource "aws_lb" "web" {
  name               = "web-lb"
  load_balancer_type = "application"
  subnets            = aws_subnet.public[*].id
}

Ansible

yaml
# playbook.yml
- hosts: webservers
  become: yes
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present

    - name: Copy config
      copy:
        src: nginx.conf
        dest: /etc/nginx/nginx.conf
      notify: Restart nginx

    - name: Start nginx
      service:
        name: nginx
        state: started
        enabled: yes

  handlers:
    - name: Restart nginx
      service:
        name: nginx
        state: restarted

2.5 部署策略

2.5.1 蓝绿部署

蓝环境(当前生产) ← 流量
绿环境(新版本)    ← 部署新版本

切换:将流量从蓝切到绿
回滚:将流量从绿切回蓝

优点:零停机、快速回滚

缺点:需要双倍资源

2.5.2 金丝雀发布

生产环境:100个实例
金丝雀:1个实例(新版本)

步骤:
1. 部署1个金丝雀实例(1%流量)
2. 监控5分钟
3. 无异常 → 扩展到10个实例(10%流量)
4. 监控5分钟
5. 无异常 → 扩展到100个实例(100%流量)
6. 异常 → 自动回滚

优点:风险小、逐步验证

缺点:需要负载均衡器支持

2.5.3 滚动更新

6个实例,每次更新1个

步骤:
1. 更新实例1 → 健康检查通过
2. 更新实例2 → 健康检查通过
3. ...
4. 更新实例6 → 完成

优点:不需要额外资源

缺点:回滚慢


三、实战案例

3.1 完整的 CI/CD 流水线

yaml
name: CI/CD Pipeline
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Test
        run: npm test
      - name: Lint
        run: npm run lint

  build-and-deploy:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Build Docker image
        run: docker build -t app:$GITHUB_SHA .
      - name: Deploy to production
        run: |
          kubectl set image deployment/app app=app:$GITHUB_SHA
          kubectl rollout status deployment/app

3.2 Terraform 部署

bash
# 初始化
terraform init

# 计划
terraform plan

# 应用
terraform apply

# 销毁
terraform destroy

四、本章小结

持续集成:频繁集成、自动化构建和测试、快速反馈。

持续交付:每次变更都可部署,手动触发。

测试金字塔:单元测试(多)→ 集成测试(中)→ E2E测试(少)。

基础设施即代码:Terraform、Ansible,可重复、可版本控制。

部署策略:蓝绿部署(零停机)、金丝雀发布(风险小)、滚动更新(省资源)。


五、思考与练习

思考题

持续交付和持续部署的区别是什么?你的团队适合哪种?

为什么单元测试要占测试的70%?

蓝绿部署和金丝雀发布各适合什么场景?

IaC 如何保证基础设施的一致性?

练习题

为你的项目搭建完整的 CI/CD 流水线。

实现测试金字塔:编写单元测试、集成测试和少量 E2E 测试。

使用 Terraform 管理基础设施。

实现金丝雀发布策略。

6/6技术实践
0%