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

飞天小子的性能课堂 · October 24, 2019 · Last by 飞天小子的性能课堂 replied at December 05, 2019 · 2769 hits

概述

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

框架思路

服务端

容器化的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直接指向服务器,不需要发送额外的附件

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

mark下,后面学习搭建下

建议隐私信息要打码

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

这是windows环境搭建的吗?

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up