Köra JMeter-tester i OpenShift med Jenkins Pipeline

Hej alla!

I denna artikel vill jag dela med mig av ett av sÀtten att köra prestandatest med JMeter i OpenShift med Jenkins som automatiseringsverktyg. Först kommer vi att göra alla nödvÀndiga ÄtgÀrder (skapande och sÄ vidare) manuellt. Efter det skriver vi en Jenkins Pipeline. ImageStreams, BuildConfig, Job och andra i manuellt lÀge. Efter det skriver vi en Jenkins Pipeline.

Som utgÄngspunkt bör vi ha:

  1. en fungerande OpenShift (v3.11) klyfta
  2. Jenkins-server med konfigurerade autentiseringsuppgifter för att arbeta i OpenShift
  3. filen apache-jmeter-5.2.tgz

Testerna kommer att vara en enkel HTTP Request till ya.ru i en ström.

Skapande av projekt i OpenShift

Vi börjar med att skapa en ny miljö. Vi skapar perftest miljö med kommandot:

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

Vi kommer automatiskt att flyttas till den nyss skapade miljön perftest, lÄt oss kolla att det Àr sÄ:

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

Skapande av Storage

Testrapporter kommer att lagras i den gemensamma webbservern och jmeter-meters plats — /jmeter/reports.

Det Àr bÀst att skapa lagret nu, eftersom POD:ar kommer att vara kopplade till dem jmeter-web och jmeter-master.

Mer information om lagring hittar du i den officiella dokumentationen Persistent Storage.

Vi skapar yaml-filer för PV och 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 skapar PV och PVC i OpenShift-miljön:

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

Vi kontrollerar statusen för 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

SÄ hÀr kommer det att se ut i GUI:

Köra JMeter-tester i OpenShift med Jenkins Pipeline

Skapande av grundbild JMeter

LÄt oss gÄ vidare till skapandet av ImageStream och BuildConfig.

All nödvĂ€ndig information kan du hitta i dokumentationen — Builds and Image Streams.

Som byggstrategi anvÀnds Docker frÄn lokal kÀlla.

Vi skapar en grundbild jmeter-base, som kommer att vara grunden för 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

LÄt oss skapa objekt IS och BC:

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

Nu samlar vi basbilden jmeter-base:

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

JMeter WEB

jmeter-web detta Àr Apache-webbservern. Dess uppgift Àr att ge en katalog med testresultat för visning.

Förberedd Dockerfile och konfigurationsfilen httpd.conf. För direktivet DocumentRoot Àr instÀllt pÄ /jmeter/reports, dvs. katalogen dÀr testresultaten sparas.

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 skapar ImageStream och BuildConfig objekt:

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

Vi samlar bilden frÄn 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

LÄt oss skapa objekt TjÀnst och DeploymentConfig:

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

Jmeter-master

LÄt oss hantera distributionen av Apache-webbservern.

Detta Ă€r Dockerfile jmeter-master‘a, baserat pĂ„ jmeter-base, som kommer att köra tester och spara resultaten i lagringen.

Dockerfile

Dockerfile för jmeter-master, baserat 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 detta Àr ett skript som kör JMeter och sparar resultaten i katalogen filer.

Vid varje körning tar skriptet bort tidigare tester, sÄ man kan bara arbeta med de senaste uppgifterna. Men det Àr inget problem, eftersom det gÄr att Àndra det efter 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 skapar IS och BC objekt:

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

Vi bygger jmeter-master bild:

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

Job

Job‘e anvĂ€nds i OpenShift‘e för att köra en eller flera POD‘er och sĂ€kerstĂ€lla att de avslutas framgĂ„ngsrikt efter att kommandot/manuset har körts.

$ 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 skapar ett objekt Job:

$ oc create -f job.yaml -n perftest

LÄt oss kontrollera jobbstatusen:

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

För att ta bort Job anvÀnder vi kommandot:

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

Jenkins Pipeline

Nu automatisering. LÄt oss upprepa stegen:

  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

Nedan visas en pipeline dĂ€r vi klonar lagret, tar bort och skapar OpenShift Job‘er.

#!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 - Prestandatester</strong><br /><br />Projekt: Projektnamn<br />Miljö: PerfTest<br />Byggnummer: ${env.BUILD_NUMBER}<br />Bygg-URL:   ${env.BUILD_URL}"
                }
            }
        }

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

        stage('Prestandatester') {
            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 "MISSLYCKAD - Prestandatester"
                mail(to: 'username@srv.net', from: "jenkins@srv.net", subject: "MISSLYCKAD - Prestandatester",mimeType: "text/html", body: "<strong>MISSLYCKAD - Prestandatester</strong><br /><br />Projekt: Projektnamn<br />Miljö: PerfTest<br />Byggnummer: ${env.BUILD_NUMBER}<br />Bygg-URL: ${env.BUILD_URL}"
                }

            success {
                echo "LYCKAD - Prestandatester"
                mail(to: 'username@srv.net', from: "jenkins@srv.net", subject: "LYCKAD - Prestandatester",mimeType: "text/html", body: "<strong>LYCKAD - Prestandatester</strong><br /><br />Projekt: Projektnamn<br />Miljö: PerfTest<br />Byggnummer: ${env.BUILD_NUMBER}<br />Bygg-URL:   ${env.BUILD_URL}"
            }
        }

    }
}

Efter att pipelinen har körts fÄr vi ett meddelande pÄ e-post 'username@srv.net frÄn jenkins@srv.net.

Genom att följa lÀnken http://jmeter-web.127.0.0.1.nip.io/ ser vi katalogen filer, dÀr testreporterna lagras:

Köra JMeter-tester i OpenShift med Jenkins Pipeline

InnehÄllet i 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

Slutsats

I den hÀr artikeln demonstrerades ett av sÀtten att köra JMeter-tester i OpenShift-miljö. Vi genomförde alla steg manuellt, varefter vi skapade en Jenkins Pipeline för att automatisera testkörningarna.

KĂ€llor och dokumentation

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster