JMeter probak exekutatzen OpenShift-en Jenkins Pipeline erabiliz

Hola a todos!

Artikulu honetan JMeter errendimendu-probak OpenShift-en exekutatzeko moduetako bat partekatu nahi dut Jenkins automatizazio gisa erabiliz. Lehenik eta behin beharrezko urrats guztiak egingo ditugu (sortzea ImageStreams, BuildConfig, Job etab.) eskuzko moduan. Horren ondoren, idatzi dezagun Jenkins Pipeline.

Abiapuntu gisa izan beharko genuke:

  1. OpenShift (v3.11) kluster exekutatzen
  2. Jenkins zerbitzaria OpenShift-en lan egiteko konfiguratutako kredentzialak dituena
  3. fitxategia apache-jmeter-5.2.tgz

Proba gisa erraza izango da HTTP Request on ya.ru korronte batean.

Proiektu bat sortzea OpenShift-en

Has gaitezen ingurune berri bat sortzen. Sor dezagun perftest talde batez inguratuta:

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

Automatikoki sortu berri den ingurunera transferituko gara perftest, egiaztatu dezagun hau horrela dela:

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

Biltegiratzea sortzea

Proba txostenak komunean gordeko dira web zerbitzariarekin eta jmeter-meter'leku bat - /jmeter/reports.

Hobe da Storaj-ak orain sortzea, POD-ak haiei lotuta egongo direlako jmeter-web ΠΈ jmeter-master.

Biltegiratzeari buruzko informazio zehatzagoa dokumentazio ofizialean aurkituko duzu Biltegiratze iraunkorra.

Sor ditzagun yaml fitxategiak 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

Sor dezagun PV ΠΈ PVC OpenShift inguratuta:

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

Egoera egiaztatzea 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

Hona hemen GUI-n nolakoa izango den:

JMeter probak exekutatzen OpenShift-en Jenkins Pipeline erabiliz

JMeter oinarrizko irudia sortzea

Goazen sortzera ImageStream ΠΈ BuildConfig.

Beharrezko informazio guztia dokumentazioan aurki dezakezu - Eraikuntzak eta irudi korronteak.

Irudia eraikitzeko estrategia da Docker tokiko iturri batetik.

Sortu dezagun oinarrizko irudi bat jmeter-base, oinarria izango dena 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

da.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

Sor ditzagun objektuak IS ΠΈ BC:

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

Orain munta dezagun oinarrizko irudia jmeter-base:

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

JMeter WEB

jmeter-web Hau Apache web zerbitzari bat da. Bere zeregina da direktorio bat eskaintzea probaren emaitzak ikusteko.

Prestatuta Dockerfile eta konfigurazio fitxategia httpd.conf. Zuzentaraurako DocumentRoot balio multzoa /jmeter/reports, hau da. probaren emaitzak gordetzen diren direktorioa.

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

da.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

Sor dezagun ImageStream ΠΈ BuildConfig objektuak:

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

Irudi bat biltzen 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

Sor ditzagun objektuak Service ΠΈ DeploymentConfig:

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

Jmeter-maisu

Has gaitezen Apache web zerbitzaria zabaltzen.

Hau Dockerfile da jmeter-master'a, oinarrituta jmeter-base, probak egin eta emaitzak biltegian gordeko dituena.

Dockerfile

Dockerfile egiteko jmeter-master, oinarrituta 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"]

korrika.sh

run.sh JMeter exekutatzen duen eta emaitzak direktorio batean gordetzen dituen script bat da files.

Scripta abiarazten den bakoitzean, aurreko probak ezabatzen ditu, beraz, azken datuekin bakarrik lan egin dezakezu. Baina hau ez da arazo bat, zure beharretara egokitzeko alda dezakezulako.

#!/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

da.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

Sor dezagun IS ΠΈ BC objektuak:

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

Bildu egiten dugu jmeter-master irudia:

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

Lana

Joburtean erabiltzen dira OpenShift'e bat edo gehiago exekutatzeko POD's eta komandoa/scripta exekutatu ondoren arrakastaz osatzea bermatu.

$ 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

Sortu objektu bat Job:

$ oc create -f job.yaml -n perftest

Ikus dezagun lanaren egoera:

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

Ezabatzeko Job erabil dezagun komandoa:

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

Jenkins Pipeline

Orain automatizazioa. Ikus ditzagun berriro urratsak:

  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

Jarraian, OpenShift-en biltegia klonatzea, ezabatzea eta sortzea egiten diren kanalizazio bat dago Job's.

#!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}"
            }
        }

    }
}

Pipeline-k bere funtzionamendua amaitu ondoren, jakinarazpen bat jasoko dugu posta elektronikoz '[email protected] tik [email protected].

Estekan klik eginez http://jmeter-web.127.0.0.1.nip.io/ direktorioa ikusiko dugu files, proba-txostenak gordetzen dituena:

JMeter probak exekutatzen OpenShift-en Jenkins Pipeline erabiliz

Fitxategien edukia 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

Ondorioa

Artikulu honek OpenShift ingurunean JMeter probak exekutatzeko aukeretako bat erakutsi zuen. Urrats guztiak eskuz burutu genituen, ondoren Jenkins Pipeline sortu genuen probak exekutatzeko prozesua automatizatzeko.

Iturriak eta dokumentazioa

Iturria: www.habr.com

Gehitu iruzkin berria