Skip to content

项目实战

Pipeline 实现持续集成

预习准备

课程目标

  1. 掌握 CICD 知识体系。
  2. 掌握 Jenkins Pipeline 常用语法。
  3. 结合 Jenkins Pipeline 实现 CICD 体系建设。

需求说明

  1. 在研发提交 mr 的时候,通过 Pipeline 拉取研发的代码,对被测服务进行单元测试、覆盖率测试。其中某一个环境如果没有通过,则邮件通知对应的研发。
  2. 以上测试通过之后,编译 docker 镜像,并自动部署到开发环境中。
  3. 对开发环境进行自动化测试,通过之后自动部署到测试环境中。

uml diagram

实战思路

在流水线的实现过程中,其实主要就是在调试流水线的脚本。所以在这个过程中,最好是将每个子步骤调通后,再整合到一起。将问题先分解,逐个解决再融合。

uml diagram

传统 Job 的实现方式

持续集成概念和方案
  1. Devops与CICD Devops与CICD
  2. 持续集成的方案 持续集成的方案
实现思路
  1. 在 Jenkins 上安装单元测试工具
  2. 在 Jenkins 上配置单元测试工具
  3. 在 Jenkins 上安装覆盖率工具
  4. 使用 Jenkins 运行单元测试和覆盖测试
实战项目
  • 项目地址: https://gitee.com/ceshiren/continuous-integration-poc
  • 项目说明: 一个简单的 Python 项目,包含单元测试和覆盖率测试
实战步骤
  1. 在 Jenkins 安装git、ssh等插件
  2. 配置 Jenkins 的节点
  3. 配置 Jenkins 的job
  4. 在 Jenkins 上进行单元测试和覆盖率测试
  5. 在 Jenkins 上配置邮件告警
  6. dayly build
Jenkins的插件安装和节点配置
  1. Jenkins的插件安装
  2. Jenkins的节点配置
测试报告与邮件告警
  1. 测试报告配置 测试报告
  2. 邮件告警配置 邮件告警

使用 Pipeline 整体框架流程

首先需要搭建好流水线的基本结构,相关知识点为 Pipeline 简介流水线基本结构流水线节点管理

单元测试

  • 执行单元测试相关的命令:

    steps {
        echo '开始单元测试'
        sh 'python3 -m venv venv && source venv/bin/activate && pip install -r requirements.txt && pytest --cov=src tests --cov-report=html --cov-fail-under=90'
    }
    
如果失败:
如果成功
  1. 环境准备: 源码部署的镜像需要有相关的依赖环境,比如 Python ,以及一些基础的 linux 命令等(如果已经有相关的基础镜像可以跳过此步骤)。先打包环境依赖的基础镜像,需要使用命令:docker build -f [Dockerfile文件路径] -t [镜像名称] .

    FROM python:3.9.16
    RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    RUN sed -i 's/security.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
    RUN apt-get update
    RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    RUN apt install -y  vim wget curl iproute2 ntpdate  telnet traceroute  openssl libssl-dev libpcre3 libpcre3-dev  ntpdate  telnet traceroute gcc openssh-server  ntpdate tcpdump telnet traceroute iotop unzip zip openjdk-11-jdk
    RUN mkdir /data /log; \
      pip3 install setuptools -i https://pypi.tuna.tsinghua.edu.cn/simple ; \
      pip3 install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple;
    CMD /bin/bash
    
  2. 将源码进行编译打包:生成一个可部署的 Docker 镜像(或者 War 包、Jar 包)。以下为相关的 dockerfile,注意,在此次运行 docker 的 build 命令的时候,需要在源码项目根目录下执行。

    # 注意,这个是私有hub
    FROM [镜像名]
    # 工作目录
    WORKDIR /data
    # 复制本地主机的 . 下内容到镜像中的 . ,目标路径不存在时,会自动创建。
    COPY . .
    # 执行shell 命令,安装环境
    ENV PYTHONPATH src
    RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
    # 启动服务。
    CMD ["python3", "./src/server.py"]
    
  3. 部署测试环境,此次演示使用 Docker 启动服务:docker run -d -p [宿主机端口]:[容器内部端口] [镜像名称]

注意:如果是 Mac 本地部署的 jenkins,可能会碰到 docker: command not found 命令找不到的问题。对应解决方案为:

  1. 确保连接的 mac 节点有安装 docker,并且在命令行能够正常调用。
  2. 在 mac 直接输入echo $PATH,复制其返回的内容。
  3. 进入节点-> 配置 -> 环境变量,点击添加。键的地方输入PATH,值的地方输入$PATH:[第二步返回的内容]
    节点环境变量配置

注意:如果是 Linux 服务器,连接节点的时候使用的非root用户,可能会出现权限的问题,需要将该用户加入到 docker 用户组中。

  1. 将用户添加到 docker 组中 sudo usermod -aG docker $USER

自动化测试

  1. 测试环境部署成功之后开始做自动化测试。由于被测服务的源码地址和测试代码并不是一个仓库,所以需要进行多仓库的管理,对应片段生成器中的 checkout 指令。
  2. 执行所有的自动化测试用例,并生成对应的测试报告,发送邮件给测试人员,邮件中需要包含 allure 报告信息,对应片段生成器中的 allure 指令。

其他优化点

  1. 多分支流水线构建,相关资料参考多分支流水线
  2. 结合 WebHook 触发构建。