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 测试、管理功能推出以及同时处理不同版本的功能。

结论

在本章中,我们解释了如何设置可靠的部署管道。我们还研究了蓝绿和有灰度(又名金丝雀)发布等策略。我们讨论了如何使用自动扫描和漏洞检查来确保安全性和合规性。

通过使用这些技术和工具,开发团队可以使部署过程更顺畅,减少停机时间,保持高安全性并轻松扩展应用程序。这将有助于加快软件交付周期并提高整体运营绩效。