Hej alle!
I denne artikel vil jeg dele en af måderne at køre JMeter-ydeevnetest i OpenShift ved hjælp af Jenkins som automatisering. Først vil vi gøre alle de nødvendige trin (oprettelse ImageStreams
, BuildConfig
, Job
osv.) i manuel tilstand. Efter det, lad os skrive Jenkins Pipeline.
Som udgangspunkt bør vi have:
- kører OpenShift (v3.11) klynge
- Jenkins-server med konfigurerede legitimationsoplysninger til at fungere i OpenShift
- файл
apache-jmeter-5.2.tgz
Som test vil det være enkelt HTTP Request
på ya.ru
i én strøm.
Oprettelse af et projekt i OpenShift
Lad os starte med at skabe et nyt miljø. Lad os skabe perftest
omgivet af et hold:
$ oc new-project perftest --display-name="Performance Tests" --description="Performance Tests - JMeter"
Vi bliver automatisk overført til det nyoprettede miljø perftest
, lad os tjekke, at det er sådan:
$ oc project
Using project "perftest" on server "https://127.0.0.1:8443".
Oprettelse af lager
Testrapporter vil blive gemt i fællesskab med webserveren og jmeter-meter
'et sted - /jmeter/reports
.
Det er bedre at oprette Storajs nu, fordi POD'er vil være knyttet til dem jmeter-web
и jmeter-master
.
Du finder mere detaljerede oplysninger om opbevaring i den officielle dokumentation
Lad os oprette yaml-filer til 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
Lad os skabe PV
и PVC
omgivet af OpenShift:
$ oc create -f pv.yaml -n perftest
$ oc create -f pvc.yaml -n perftest
Kontrollerer 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
Sådan ser det ud i GUI'en:
Oprettelse af et JMeter-basebillede
Lad os gå videre til at skabe ImageStream
и BuildConfig
.
Du kan finde alle nødvendige oplysninger i dokumentationen -
Billedopbygningsstrategien er Docker
fra en lokal kilde.
Lad os skabe et basisbillede jmeter-base
, som bliver grundlaget for jmeter-master
.
Dockerfil
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
er.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 skabe objekter IS
и BC
:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Lad os nu samle basisbilledet jmeter-base
:
$ oc start-build jmeter-base -n perftest --from-dir=. --follow
JMeter WEB
jmeter-web
Dette er en Apache-webserver. Dens opgave er at levere en mappe med testresultater til visning.
Forberedt Dockerfile
og konfigurationsfil httpd.conf
. Til direktiv DocumentRoot
værdisæt /jmeter/reports
, dvs. den mappe, hvori testresultaterne er gemt.
Dockerfil
$ 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
er.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
Lad os skabe ImageStream
и BuildConfig
objekter:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Samler et billede 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 skabe objekter Service
и DeploymentConfig
:
$ oc create -f sc.yaml -n perftest
$ oc create -f dc.yaml -n perftest
Jmeter-mester
Lad os begynde at implementere Apache-webserveren.
Dette er Dockerfilen jmeter-master
'a, baseret på jmeter-base
, som vil køre test og gemme resultaterne på lager.
Dockerfil
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
dette er et script, der kører JMeter og gemmer resultaterne i en mappe files
.
Hver gang scriptet startes, sletter det tidligere tests, så du kun kan arbejde med de nyeste data. Men det er ikke et problem, for du kan ændre det, så det passer til dine 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
er.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
Lad os skabe IS
и 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 brugt i OpenShift
'e for at køre en eller flere POD
's og garanterer deres succesfulde gennemførelse efter udførelse af kommandoen/scriptet.
$ 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
Opret et objekt Job
:
$ oc create -f job.yaml -n perftest
Lad os tjekke status for jobbet:
$ oc get jobs -n perftest
NAME DESIRED SUCCESSFUL AGE
jmeter-master 1 1 5m
At slette Job
lad os bruge kommandoen:
$ oc delete jobs/jmeter-master -n perftest --ignore-not-found=true
Jenkins rørledning
Nu automatisering. Lad os gennemgå trinene igen:
git clone
oc whoami -t
oc start-build ...
oc delete jobs/jmeter-master
oc create -f job.yaml -n perftest
Nedenfor er en pipeline, hvori depotkloning, sletning og oprettelse af OpenShift udføres 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}"
}
}
}
}
Efter at Pipeline har afsluttet sin drift, vil vi modtage en meddelelse via e-mail '[email protected]
fra [email protected]
.
Ved at klikke på linket files
, som gemmer testrapporter:
Filens indhold 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
Denne artikel demonstrerede en af mulighederne for at køre JMeter-test i OpenShift-miljøet. Vi gennemførte alle trinene manuelt, hvorefter vi oprettede Jenkins Pipeline for at automatisere processen med at køre test.
Kilder og dokumentation
JMeter – Distribueret belastningstest ved hjælp af Docker Kørsel af JMeter-tests i OpenShift fra en Jenkins-pipeline åbner skiftVedvarende opbevaring Byg og billedstrømme
Kilde: www.habr.com