一、需求背景

每次开发提测后,测试人员手工的去测试系统的主流程,来验证本次提测的代码包是否符合测试准入条件。

项目中有了完整的被测试系统的主流程自动化测试代码后,每次都可以使用这些自动化测试案例集来进行测试本次提测代码是否符合测试准入条件。

目前是每次都是开发提测-通知自动化测试人员-自动化测试人员执行测试脚本-反馈自动化测试结果到研发群组。这样的路径沟通成本、人力成本、协调成本极高。

所以运用jenkins的流水线能力,实现

jenkins监听项目代码仓库的master分支合并请求

自动触发自动化测试冒烟案例集

执行完成后自动发送提醒到研发群组。

从而极大的减小质量门禁的成本。

二、具体路线

1、jenkins的webhooks能力,从而实现项目代码仓库的master分支合并请求通知jenkins触发流水线构建

2、jenkins调用docker实现容器化的应用来执行自动化测试代码,避免环境问题和服务器压力

3、jenkins将质量门禁的结果通知给研发群组

三、实现详情

1、jenkins监听项目代码仓库的合并master改动,触发流水线

jenkins+gitee插件

配置jenkins中的gitee监听webhook

gitee仓库中配置显示的webhook地址

点击测试,返回200即表示配置成功

配置后,每次有代码合并到master分支中时,jenkins就会收到通知,开始构建流水线。

2、jenkins流水线配置,拉取jenkinsfile和dockerfile并创建镜像

新建一个git仓库来存放你的dockerfile,并在jenkins中配置流水线jenkinsfile文件的地址

jenkinsfile的文件内容如下:

pipeline {
    agent any

    environment {
        IMAGE_NAME = "my-python-app"
        IMAGE_TAG = "${BUILD_NUMBER}"
        TEST_CONTAINER_NAME = "test-runner-${BUILD_NUMBER}"
        PATH = "/usr/local/bin:/usr/bin:/bin:${env.PATH}"
    }

    stages {
        stage('📥 Fetch Code & Merge') {
            steps {
                script {
                    echo "1️⃣ 正在拉取主应用代码..."
                    dir('app') {
                        checkout([
                            $class: 'GitSCM',
                            branches: [[name: '*/master']],
                            userRemoteConfigs: [[url: 'https://gitee.com/your giteename/CI-demo.git']]
                        ])
                    }

                    echo "2️⃣ 正在拉取测试代码..."
                    dir('tests') {
                        checkout([
                            $class: 'GitSCM',
                            branches: [[name: '*/master']],
                            userRemoteConfigs: [[url: 'https://gitee.com/your giteename/api-autotest.git']]
                        ])
                    }

                    echo "3️⃣ 正在合并代码 (去嵌套化) ..."
                    sh '''
                        # 进入主应用目录
                        cd app
                        
                        # 🔧 修改点 1:直接将 tests 仓库下的 testscript 文件夹复制到 app 根目录
                        # 这样 app 目录下就会直接多出一个 testscript 文件夹,不再有深层嵌套
                        echo "📋 执行复制:将 tests/testscript -> app/testscript"
                        cp -r ../tests/testscript ./
                        
                        # 调试:查看现在的 app 目录结构 (你应该能看到 testscript 直接在下面)
                        echo "📦 当前 app 目录结构:"
                        find . -maxdepth 2 -type d
                    '''
                }
            }
        }

        stage('🐳 Build Test Image') {
            steps {
                script {
                    echo "4️⃣ 正在构建镜像..."
                    dir('app') {
                        sh "docker build -t ${IMAGE_NAME}:${IMAGE_TAG} ."
                    }
                }
            }
        }

        stage('🧪 Execute Tests') {
            steps {
                script {
                    echo "5️⃣ 启动测试容器..."
                    sh """
                        # 调试:查看容器内的文件结构,确认 testscript 位置
                        echo '--- 📂 容器内文件列表 ---'
                        docker run --rm ${IMAGE_NAME}:${IMAGE_TAG} find /app -name "run_smoke.py"
                        
                        # 🔧 修改点 2:修正执行路径
                        # 因为我们现在把 testscript 直接复制到了 /app 下
                        # 所以文件现在的真实路径是:/app/testscript/run_smoke.py
                        # (注意:这里假设 run_smoke.py 依然在 testscript 目录内)
                        docker run --rm --name ${TEST_CONTAINER_NAME} ${IMAGE_NAME}:${IMAGE_TAG} \\
                            python /app/testscript/run_smoke.py
                    """
                }
            }
        }
    }

    post {
        always {
            sh 'docker image prune -f'
        }
        success {
            echo '🎉 流水线成功!'
        }
        failure {
            echo '❌ 流水线失败,请检查日志。'
        }
    }
}

dockerfile的内容如下:

FROM python:3.9-slim

WORKDIR /app

# 1. 先复制依赖文件并安装(利用 Docker 缓存,只有 requirements.txt 变化时才重装依赖)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

# 2. 复制代码(注意顺序优化)
# 先复制主应用代码
COPY . .

# 👇 最后复制测试脚本(或者根据 Jenkins 的合并逻辑调整)
# 注意:根据你最新的 Jenkinsfile,测试脚本已经被 cp 到了当前目录下,
# 所以这里 COPY . . 其实已经包含了它。如果报错找不到文件,再单独加这行。
# COPY testscript/ ./testscript/ 

EXPOSE 5000

# 启动命令(会被 Jenkins 覆盖,但保留作为默认值)
CMD ["python", "setting.py"]

3、基于第二步骤的镜像,来运行容器,并执行自动化测试代码

流水线中代码即流程,这部分都在jenkinsfile文件中

jenkinsfile中这段内容就是在运行容器

                    echo "4️⃣ 正在构建镜像..."
                    dir('app') {
                        sh "docker build -t ${IMAGE_NAME}:${IMAGE_TAG} ."

jenkinsfile中这段内容就是在容器内执行自动化测试代码

            echo "5️⃣ 启动测试容器..."
                    sh """
                        # 调试:查看容器内的文件结构,确认 testscript 位置
                        echo '--- 📂 容器内文件列表 ---'
                        docker run --rm ${IMAGE_NAME}:${IMAGE_TAG} find /app -name "run_smoke.py"
                        
                        # 🔧 修改点 2:修正执行路径
                        # 因为我们现在把 testscript 直接复制到了 /app 下
                        # 所以文件现在的真实路径是:/app/testscript/run_smoke.py
                        # (注意:这里假设 run_smoke.py 依然在 testscript 目录内)
                        docker run --rm --name ${TEST_CONTAINER_NAME} ${IMAGE_NAME}:${IMAGE_TAG} \\
                            python /app/testscript/run_smoke.py
                    """

四、流水线结果

最终,流水线检测pytest返回的exit code,不为0(成功),则流水线失败,实现了开发提交代码即自动运动冒烟测试的质量门禁方案。

如果需要接入企业微信,钉钉群,这些社交方案,自行开发插件,在run文件中调用即可。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐