代码网 logo

CI/CD 实战项目:从概念到部署的完整指南

张三2025-12-18 09:39:060

CI/CD 实战项目:从概念到部署的完整指南

简介

在现代软件开发中,持续集成(Continuous Integration, CI)持续交付/部署(Continuous Delivery/Deployment, CD) 已成为不可或缺的开发实践。它们能够帮助团队快速、安全地交付高质量的代码,提高开发效率,降低发布风险。

本篇文章将深入探讨 CI/CD 的核心理念,并通过一个完整的实战项目,展示如何从零开始构建一个 CI/CD 流水线。项目将使用 GitHub Actions 作为 CI/CD 工具,结合 Docker 和 Kubernetes 实现容器化部署。文章将涵盖项目结构、配置、测试、构建、部署等关键环节,帮助开发者掌握完整 CI/CD 流程。


目录

  1. CI/CD 简介
  2. 项目概述与目标
  3. 技术选型
  4. 项目结构设计
  5. CI 配置:GitHub Actions
  6. CD 配置:GitHub Actions 与 Kubernetes
  7. 测试与验证
  8. 部署与监控
  9. 总结

CI/CD 简介

什么是 CI/CD?

  • 持续集成(CI):开发人员在每次代码提交后,自动执行构建和测试任务,以确保代码质量。
  • 持续交付(CD):在 CI 的基础上,确保每次提交的代码都可以随时部署到生产环境。
  • 持续部署(CD):在 CI 的基础上,自动将代码部署到生产环境,无需人工干预。

CI/CD 的核心目标是通过自动化流程,减少人为错误、加快发布速度、提升产品质量。

CI/CD 的优势

  • 快速反馈:开发人员可以立即知道新代码是否引入问题。
  • 高可靠性:自动化测试确保代码质量。
  • 降低发布风险:每次发布都经过相同流程,避免“手动发布”导致的错误。
  • 提升团队协作:所有成员都遵循统一流程,减少沟通成本。

项目概述与目标

项目简介

本项目是一个简单的 Web 应用,使用 Flask 框架构建,前端使用 HTML/CSS/JavaScript,后端使用 Python。项目将通过 GitHub Actions 实现 CI/CD 流程,最终部署到 Kubernetes 集群中。

项目目标

  • 构建一个完整的 CI/CD 流程。
  • 配置 GitHub Actions 执行测试、构建和部署任务。
  • 使用 Docker 容器化应用。
  • 在 Kubernetes 上部署应用。
  • 实现自动化测试和部署。

技术选型

技术 用途
GitHub Actions CI/CD 流水线的自动化工具
Python/Flask Web 应用后端
HTML/CSS/JavaScript 前端页面
Docker 容器化应用
Kubernetes 容器编排与部署
GitHub 代码托管与版本控制

项目结构设计

以下是项目的目录结构:

复制代码
ci-cd-demo/
├── app/
│   ├── app.py           # Flask 应用主文件
│   ├── templates/       # HTML 模板
│   ├── static/          # CSS/JS 资源
│   └── requirements.txt # 依赖包
├── tests/               # 测试用例
│   └── test_app.py
├── Dockerfile           # 容器构建配置
├── k8s/
│   ├── deployment.yaml
│   └── service.yaml
├── .github/
│   └── workflows/
│       └── ci-cd.yml    # GitHub Actions 配置文件
└── README.md

CI 配置:GitHub Actions

1. 创建 GitHub Actions 工作流文件

.github/workflows/ci-cd.yml 中定义 CI/CD 流程。

yaml 复制代码
name: CI/CD Pipeline

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.9'

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r app/requirements.txt

      - name: Run tests
        run: |
          python -m pytest tests/test_app.py

      - name: Build Docker image
        run: |
          docker build -t ci-cd-demo:latest app/

      - name: Push Docker image
        uses: docker/build-push-action@v4
        with:
          context: app/
          push: true
          tags: |
            my-registry/ci-cd-demo:latest

  deploy:
    runs-on: ubuntu-latest
    needs: build-and-test
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up Kubernetes
        uses: azure/setup-kubernetes@v1
        with:
          namespace: production
          context: my-k8s-context
          server: https://k8s.example.com
          token: ${{ secrets.K8S_TOKEN }}

      - name: Deploy to Kubernetes
        run: |
          kubectl apply -f k8s/deployment.yaml
          kubectl apply -f k8s/service.yaml

2. 代码说明

  • on.pushon.pull_request:当推送代码或发起 Pull Request 时触发流程。
  • build-and-test 作业:执行构建、测试、Docker 镜像构建与推送。
  • deploy 作业:在 build-and-test 成功后部署到 Kubernetes 集群。
  • GitHub Secrets:在 GitHub 仓库设置 K8S_TOKEN 以用于 Kubernetes 部署。

CD 配置:GitHub Actions 与 Kubernetes

1. Docker 配置

app/Dockerfile 中定义容器构建配置:

dockerfile 复制代码
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "app.py"]

2. Kubernetes 配置

k8s/deployment.yaml 中定义部署配置:

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ci-cd-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: ci-cd-demo
  template:
    metadata:
      labels:
        app: ci-cd-demo
    spec:
      containers:
      - name: ci-cd-demo
        image: my-registry/ci-cd-demo:latest
        ports:
        - containerPort: 5000

k8s/service.yaml 中定义服务配置:

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: ci-cd-demo
spec:
  type: LoadBalancer
  selector:
    app: ci-cd-demo
  ports:
    - protocol: TCP
      port: 80
      targetPort: 5000

3. Kubernetes 部署流程

  • deploy 作业中,通过 kubectl apply 指令将配置应用到 Kubernetes。
  • 使用 GitHub Secrets 保存 Kubernetes 的 token,保证安全性。

测试与验证

1. 单元测试

tests/test_app.py 中编写测试用例:

python 复制代码
from app import app

def test_home_page():
    with app.test_client() as c:
        response = c.get('/')
        assert response.status_code == 200
        assert b'Hello, World!' in response.data

2. 集成测试

可以使用 pytestunittest 框架进行集成测试,确保应用在容器和 Kubernetes 环境中运行正常。

3. 验证部署

在 Kubernetes 集群中,通过 kubectl get podskubectl get services 查看部署状态,确保应用正常运行。


部署与监控

1. 自动化部署

GitHub Actions 在每次提交代码后,自动构建镜像并推送到镜像仓库,然后更新 Kubernetes 部署。

2. 部署后验证

可以使用 kubectl rollout status deployment/ci-cd-demo 检查部署状态。

3. 监控与日志

  • Prometheus + Grafana:用于监控应用性能。
  • ELK Stack(Elasticsearch + Logstash + Kibana):用于收集和分析日志。
  • Kubernetes Dashboard:用于查看集群状态和资源使用情况。

总结

通过本项目,我们成功搭建了一个完整的 CI/CD 流水线,涵盖了代码提交、测试、构建、部署和监控的全过程。GitHub Actions 作为自动化工具,配合 Docker 和 Kubernetes,实现了从开发到生产环境的无缝衔接。

CI/CD 不仅提升了团队的开发效率,也极大降低了代码发布时的风险。随着 DevOps 逐渐成为主流,掌握 CI/CD 技术已成为每个开发者必备的技能。通过不断优化和扩展 CI/CD 流程,团队可以更快速地响应市场需求,提高产品质量和用户满意度。


附录: