天天看點

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

一、安裝JDK

    1、安裝JDK1.8:yum -y install java-1.8.0-openjdk*.*,安裝成功後可以檢視

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

    2、配置環境變量:vi /etc/profile然後添加

    JAVA_HOME=/usr/local/jdk1.8

    PATH=$PATH:$HOME/bin:$JAVA_HOME/bin

    CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

二、安裝ant

    上傳ant的包到伺服器并解壓tar -xzvf apache-ant-1.10.7-bin.tar.gz

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

    vi /etc/profile配置環境變量:

    export ANT_HOME=/opt/apache-ant-1.10.7

    export PATH=$ANT_HOME/bin:$PATH

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

三、安裝Jmeter

    上傳Jmeter到伺服器解壓後可直接使用:tar -xvzf apache-jmeter-5.2.1_linux.tgz

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

    進入到Jmeter的bin目錄檢視到jmeter的版本表示安裝成功:

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

四、安裝Jenkins

    1、下載下傳jenkins.war并上傳到伺服器上,使用java -jar jenkins.war --httpPort=8080(可換成其他端口号)啟動Jenkins

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建
Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建
Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建
Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

    2、在浏覽器中輸入:http://192.168.231.128:8080/,出現下面說明Jenkins啟動成功了

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

    3、浏覽器通路時可能會通路失敗,可參考 https://blog.csdn.net/qq_32639315/article/details/105590564 解決。然後将/root/.jenkins/secrets/initialAdminPassword裡面的一串字元複制到管理者密碼輸入框,點選“繼續”

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

    4、選擇“選擇插件來安裝”,去掉所有的選項,點選“安裝”,然後下面的界面設定使用者名密碼,我這裡設定為使用者名:

      admin,密碼:123456 

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建
Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

五、非GUI運作Jmeter

    1、為什麼要非GUI運作Jmeter?

    減少資源利用,為後面做持續內建做準備

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

    2、非GUI運作jmeter腳本:./jmeter.sh -n -t /opt/apache-jmeter-5.2.1/bin/jmeterRes/getBaiDu.jmx -l Test.jtl

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

getBaiDu.jmx腳本内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="4.0" jmeter="4.0 r1823414">
  <hashTree>
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="測試計劃" enabled="true">
      <stringProp name="TestPlan.comments"></stringProp>
      <boolProp name="TestPlan.functional_mode">false</boolProp>
      <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
      <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="使用者定義的變量" enabled="true">
        <collectionProp name="Arguments.arguments"/>
      </elementProp>
      <stringProp name="TestPlan.user_define_classpath"></stringProp>
    </TestPlan>
    <hashTree>
      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="線程組" enabled="true">
        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循環控制器" enabled="true">
          <boolProp name="LoopController.continue_forever">false</boolProp>
          <stringProp name="LoopController.loops">100</stringProp>
        </elementProp>
        <stringProp name="ThreadGroup.num_threads">10</stringProp>
        <stringProp name="ThreadGroup.ramp_time">1</stringProp>
        <boolProp name="ThreadGroup.scheduler">false</boolProp>
        <stringProp name="ThreadGroup.duration"></stringProp>
        <stringProp name="ThreadGroup.delay"></stringProp>
      </ThreadGroup>
      <hashTree>
        <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP資訊頭管理器" enabled="true">
          <collectionProp name="HeaderManager.headers"/>
        </HeaderManager>
        <hashTree/>
        <CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie 管理器" enabled="true">
          <collectionProp name="CookieManager.cookies"/>
          <boolProp name="CookieManager.clearEachIteration">false</boolProp>
        </CookieManager>
        <hashTree/>
        <ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP請求預設值" enabled="true">
          <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="使用者定義的變量" enabled="true">
            <collectionProp name="Arguments.arguments"/>
          </elementProp>
          <stringProp name="HTTPSampler.domain"></stringProp>
          <stringProp name="HTTPSampler.port"></stringProp>
          <stringProp name="HTTPSampler.protocol"></stringProp>
          <stringProp name="HTTPSampler.contentEncoding"></stringProp>
          <stringProp name="HTTPSampler.path"></stringProp>
          <stringProp name="HTTPSampler.concurrentPool">6</stringProp>
          <stringProp name="HTTPSampler.connect_timeout"></stringProp>
          <stringProp name="HTTPSampler.response_timeout"></stringProp>
        </ConfigTestElement>
        <hashTree/>
        <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP請求" enabled="true">
          <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="使用者定義的變量" enabled="true">
            <collectionProp name="Arguments.arguments"/>
          </elementProp>
          <stringProp name="HTTPSampler.domain">www.baidu.com</stringProp>
          <stringProp name="HTTPSampler.port"></stringProp>
          <stringProp name="HTTPSampler.protocol">http</stringProp>
          <stringProp name="HTTPSampler.contentEncoding"></stringProp>
          <stringProp name="HTTPSampler.path">/</stringProp>
          <stringProp name="HTTPSampler.method">GET</stringProp>
          <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
          <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
          <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
          <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
          <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
          <stringProp name="HTTPSampler.connect_timeout"></stringProp>
          <stringProp name="HTTPSampler.response_timeout"></stringProp>
        </HTTPSamplerProxy>
        <hashTree>
          <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="響應斷言" enabled="true">
            <collectionProp name="Asserion.test_strings">
              <stringProp name="270263191">www.baidu.com</stringProp>
            </collectionProp>
            <stringProp name="Assertion.custom_message"></stringProp>
            <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
            <boolProp name="Assertion.assume_success">false</boolProp>
            <intProp name="Assertion.test_type">16</intProp>
          </ResponseAssertion>
          <hashTree/>
        </hashTree>
        <ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report" enabled="true">
          <boolProp name="ResultCollector.error_logging">false</boolProp>
          <objProp>
            <name>saveConfig</name>
            <value class="SampleSaveConfiguration">
              <time>true</time>
              <latency>true</latency>
              <timestamp>true</timestamp>
              <success>true</success>
              <label>true</label>
              <code>true</code>
              <message>true</message>
              <threadName>true</threadName>
              <dataType>true</dataType>
              <encoding>false</encoding>
              <assertions>true</assertions>
              <subresults>true</subresults>
              <responseData>false</responseData>
              <samplerData>false</samplerData>
              <xml>false</xml>
              <fieldNames>true</fieldNames>
              <responseHeaders>false</responseHeaders>
              <requestHeaders>false</requestHeaders>
              <responseDataOnError>false</responseDataOnError>
              <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
              <assertionsResultsToSave>0</assertionsResultsToSave>
              <bytes>true</bytes>
              <sentBytes>true</sentBytes>
              <threadCounts>true</threadCounts>
              <idleTime>true</idleTime>
              <connectTime>true</connectTime>
            </value>
          </objProp>
          <stringProp name="filename"></stringProp>
        </ResultCollector>
        <hashTree/>
        <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="察看結果樹" enabled="false">
          <boolProp name="ResultCollector.error_logging">false</boolProp>
          <objProp>
            <name>saveConfig</name>
            <value class="SampleSaveConfiguration">
              <time>true</time>
              <latency>true</latency>
              <timestamp>true</timestamp>
              <success>true</success>
              <label>true</label>
              <code>true</code>
              <message>true</message>
              <threadName>true</threadName>
              <dataType>true</dataType>
              <encoding>false</encoding>
              <assertions>true</assertions>
              <subresults>true</subresults>
              <responseData>false</responseData>
              <samplerData>false</samplerData>
              <xml>false</xml>
              <fieldNames>true</fieldNames>
              <responseHeaders>false</responseHeaders>
              <requestHeaders>false</requestHeaders>
              <responseDataOnError>false</responseDataOnError>
              <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
              <assertionsResultsToSave>0</assertionsResultsToSave>
              <bytes>true</bytes>
              <sentBytes>true</sentBytes>
              <threadCounts>true</threadCounts>
              <idleTime>true</idleTime>
              <connectTime>true</connectTime>
            </value>
          </objProp>
          <stringProp name="filename"></stringProp>
        </ResultCollector>
        <hashTree/>
      </hashTree>
    </hashTree>
  </hashTree>
</jmeterTestPlan>
           

    3、将測試結果轉換為HTML格式:

    ①jmeter -g Test.jtl -o result  或者

    ②./jmeter.sh -n -t /opt/apache-jmeter-5.2.1/bin/jmeterRes/getBaiDu.jmx -l Test.jtl -e -o /opt/apache-jmeter-5.2.1/bin/jmeterRes/Report

    用方法②時需要将jmeter.properties裡面的jmeter.save.saveservice.output_format這行注釋掉

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

六、Jenkins調用Jmeter

    不需要安裝任何插件,把非GUI模式運作的指令放到Jenkins裡面,建立一個Job,即可。

    1、New Item -> 在Enter an item name裡面輸入“Jenkins調Jmeter” -> Freestyle project -> OK

    2、在build裡面輸入要執行的指令然後點選“儲存”

cd /opt/apache-jmeter-5.2.1/bin
./jmeter.sh -n -t /opt/apache-jmeter-5.2.1/bin/jmeterRes/getBaiDu.jmx -l baidu${BUILD_NUMBER}.jtl -e -o /opt/apache-jmeter-5.2.1/bin/jmeterRes/Report${BUILD_NUMBER}
           
Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建
Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

    3、可以看到建構成功了,點進去看還可以看見建構成功的日志

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建
Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

六、Jenkins調用Ant,Ant調用Jmeter

    1、安裝插件Ant In Workspace

    2、安裝Ant并配置好Ant的環境變量

    3、将/opt/apache-jmeter-5.2.1/extras下的ant-jmeter-1.1.1.jar拷貝Ant的lib目錄下

    4、在jmeter的extras目錄下放置配置檔案:build.xml,build.xml的内容如下:    

<?xml version="1.0" encoding="utf-8"?>
<project name="ant-jmeter-test" default="run" basedir=".">
     <tstamp>
         <format property="time" pattern="yyyyMMddhhmm" />
     </tstamp>
     <property name="jmeter.home" value="/opt/apache-jmeter-5.2.1" /><!-- 需要改成自己本地的 Jmeter 目錄-->
     <property name="jmeter.result.jtl.dir" value="/opt/apache-jmeter-5.2.1/ant_demo/resultLog/jtl" /><!-- jmeter生成jtl格式的結果報告的路徑-->
     <property name="jmeter.result.html.dir" value="/opt/apache-jmeter-5.2.1/ant_demo/resultLog/html" /><!-- jmeter生成html格式的結果報告的路徑-->
     <property name="ReportName" value="TestReport" /><!-- 生成的報告的字首-->
     <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" />
     <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}${time}.html" />

     <target name="run">
         <antcall target="test" />
         <antcall target="report" />
     </target>

     <target name="test">
         <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
         <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">
             <testplans dir="/opt/apache-jmeter-5.2.1/ant_demo/script" includes="*.jmx" /><!-- 聲明要運作的腳本。"*.jmx"指包含此目錄下的所有jmeter腳本-->
             <property name="jmeter.save.saveservice.output_format" value="xml"/>

         </jmeter>
     </target>

     <target name="report">
         <xslt in="${jmeter.result.jtlName}"
               out="${jmeter.result.htmlName}"
               style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl" />
                 <!-- 因為上面生成報告的時候,不會将相關的圖檔也一起拷貝至目标目錄,是以,需要手動拷貝 -->
         <copy todir="${jmeter.result.html.dir}">
             <fileset dir="${jmeter.home}/extras">
                 <include name="collapse.png" />
                 <include name="expand.png" />
             </fileset>
         </copy>
     </target>
</project>
           

    5、在/opt/apache-jmeter-5.2.1/ant_demo/script目錄下放入要執行的腳本

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

    運作ant run提示如下說明Ant調用Jmeter成功

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

    6、Jenkins上Global Tool Configuration裡面配置Ant和JDK的環境參數

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建
Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

    7、建立Jenkins調Ant(Ant調用Jmeter)的Job

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建
Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

    8、建構,可以看見建構成功

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建
Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

七、Jenkins調用ANT,ANT調用Jmeter,并生成報告(包括郵件)

    1、安裝插件Email Extension Plugin

    2、郵件開通授權碼

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建
Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建
Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

    3、Manage Jenkins -> Configure System -> Jenkins Location,System Admin e-mail address處配置發件人的郵箱

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建
Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建
Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

     全部配置好後,點選右下角的“Test configuration”看是否能夠發送成功

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

    4、Jenkins中建立Job,并做一些配置,然後建構,可以看到郵件發送成功了

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建
Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

Linux(Centos)下搭建Jenkins+ant+jmeter,實作持續內建

繼續閱讀