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:
- en fungerande OpenShift (v3.11) klyfta
- Jenkins-server med konfigurerade autentiseringsuppgifter för att arbeta i OpenShift
- 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 .
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
EOFpvc.yaml
$ tee pvc.yaml<<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jmeter-reports
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
EOFVi skapar PV och PVC i OpenShift-miljön:
$ oc create -f pv.yaml -n perftest
$ oc create -f pvc.yaml -n perftestVi 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 8mSÄ hÀr kommer det att se ut i GUI:

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 â .
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 60000is.yaml
$ tee is.yaml<<EOF
apiVersion: v1
kind: ImageStream
metadata:
labels:
build: jmeter-base
name: jmeter-base
EOFbc.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
EOFLÄt oss skapa objekt IS och BC:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftestNu samlar vi basbilden jmeter-base:
$ oc start-build jmeter-base -n perftest --from-dir=. --followJMeter 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"]
EOFis.yaml
$ tee is.yaml<<EOF
apiVersion: v1
kind: ImageStream
metadata:
generation: 1
labels:
build: jmeter-web
name: jmeter-web
EOFbc.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
EOFVi skapar ImageStream och BuildConfig objekt:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftestVi samlar bilden frÄn Dockerfile:
$ oc start-build jmeter-web -n perftest --from-dir=. --followdc.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
EOFsc.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
EOFLÄt oss skapa objekt TjÀnst och DeploymentConfig:
$ oc create -f sc.yaml -n perftest
$ oc create -f dc.yaml -n perftestJmeter-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
doneis.yaml
$ tee is.yaml<<EOF
apiVersion: image.openshift.io/v1
kind: ImageStream
metadata:
generation: 1
labels:
build: jmeter-master
name: jmeter-master
EOFbc.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
EOFVi skapar IS och BC objekt:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftestVi bygger jmeter-master bild:
$ oc start-build jmeter-master -n perftest --from-dir=. --followJob
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
EOFVi skapar ett objekt Job:
$ oc create -f job.yaml -n perftestLÄt oss kontrollera jobbstatusen:
$ oc get jobs -n perftest
NAME DESIRED SUCCESSFUL AGE
jmeter-master 1 1 5mFör att ta bort Job anvÀnder vi kommandot:
$ oc delete jobs/jmeter-master -n perftest --ignore-not-found=trueJenkins Pipeline
Nu automatisering. LÄt oss upprepa stegen:
git cloneoc whoami -toc start-build ...oc delete jobs/jmeter-masteroc 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 ser vi katalogen filer, dÀr testreporterna lagras:

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,259Slutsats
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
- openshift
KĂ€lla: habr.com
