概述

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

框架思路

服务端

容器化的 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 指向服务器

文档都已经上传到飞书知识库,自由阅读


↙↙↙阅读原文可查看相关链接,并与作者交流