DevOps - 持续部署
持续部署 (CD) 是 DevOps 流程的高级部分。它会自动将经过验证的更改从版本控制直接推送到生产环境。此过程中无需手动批准。与等待人工批准的持续交付不同,持续部署使用自动化来确保更快的发布。
持续部署的主要功能
以下是持续部署的主要功能 −
- 用于构建、测试和部署代码的完全自动化流程。
- 强大的测试和验证机制,如单元、集成和性能测试。
- 可以顺利处理基础设施和应用程序更新的工具和脚本。
持续部署、持续集成和持续交付
下表重点介绍了持续部署、持续集成和持续交付之间的主要区别 −
| 方面 | 持续集成 | 持续交付 | 持续部署 |
|---|---|---|---|
| 定义 | 将代码更改自动放入共享存储库。 | 确保代码在通过测试后始终可以发布。 | 完全自动化将代码部署到生产环境,无需手动步骤。 |
| 重点领域 | 代码合并和测试。 | 准备构建以进行部署。 | 自动部署到生产环境。 |
| 自动化级别 | 部分自动化(构建和测试)。 | 几乎完全自动化,但需要手动批准生产。 | 端到端完全自动化部署。 |
| 关键活动 |
|
|
|
| 工具 | Jenkins、GitHub Actions、GitLab CI/CD、CircleCI。 | ArgoCD、Spinnaker、AWS CodePipeline。 | Kubernetes、Terraform、Jenkins(带插件)、GitOps 工具。 |
| 风险级别 | 低,因为它专注于测试和代码合并。 | 中等,因为生产版本需要手动批准。 | 高,因为部署无需人工检查即可直接投入生产。 |
| 好处 |
|
|
|
| 挑战 |
|
|
|
设置持续部署管道
我们可以通过自动化构建、测试和部署代码的过程来设置持续部署 (CD) 管道。让我们一步一步来创建这个工作流程。
步骤 1:选择和配置版本控制系统 (VCS)
像 Git 这样的版本控制系统可以帮助我们管理代码更改。当开发人员将他们的更新推送到存储库时,CD 管道会自动启动。
示例:创建一个新的 GitHub 存储库 −
# 在本地初始化 Git 存储库 git init # 添加远程存储库 git remote add origin https://github.com/user/project.git # 提交并推送代码 git add . git commit -m "Initial commit" git push -u origin main
我们可以使用 webhook 将此存储库连接到 Jenkins 或 GitHub Actions 等 CI/CD 工具。
第 2 步:设置 CI/CD 工具
我们需要一个 CI/CD 工具,如 GitHub Actions、Jenkins 或 GitLab CI/CD。此工具可自动执行构建、测试和部署等步骤。
示例:(GitHub Actions 配置)
在存储库中创建 .github/workflows/deployment.yml 文件 −
name: CI/CD Pipeline
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 16
- name: Install Dependencies
run: npm install
- name: Run Tests
run: npm test
- name: Build Application
run: npm run build
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Deploy to Server
run: |
scp -r ./build user@your-server:/var/www/app
此管道执行两项操作 −
- 每次我们将代码推送到主程序时,它都会构建和测试应用程序
- 它使用 scp 将应用程序部署到服务器。
步骤 3:自动化测试
自动化测试对于确保代码稳定非常重要。我们可以添加单元测试、集成测试和端到端测试。
示例(用于单元测试的 Jest)
将测试脚本添加到 package.json −
"scripts": {
"test": "jest"
}
使用 − 在管道中自动运行这些测试
npm test
步骤 4:配置部署自动化
部署自动化有助于将测试过的代码转移到生产环境,而无需手动操作。Terraform 等工具使这个过程变得顺畅。
示例(Terraform for AWS 部署) −
provider "aws" {
region = "us-west-2"
}
resource "aws_s3_bucket" "static_site" {
bucket = "my-static-site"
acl = "public-read"
}
resource "aws_s3_bucket_object" "index" {
bucket = aws_s3_bucket.static_site.bucket
key = "index.html"
source = "build/index.html"
content_type = "text/html"
}
运行 Terraform 命令进行部署 −
terraform init terraform apply
第 5 步:集成基础设施即代码 (IaC)
Kubernetes 等 IaC 工具可帮助我们管理环境。
示例 (Kubernetes 部署) −
编写一个 deploy.yaml 文件 −
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: my-app-image:latest
ports:
- containerPort: 80
应用此配置。
kubectl apply -f deploy.yaml
第 6 步:实现监控和反馈循环
我们需要监控工具来检查应用程序的性能。Prometheus 和 Grafana 等工具很有帮助。
示例(Prometheus 配置) −
scrape_configs:
- job_name: "app"
static_configs:
- targets: ["localhost:9090"]
第 7 步:测试端到端管道
最后,将更改推送到存储库并确保一切正常:
- 构建 − 编译应用程序。
- 测试 − 运行测试以查找问题。
- 部署 − 将应用程序推送到服务器。
通过结合版本控制、CI/CD 工具、测试和 IaC,我们可以确保管道顺畅可靠。这有助于更快地交付更新并减少错误。
实施部署策略
下表重点介绍了 DevOps 中的持续部署策略 −
| 部署策略 | 描述 | 用例/优势 |
|---|---|---|
| 蓝绿部署 | 蓝绿部署使用两个环境(蓝色和绿色)。一个环境(蓝色)运行应用程序的当前版本,另一个环境(绿色)运行新版本。当新版本准备就绪时,我们将流量切换为绿色。如果需要,蓝色环境将保留以进行回滚。 | 此方法有助于避免部署期间的停机。它非常适合需要零停机时间和快速回滚的应用程序。它还确保两个环境相同,以进行可靠的测试。 |
| Canary 发布 | Canary 发布首先向一小部分用户推出新版本。我们监控新版本的性能和问题。如果一切正常,我们会将其发布给更多用户。 | 这有助于降低风险。它让我们可以在新版本上线之前在小组中测试它。这对于需要在真实用户条件下测试的功能非常有用。 |
| 滚动更新 | 滚动更新一次在几台服务器上更新应用程序。这可确保某些服务器始终在运行应用程序。随着我们部署新版本,旧版本将逐渐关闭。我们会继续这样做,直到所有服务器都更新完毕。 | 此策略降低了停机风险。当我们需要不间断部署时,它很有用,尤其是对于需要始终可用的应用程序。 |
| 功能切换和标志 | 功能切换(或功能标志)允许我们在无需重新部署的情况下打开或关闭代码库中的功能。它帮助我们发布不完整或实验性的功能并动态控制它们。 | 这对于快速打开/关闭功能而无需部署非常有用。它有助于进行 A/B 测试、管理功能推出以及同时处理不同版本的功能。 |
结论
在本章中,我们解释了如何设置可靠的部署管道。我们还研究了蓝绿和有灰度(又名金丝雀)发布等策略。我们讨论了如何使用自动扫描和漏洞检查来确保安全性和合规性。
通过使用这些技术和工具,开发团队可以使部署过程更顺畅,减少停机时间,保持高安全性并轻松扩展应用程序。这将有助于加快软件交付周期并提高整体运营绩效。

