Kuendesha majaribio ya JMeter katika OpenShift kwa kutumia Jenkins Pipeline

Hello kila mtu!

Katika nakala hii nataka kushiriki moja ya njia za kuendesha majaribio ya utendaji wa JMeter katika OpenShift kwa kutumia Jenkins kama otomatiki. Kwanza tutafanya hatua zote muhimu (kuunda ImageStreams, BuildConfig, Job nk) katika hali ya mwongozo. Baada ya hapo, hebu tuandike Jenkins Bomba.

Kama sehemu ya kuanzia tunapaswa kuwa na:

  1. inayoendesha nguzo ya OpenShift (v3.11).
  2. Seva ya Jenkins iliyo na vitambulisho vilivyosanidiwa kufanya kazi katika OpenShift
  3. faili apache-jmeter-5.2.tgz

Kama vipimo itakuwa rahisi HTTP Request juu ya ya.ru katika mkondo mmoja.

Kuunda mradi katika OpenShift

Wacha tuanze kwa kuunda mazingira mapya. Hebu tuunde perftest kuzungukwa na timu:

$ oc new-project perftest --display-name="Performance Tests" --description="Performance Tests - JMeter"

Tutahamishiwa kiotomatiki kwa mazingira mapya yaliyoundwa perftest, wacha tuangalie ikiwa hii ni hivyo:

$ oc project
Using project "perftest" on server "https://127.0.0.1:8443".

Uundaji wa Hifadhi

Ripoti za majaribio zitahifadhiwa pamoja na seva ya wavuti na jmeter-meter'mahali - /jmeter/reports.

Ni bora kuunda Storajs sasa, kwa sababu POD zitafungwa kwao jmeter-web ΠΈ jmeter-master.

Utapata habari zaidi juu ya uhifadhi katika hati rasmi Hifadhi ya kudumu.

Wacha tutengeneze faili za yaml PV ΠΈ PVC.

pv.yaml

$ tee pv.yaml<<EOF
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jmeter-reports
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: glusterfs-cluster
    path: /jmeter/reports
    readOnly: false
  persistentVolumeReclaimPolicy: Retain
EOF

pvc.yaml

$ tee pvc.yaml<<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jmeter-reports
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
EOF

Hebu tuunde PV ΠΈ PVC kuzungukwa na OpenShift:

$ oc create -f pv.yaml -n perftest
$ oc create -f pvc.yaml -n perftest

Kuangalia hali ya PVC:

$ oc get pvc -n perftest
NAME             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
jmeter-reports   Bound     pvc-b0e5f152-db4b-11ea-a497-566f75280024   10Gi       RWX            glusterfs-storage   8m

Hivi ndivyo itakavyoonekana kwenye GUI:

Kuendesha majaribio ya JMeter katika OpenShift kwa kutumia Jenkins Pipeline

Kuunda Picha ya Msingi ya JMeter

Wacha tuendelee kuunda ImageStream ΠΈ BuildConfig.

Unaweza kupata habari zote muhimu katika nyaraka - Hujenga na Mipasho ya Picha.

Mkakati wa kujenga picha ni Docker kutoka kwa chanzo cha ndani.

Wacha tutengeneze picha ya msingi jmeter-base, ambayo itakuwa msingi wa jmeter-master.

Dockerfile

FROM openjdk:8u212-jdk

ARG JMETER_VER="5.2"
ENV JMETER_HOME /jmeter/apache-jmeter-$JMETER_VER
ENV PATH $JMETER_HOME/bin:$PATH

RUN mkdir -p /jmeter/results 
    && mkdir /jmeter/tests

WORKDIR /jmeter

COPY apache-jmeter-$JMETER_VER.tgz .

RUN tar -xzf $JMETER_HOME.tgz 
    && rm $JMETER_HOME.tgz 
    && ls -la

RUN sed -i s/#server.rmi.ssl.disable=false/server.rmi.ssl.disable=true/ $JMETER_HOME/bin/jmeter.properties

EXPOSE 60000

ni.yaml

$ tee is.yaml<<EOF
apiVersion: v1
kind: ImageStream
metadata:
  labels:
    build: jmeter-base
  name: jmeter-base
EOF

bc.yaml

$ tee bc.yaml<<EOF
apiVersion: v1
kind: BuildConfig
metadata:
  name: jmeter-base
spec:
  failedBuildsHistoryLimit: 5
  nodeSelector: null
  output:
    to:
      kind: ImageStreamTag
      name: 'jmeter-base:latest'
  postCommit: {}
  resources: {}
  runPolicy: Serial
  source:
    binary: {}
    type: Binary
  strategy:
    dockerStrategy:
      from:
        kind: ImageStreamTag
        name: 'openjdk:8u212-jdk'
    type: Docker
  successfulBuildsHistoryLimit: 5
EOF

Wacha tuunde vitu IS ΠΈ BC:

$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest

Sasa hebu tukusanye picha ya msingi jmeter-base:

$ oc start-build jmeter-base -n perftest --from-dir=. --follow

JMeter WEB

jmeter-web Hii ni seva ya wavuti ya Apache. Kazi yake ni kutoa saraka na matokeo ya mtihani kwa kutazama.

Imetayarishwa Dockerfile na faili ya usanidi httpd.conf. Kwa maelekezo DocumentRoot seti ya thamani /jmeter/reports, i.e. saraka ambayo matokeo ya mtihani yanahifadhiwa.

Dockerfile

$ tee Dockerfile<<EOF
FROM httpd:2.4

COPY httpd.conf /usr/local/apache2/conf/httpd.conf
RUN chmod -R 777 /usr/local/apache2/logs

EXPOSE 8080

CMD ["httpd", "-D", "FOREGROUND"]
EOF

ni.yaml

$ tee is.yaml<<EOF
apiVersion: v1
kind: ImageStream
metadata:
  generation: 1
  labels:
    build: jmeter-web
  name: jmeter-web
EOF

bc.yaml

$ tee bc.yaml<<EOF
apiVersion: v1
kind: BuildConfig
metadata:
  name: jmeter-web
spec:
  failedBuildsHistoryLimit: 5
  nodeSelector: null
  output:
    to:
      kind: ImageStreamTag
      name: 'jmeter-web:latest'
  runPolicy: Serial
  source:
    binary: {}
    type: Binary
  strategy:
    dockerStrategy:
      from:
        kind: ImageStreamTag
        name: 'httpd:2.4'
    type: Docker
  successfulBuildsHistoryLimit: 5
EOF

Hebu tuunde ImageStream ΠΈ BuildConfig vitu:

$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest

Inakusanya picha kutoka Dockerfile:

$ oc start-build jmeter-web -n perftest --from-dir=. --follow

dc.yaml

$ tee dc.yaml<<EOF
apiVersion: apps.openshift.io/v1
kind: DeploymentConfig
metadata:
  name: jmeter-web
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: jmeter-web
    spec:
      containers:
        - image: 172.30.1.1:5000/perftest/jmeter-web
          name: jmeter-web
          volumeMounts:
            - mountPath: /jmeter/reports
              name: jmeter-reports
          ports:
            - containerPort: 80
              protocol: TCP
            - containerPort: 8080
              protocol: TCP
      volumes:
        - name: jmeter-reports
          persistentVolumeClaim:
            claimName: jmeter-reports
EOF

sc.yaml

$ tee sc.yaml<<EOF
apiVersion: v1
kind: Service
metadata:
  labels:
    app: jmeter-web
  name: jmeter-web
spec:
  ports:
    - name: 8080-tcp
      port: 8080
      protocol: TCP
      targetPort: 8080
  selector:
    deploymentconfig: jmeter-web
  sessionAffinity: None
  type: ClusterIP
EOF

Wacha tuunde vitu Service ΠΈ DeploymentConfig:

$ oc create -f sc.yaml -n perftest
$ oc create -f dc.yaml -n perftest

Jmeter-bwana

Wacha tuanze kupeleka seva ya wavuti ya Apache.

Hii ndio faili ya Docker jmeter-master'a, kulingana na jmeter-base, ambayo itaendesha majaribio na kuhifadhi matokeo kwenye hifadhi.

Dockerfile

Dockerfile kwa jmeter-master, kulingana na jmeter-base.

FROM jmeter-base

ARG JMETER_VER="5.2"
ENV JMETER_HOME /jmeter/apache-jmeter-$JMETER_VER
ENV PATH $JMETER_HOME/bin:$PATH

WORKDIR /jmeter
COPY run.sh /jmeter/
COPY tests/*.jmx /jmeter/tests/
RUN chmod +x /jmeter/run.sh

ENTRYPOINT ["/bin/bash"]
CMD ["/jmeter/run.sh"]

kukimbia.sh

run.sh hii ni hati inayoendesha JMeter na kuhifadhi matokeo kwenye saraka files.

Kila wakati hati inapozinduliwa, hufuta majaribio ya awali, kwa hivyo unaweza kufanya kazi na data ya hivi punde pekee. Lakini hii sio shida, kwa sababu unaweza kuibadilisha ili kukidhi mahitaji yako.

#!/bin/bash

set -e

if [ -d "/jmeter/reports/files" ]
then
    echo "Directory /jmeter/reports/files exist - OK"
else
    echo "Creating /jmeter/reports/files directory"
    mkdir /jmeter/reports/files
fi

if [ -d "/jmeter/reports/dashboards" ]
then
    echo "Directory /jmeter/reports/dashboards exist"
else
    echo "Creating /jmeter/reports/dashboards directory"
    mkdir /jmeter/reports/dashboards
fi

echo "*** JMeter START Tests ***"

for item in $(ls -1 /jmeter/tests | grep jmx)
do
    echo "*** Removing dashboard directory for $item"
    rm -rdf /jmeter/reports/dashboards/${item}*

    echo "*** Removing tests directory for $item"
    rm -rdf /jmeter/reports/files/${item}*

    echo "*** Testing a $item file ***"
    jmeter -n -t /jmeter/tests/${item} -l /jmeter/reports/files/${item}-report.jtl -e -o /jmeter/reports/dashboards/${item}-dash
done

ni.yaml

$ tee is.yaml<<EOF
apiVersion: image.openshift.io/v1
kind: ImageStream
metadata:
  generation: 1
  labels:
    build: jmeter-master
  name: jmeter-master
EOF

bc.yaml

$ tee bc.yaml<<EOF
apiVersion: build.openshift.io/v1
kind: BuildConfig
metadata:
  name: jmeter-master
spec:
  failedBuildsHistoryLimit: 5
  nodeSelector: null
  output:
    to:
      kind: ImageStreamTag
      name: 'jmeter-master:latest'
  runPolicy: Serial
  source:
    binary: {}
    type: Binary
  strategy:
    dockerStrategy:
      from:
        kind: ImageStreamTag
        name: 'jmeter-base:latest'
    type: Docker
  successfulBuildsHistoryLimit: 5
EOF

Hebu tuunde IS ΠΈ BC vitu:

$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest

Tunakusanya jmeter-master picha:

$ oc start-build jmeter-master -n perftest --from-dir=. --follow

Kazi

Jobzinatumika katika OpenShift'e ili kukimbia moja au zaidi POD's na uhakikishe kukamilika kwao kwa mafanikio baada ya kutekeleza amri/hati.

$ tee job.yaml<<EOF
apiVersion: batch/v1
kind: Job
metadata:
  name: jmeter-master
  labels:
    jobName: jmeter-master
spec:
  completions: 1
  parallelism: 1
  template:
    metadata:
      name: jmeter-master
      labels:
        jobName: jmeter-master
    spec:
      containers:
        - name: jmeter-master
          image: 172.30.1.1:5000/perftest/jmeter-master:latest
          volumeMounts:
            - mountPath: /jmeter/reports
              name: jmeter-reports
          imagePullPolicy: Always
      volumes:
        - name: jmeter-reports
          persistentVolumeClaim:
            claimName: jmeter-reports
      restartPolicy: Never
      terminationGracePeriodSeconds: 30
EOF

Unda kitu Job:

$ oc create -f job.yaml -n perftest

Wacha tuangalie hali ya kazi:

$ oc get jobs -n perftest
NAME            DESIRED   SUCCESSFUL   AGE
jmeter-master   1         1            5m

Kufuta Job hebu tumia amri:

$ oc delete jobs/jmeter-master -n perftest --ignore-not-found=true

Jenkins Bomba

Sasa otomatiki. Wacha tupitie hatua tena:

  1. git clone
  2. oc whoami -t
  3. oc start-build ...
  4. oc delete jobs/jmeter-master
  5. oc create -f job.yaml -n perftest

Chini ni bomba ambalo uundaji wa hifadhi, ufutaji na uundaji wa OpenShift hufanywa Jobya.

#!groovy

pipeline {

    agent any

    stages {

        stage('Start Notifications') {
            steps {
                echo "Sending Email Notification"
            }
            post {
                always {
                    echo "STARTED - Performance Tests"
                    mail(to: '[email protected]', from: "[email protected]", subject: "START - Performance Tests",mimeType: "text/html", body: "<strong>START - Performance Tests</strong><br /><br />Project: Name of Project<br />Environment: PerfTest<br />Build number: ${env.BUILD_NUMBER}<br />Build URL:   ${env.BUILD_URL}"
                }
            }
        }

        stage('Git checkout') {
            steps {
                ...
            }
        }

        stage('Perf Tests') {
            steps {
                script {
                    sh '''
                        OC_CMD1="oc login -u=username -p=PASS -n=perftest 
                        --server=https://...:8443"

                        $OC_CMD1

                        OC_TOKEN=`oc whoami -t`

                        OC_CMD2="oc --token=$OC_TOKEN --server=https://...:8443 
                        start-build jmeter-master -n=perftest --from-dir=./master 
                        --follow=true"

                        OC_CMD3="oc --token=$OC_TOKEN --server=https://...:8443 
                        delete jobs/jmeter-master -n=perftest --ignore-not-found=true"

                        OC_CMD4="oc--token=$OC_TOKEN --server=https://...:8443 
                        create -f ./master/job.yaml -n=perftest"

                        $OC_CMD2
                        $OC_CMD3
                        $OC_CMD4
                    '''
                }
            }
        }

        post {
            failure {
                echo "FAILED - Performance Tests"
                mail(to: '[email protected]', from: "[email protected]", subject: "FAILED - Performance Tests",mimeType: "text/html", body: "<strong>FAILED - Performance Tests</strong><br /><br />Project: Name of Project<br />Environment: PerfTest<br />Build number: ${env.BUILD_NUMBER}<br />Build URL: ${env.BUILD_URL}"
                }

            success {
                echo "SUCCESSED - Performance Tests"
                mail(to: '[email protected]', from: "[email protected]", subject: "SUCCESSED - Performance Tests",mimeType: "text/html", body: "<strong>SUCCESSED - Performance Tests</strong><br /><br />Project: Name of Project<br />Environment: PerfTest<br />Build number: ${env.BUILD_NUMBER}<br />Build URL:   ${env.BUILD_URL}"
            }
        }

    }
}

Baada ya Pipeline kukamilisha utendakazi wake, tutapokea arifa kupitia barua pepe '[email protected] kutoka [email protected].

Kwa kubofya kiungo http://jmeter-web.127.0.0.1.nip.io/ tutaona saraka files, ambayo huhifadhi ripoti za majaribio:

Kuendesha majaribio ya JMeter katika OpenShift kwa kutumia Jenkins Pipeline

Yaliyomo kwenye faili ya.HTTP.Request.jmx-report.jtk:

timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect
1597311456443,569,Yandex - HTTP Request,200,Ok,Thread Group 1-1,text,true,,59449,220,1,1,https://ya.ru/,145,0,57
1597311456443,147,Yandex - HTTP Request-0,302,Found,Thread Group 1-1,,true,,478,110,1,1,http://ya.ru/,145,0,57
1597311456592,420,Yandex - HTTP Request-1,200,Ok,Thread Group 1-1,text,true,,58971,110,1,1,https://ya.ru/,370,0,259

Hitimisho

Nakala hii ilionyesha moja ya chaguzi za kuendesha majaribio ya JMeter katika mazingira ya OpenShift. Tulikamilisha hatua zote kwa mikono, baada ya hapo tukaunda Bomba la Jenkins ili kurekebisha mchakato wa kuendesha majaribio.

Vyanzo na nyaraka

Chanzo: mapenzi.com

Kuongeza maoni