第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分钟内知道结果
# 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 buildCI 的要求:
- 快速:整个流程在10分钟内完成
- 可靠:每次运行结果一致
- 自修复:失败后自动重试或通知
2.2 持续交付(CD)
持续交付:每次变更都可部署到生产,但需要手动触发。
持续部署:每次变更自动部署到生产,无需人工干预。
# 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_SHA2.3 测试金字塔
/ E2E \ ← 少量(10%)
/ 集成测试 \ ← 中量(20%)
/ 单元测试 \ ← 大量(70%)- 单元测试:测试单个函数/类,最快、最多
- 集成测试:测试模块间交互,中等速度
- E2E 测试:测试完整流程,最慢、最少
// 单元测试
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
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
# 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: restarted2.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 流水线
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/app3.2 Terraform 部署
# 初始化
terraform init
# 计划
terraform plan
# 应用
terraform apply
# 销毁
terraform destroy四、本章小结
持续集成:频繁集成、自动化构建和测试、快速反馈。
持续交付:每次变更都可部署,手动触发。
测试金字塔:单元测试(多)→ 集成测试(中)→ E2E测试(少)。
基础设施即代码:Terraform、Ansible,可重复、可版本控制。
部署策略:蓝绿部署(零停机)、金丝雀发布(风险小)、滚动更新(省资源)。
五、思考与练习
思考题
持续交付和持续部署的区别是什么?你的团队适合哪种?
为什么单元测试要占测试的70%?
蓝绿部署和金丝雀发布各适合什么场景?
IaC 如何保证基础设施的一致性?
练习题
为你的项目搭建完整的 CI/CD 流水线。
实现测试金字塔:编写单元测试、集成测试和少量 E2E 测试。
使用 Terraform 管理基础设施。
实现金丝雀发布策略。