Kørsel af JMeter-tests i OpenShift ved hjælp af Jenkins Pipeline

Hej alle sammen!

I denne artikel vil jeg dele en metode til at køre JMeter ydeevnetests i OpenShift ved hjælp af Jenkins som automatisering. Først vil vi udføre alle nødvendige handlinger (oprettelse og andet) manuelt. Derefter vil vi skrive en Jenkins Pipeline. ImageStreams, BuildConfig, Job og andet i manuel tilstand. Herefter skriver vi Jenkins Pipeline.

Som udgangspunkt skal vi have:

  1. et fungerende OpenShift (v3.11) cluster
  2. Jenkins-server med konfigurerede legitimationsoplysninger til at arbejde i OpenShift
  3. fil apache-jmeter-5.2.tgz

Testene vil være en simpel HTTP-forespørgsel og få en fungerende kommando. ya.ru i én tråd.

Oprettelse af projekt i OpenShift

Lad os starte med at oprette et nyt miljø. Vi opretter perftest miljøet med følgende kommando:

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

Vi bliver automatisk sendt til det nysoprettede miljø perftest, lad os tjekke det:

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

Oprettelse af Storage

Testsrapporter vil blive gemt i et fælles område for webserveren og jmeter-meter’s plads — /jmeter/reports.

Det er bedst at oprette storage nu, da de vil være knyttet til POD'erne jmeter-web og jmeter-master.

Du kan finde mere detaljeret information om storage i den officielle dokumentation Persistent Storage.

Lad os oprette yaml-filer til PV og 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

Vi opretter PV og PVC i OpenShift-miljøet:

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

Tjekker status for 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

Her er, hvordan det vil se ud i GUI:

Kørsel af JMeter-tests i OpenShift ved hjælp af Jenkins Pipeline

Oprettelse af grundlæggende JMeter billede

Lad os gå videre til oprettelse af ImageStream og BuildConfig.

Du kan finde alle nødvendige oplysninger i dokumentationen — Builds and Image Streams.

Som bygge-strategi for billeder anvendes Docker fra en lokal kilde.

Lad os oprette det grundlæggende billede jmeter-base, som vil være grundlaget for 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

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

Lad os oprette objekter IS og BC:

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

Lad os nu bygge basebilledet jmeter-base:

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

JMeter WEB

jmeter-web det er Apache-webserveren. Dens opgave er at levere en mappe med testresultater til visning.

Forberedt Dockerfile og konfigurationsfilen httpd.conf. For direktivet DocumentRoot er værdien indstillet til /jmeter/reports, dvs. mappen, hvor testresultaterne gemmes.

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

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

Vi opretter ImageStream og BuildConfig objekter:

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

Vi bygger billedet fra 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

Lad os oprette objekter Service og DeploymentConfig:

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

Jmeter-master

Lad os arbejde med deploymenten af Apache-webserveren.

Dette er Dockerfile jmeter-master‘a, baseret på jmeter-base, som vil køre testene og gemme resultaterne i lageret.

Dockerfile

Dockerfile for jmeter-master, baseret på 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"]

run.sh

run.sh det er et script, der udfører opstart af JMeter og gemmer resultaterne i mappen files.

Ved hver kørsel sletter scriptet tidligere tests, så man kan kun arbejde med de nyeste data. Men det er ikke et problem, da det kan ændres til ens egne behov.

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

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

Vi opretter IS og BC objekter:

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

Vi samler jmeter-master billede:

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

Job

Job‘er bruges til Mandag den 1. juni 12:00-14:00‘e til at køre en eller flere POD‘er og sikre deres succesfulde afslutning efter udførelse af kommandoen/skriptet.

$ 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

Vi opretter objektet Job:

$ oc create -f job.yaml -n perftest

Lad os tjekke jobs status:

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

For at slette Job bruger vi kommandoen:

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

Jenkins Pipeline

Nu til automatiseringen. Lad os gennemgå trinene igen:

  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

Nedenfor er et pipeline, hvor kloning af repository, sletning og oprettelse af OpenShift Job‘er udføres.

#!groovy

pipeline {

    agent any

    stages {

        stage('Start Notifications') {
            steps {
                echo "Sending Email Notification"
            }
            post {
                always {
                    echo "STARTED - Performance Tests"
                    mail(to: 'username@srv.net', from: "jenkins@srv.net", subject: "START - Performance Tests",mimeType: "text/html", body: "<strong>START - Performance Tests</strong><br /><br />Projekt: Navn på projekt<br />Miljø: PerfTest<br />Byg nummer: ${env.BUILD_NUMBER}<br />Byg 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 "MISLYKKET - Performance Tests"
                mail(to: 'username@srv.net', from: "jenkins@srv.net", subject: "MISLYKKET - Performance Tests",mimeType: "text/html", body: "<strong>MISLYKKET - Performance Tests</strong><br /><br />Projekt: Navn på projekt<br />Miljø: PerfTest<br />Byg nummer: ${env.BUILD_NUMBER}<br />Byg URL: ${env.BUILD_URL}"
                }

            success {
                echo "VILLE HENDE - Performance Tests"
                mail(to: 'username@srv.net', from: "jenkins@srv.net", subject: "VILLE HENDE - Performance Tests",mimeType: "text/html", body: "<strong>VILLE HENDE - Performance Tests</strong><br /><br />Projekt: Navn på projekt<br />Miljø: PerfTest<br />Byg nummer: ${env.BUILD_NUMBER}<br />Byg URL:   ${env.BUILD_URL}"
            }
        }

    }
}

Når pipelinen er afsluttet, får vi en meddelelse via e-mail 'username@srv.net fra jenkins@srv.net.

Ved at klikke på linket http://jmeter-web.127.0.0.1.nip.io/ ser vi mappen files, hvor test rapporter gemmes:

Kørsel af JMeter-tests i OpenShift ved hjælp af Jenkins Pipeline

Indholdet af filen 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

Konklusion

I denne artikel blev en af metoderne til at køre JMeter tests i OpenShift miljøet demonstreret. Vi gennemførte alle trin manuelt, hvorefter vi oprettede en Jenkins Pipeline til at automatisere testkøringsprocessen.

Kilder og dokumentation

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster