Docker 容器化的持续集成框架:Docker+Jmeter+Jenkins+Gitlab+Ant+Nginx+Php

飞天小子的性能课堂 · 2019年10月24日 · 最后由 xiaofeier312 回复于 2020年12月15日 · 763 次阅读

https://pan.baidu.com/s/1df1HDkFzChYNAbsSazizpw 提取码:hhn7
jmeter 全系列文档资料

https://pan.baidu.com/s/1rD3H9EGbu0u11E8ofpAl3A 提取码:8q65
性能测试初级到高级系列资料

概述

花了一个月把这一套自动化持续集成框架整合完毕,内容较为复杂,大家需要静下心花个把月来领悟。

框架思路

服务端

容器化的 jenkins 服务
容器化的 gitlab 服务
容器化的 jmeter+ant 构建执行环境
容器化的 nginx+php 环境

客户端

jmeter 客户端
jenkin 客户端及各种插件
gitlab 客户端

gitlab 部署

启动 gitlab

直接 docker 启动 gitlab,端口从默认的 80 映射出来即可
docker run -d -p 8081:80 registry.cn-hangzhou.aliyuncs.com/zhufc/gitlab-ce-zh:zhu2

1: 修改端口
进入 git 容器,找到配置文件,将默认的 host 和端口修改为本机的即可
vim /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml

2: 重启 gitlab
gitlab-ctl stop 停用 gitlab
gitlab-ctl start 启动 gitlab
确认服务和 git 仓库的 host 保持一致即可

安装 git 客户端

1:需要安装两个客户端,TortoiseGit-2.5.0.0-64bitGit-2.7.1.2-64-bit。一键式安装
2:Gitgui 下获取密钥

3:将密钥配置到 gitlab 远程服务中

4:本地克隆一个远程 git 仓库

5:将脚本通过 commit&push 提交到远程仓库中

jenkins 部署

启动 jenkins

直接 docker 启动 jenkins,端口从默认的 8080 映射出来即可
docker run -d -p 8081:8080 registry.cn-hangzhou.aliyuncs.com/zhufc/jenkins:Jenkins
1:容器中获取密码


2:安装升级插件
离线的情况下,手动配置插件


在升级站点中填入:http://mirror.xmission.com/jenkins/updates/update-center.json点击提交
需要安装以下插件:
antgitlabemail,“” ssh“”

服务器上部署构建执行工具

部署 jmeter

1、将本地的 Jmeter 工具包用 rz 命令上传到服务器
2、解压缩,在 opt 目录下生成 jmeter 目录
3、安装 unzip:apt-get install unzip
4、解压缩:unzip apache-jmeter-3.2.zip
6、配置 Jmeter 环境变量。vi /etc/profile,再添加如下变量:
export JMETER=/opt/apache-jmeter-3.2
export PATH=$JMETER/bin:$PATH
7、执行命令:source /etc/profile,配置的环境变量生效
8、检查安装结果:jmeter –v

部署 ant

1:将 apache-ant-1.9.9 上传并解压到/opt 目录下,方法同上面的 jmeter
2:配置 Ant 环境变量。vi /etc/profile。在末尾添加两句
export Ant=/usr/local/apache-ant-1.9.9
export PATH=$Ant/bin:$PATH
3:source /etc/profile 使配置的环境变量生效
4:输入 ant -v 查看 ant 版本
5:将 jmeter/extras 文件夹下的 ant-jmeter-1.1.3.jar 文件拷贝到 ant/lib 路径下

配置 buildxml

在 workspace 下的项目文件夹中添加 build.xml 文件

xml 内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<project name="opms1" default="run" basedir=".">
<tstamp>
<format property="time" pattern="yyyyMMddhhmm" />
</tstamp>

<property environment="env"/>
<property name="test" value="opms"/>
<property name="report.title" value="${test}测试报告"/>
<property name="ReportName" value="${test}" />
<property name="WORKSPACE" value="/root/.jenkins/workspace/opms1" />
<property name="jmeter.home" value="/opt/apache-jmeter-3.2" />
<property name="jmeter.result.dir" value="${env.WORKSPACE}/resultLog/${env.BUILD_ID}" />
<property name="jmeter.result.jtlName" value="${jmeter.result.dir}/${ReportName}.jtl" />
<property name="jmeter.result.htmlName" value="${jmeter.result.dir}/${ReportName}.html" />


    <!-- Should report include response data for failures? -->
    <property name="show-data" value="n"/>

    <property name="format" value="2.1"/>


    <condition property="style_version" value="_21">
        <equals arg1="${format}" arg2="2.1"/>
    </condition>

    <condition property="funcMode">
        <equals arg1="${show-data}" arg2="y"/>
    </condition>

    <condition property="funcMode" value="false">
      <not>
        <equals arg1="${show-data}" arg2="y"/>
      </not>
    </condition>

<target name="run">
<echo message="start..."/>
<antcall target="clean" />
<antcall target="test" />
<antcall target="report" />
</target>

<target name="clean">
<mkdir dir="${env.WORKSPACE}/resultLog/${env.BUILD_ID}" />
</target>

<target name="test">
<echo>funcMode = ${funcMode}</echo>

<taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
<jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">
<!-- 声明要运行的脚本"*.jmx"指包含此目录下的所有jmeter脚本,includes里的文件也可以用逗号,隔开-->
<testplans dir="${env.WORKSPACE}" includes=""test.jmx" />

<property name="jmeter.save.saveservice.output_format" value="xml"/>
<property name="jmeter.save.saveservice.assertion_results" value="all"/>
<property name="jmeter.save.saveservice.bytes" value="true"/>
<property name="file_format.testlog" value="${format}"/>
<property name="jmeter.save.saveservice.response_data.on_error" value="${funcMode}"/>
    </jmeter>
</target>

<path id="xslt.classpath">
<fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/>
<fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/>
</path>

<target name="report" depends="xslt-report,copy-images">
        <echo>Report generated at ${report.datestamp}</echo>
    </target>

    <target name="xslt-report" depends="_message_xalan">
        <tstamp><format property="report.datestamp" pattern="yyyy/MM/dd HH:mm"/></tstamp>
        <xslt
            classpathref="xslt.classpath"
            force="true"
            in="${jmeter.result.jtlName}"
            out="${jmeter.result.htmlName}"
            style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl">
            <param name="showData" expression="${show-data}"/>
            <param name="titleReport" expression="${report.title}"/>
            <param name="dateReport" expression="${report.datestamp}"/>
        </xslt>
    </target>

 <!-- Copy report images if needed -->
    <target name="copy-images" depends="verify-images" unless="samepath">
    <copy file="${jmeter.home}/extras/expand.png" tofile="${jmeter.result.dir}/expand.png"/>
    <copy file="${jmeter.home}/extras/collapse.png" tofile="${jmeter.result.dir}/collapse.png"/>
    </target>


    <target name="verify-images">
        <condition property="samepath">
                <equals arg1="${env.WORKSPACE}" arg2="${jmeter.home}" />
        </condition>
    </target>

    <!-- Check that the xalan libraries are present -->
    <condition property="xalan.present">
          <and>
              <!-- No need to check all jars; just check a few -->
            <available classpathref="xslt.classpath" classname="org.apache.xalan.processor.TransformerFactoryImpl"/>
            <available classpathref="xslt.classpath" classname="org.apache.xml.serializer.ExtendedContentHandler"/>
          </and>
    </condition>

    <target name="_message_xalan" unless="xalan.present">
          <echo>Cannot find all xalan and/or serialiser jars</echo>
        <echo>The XSLT formatting may not work correctly.</echo>
        <echo>Check you have xalan and serializer jars in ${lib.dir}</echo>
    </target>
</project>

jenkins 插件配置

1:ant 环境变量



2:GIT 插件配置

3:shell 插件
执行 shell 这一部分脚本可以选择注释掉

4:邮件插件
添加一个 Email Extension Plugin 插件


添加默认接收人和发送人的邮件地址

5:系统邮箱设置
添加发送人邮件

添加 smtp 服务器地址和发送人的邮箱密码(smtp 密钥)

配置默认接收人的邮箱地址

配置邮件默认内容
此处需要将默认内容中 url 通过 nginx 指向服务器

<!DOCTYPE html>    
<html>    
<head>    
<meta charset="UTF-8">    
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>    
</head>    

<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"    
    offset="0">    
    <table width="95%" cellpadding="0" cellspacing="0"  style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">    
        <tr>    
            本邮件由系统自动发出,无需回复!<br/>            
            各位同事,大家好,以下为${PROJECT_NAME }项目性能测试报告,点击链接可以直接查看</br> 
        </tr>    
        <tr>    
            <td><br />    
            <b><font color="#0B610B">构建信息</font></b>    
            <hr size="2" width="100%" align="center" /></td>    
        </tr>    
        <tr>    
            <td>    
                <ul>    
                    <li>项目名称 : ${PROJECT_NAME}</li>    
                    <li>构建编号 : 第${BUILD_NUMBER}次构建</li>    
                    <li>构建人员: 测试部门</li>    
                    <li>构建日志: <a href="http://10.200.4.57:8083/${BUILD_NUMBER}/opms.html">http://0.200.4.57:8083/${BUILD_NUMBER}/opms.html</a></li>    

                </ul>    
<ul>
</ul>

            </td>    
        </tr>    
    </table>    
</body>    
</html>    

Could not send email as a part of the post-build publishers


再次配置邮件服务器的地址和用户名密码

nginx 和 php 环境部署

点击查看 nginx+php 环境部署

nginx 指向报告


构建结果

通过 build.xml 文件执行构建,执行 shell 命令调用 jmeter 命令行生成测试报告,通过邮件发送指定人。
邮件的内容通过 nginx 直接指向服务器,不需要发送额外的附件

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 8 条回复 时间 点赞

mark 下,后面学习搭建下

建议隐私信息要打码

docker 菜鸟学习中,请问楼主是都放在一个容器中的吗

飞天小子的性能课堂 jmeter 接口性能测试基础 中提及了此贴 12月03日 02:07

这是 windows 环境搭建的吗?

不错,我来借鉴一下

菜鸟弱弱的问下, 最终要达到的效果是 自动拉代码,部署,自动压测么?

飞天小子的性能课堂 由浅入深学性能测试 中提及了此贴 01月12日 06:50
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册