Hallo iedereen!
In dit artikel wil ik een van de manieren delen om JMeter-prestatietests uit te voeren in OpenShift met Jenkins als automatisering. Eerst zullen we alle noodzakelijke stappen uitvoeren (creëren ImageStreams
, BuildConfig
, Job
enz.) in handmatige modus. Laten we daarna Jenkins Pipeline schrijven.
Als uitgangspunt zouden we moeten hebben:
- met OpenShift-cluster (v3.11).
- Jenkins-server met geconfigureerde inloggegevens om in OpenShift te werken
- файл
apache-jmeter-5.2.tgz
Als tests zal het eenvoudig zijn HTTP Request
op ya.ru
in één stroom.
Een project maken in OpenShift
Laten we beginnen met het creëren van een nieuwe omgeving. Laten we creëren perftest
omringd door een team:
$ oc new-project perftest --display-name="Performance Tests" --description="Performance Tests - JMeter"
Wij worden automatisch overgezet naar de nieuw aangemaakte omgeving perftest
, laten we controleren of dit zo is:
$ oc project
Using project "perftest" on server "https://127.0.0.1:8443".
Creëren van opslag
Testrapporten worden samen met de webserver opgeslagen jmeter-meter
'een plek - /jmeter/reports
.
Het is beter om nu Storajs te maken, omdat PODs eraan gekoppeld zullen zijn jmeter-web
и jmeter-master
.
Meer gedetailleerde informatie over opslag vindt u in de officiële documentatie
Laten we yaml-bestanden maken voor 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
Laten we creëren PV
и PVC
omringd door OpenShift:
$ oc create -f pv.yaml -n perftest
$ oc create -f pvc.yaml -n perftest
De status controleren van 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
Zo ziet het eruit in de GUI:
Een JMeter-basisimage maken
Laten we verder gaan met creëren ImageStream
и BuildConfig
.
Alle benodigde informatie vindt u in de documentatie -
De strategie voor het opbouwen van afbeeldingen is Docker
uit een lokale bron.
Laten we een basisafbeelding maken jmeter-base
, die de basis zal vormen 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
Laten we objecten maken IS
и BC
:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Laten we nu de basisafbeelding samenstellen jmeter-base
:
$ oc start-build jmeter-base -n perftest --from-dir=. --follow
JMeter WEB
jmeter-web
Dit is een Apache-webserver. Het is zijn taak om een map met testresultaten ter beschikking te stellen.
Voorbereid Dockerfile
en configuratiebestand httpd.conf
. Voor richtlijn DocumentRoot
waarde ingesteld /jmeter/reports
, d.w.z. de map waarin testresultaten worden opgeslagen.
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
Laten we creëren ImageStream
и BuildConfig
voorwerpen:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Een afbeelding verzamelen van 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
Laten we objecten maken Service
и DeploymentConfig
:
$ oc create -f sc.yaml -n perftest
$ oc create -f dc.yaml -n perftest
Jmeter-meester
Laten we beginnen met het implementeren van de Apache-webserver.
Dit is het Dockerbestand jmeter-master
'a, gebaseerd op jmeter-base
, waarmee tests worden uitgevoerd en de resultaten in de opslag worden opgeslagen.
Dockerfile
Dockerfile
voor jmeter-master
, gebaseerd op 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"]
rennen.sh
run.sh
dit is een script dat JMeter uitvoert en de resultaten in een map opslaat files
.
Elke keer dat het script wordt gestart, worden eerdere tests verwijderd, zodat u alleen met de nieuwste gegevens kunt werken. Maar dit is geen probleem, want u kunt het naar eigen wens aanpassen.
#!/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
Laten we creëren IS
и BC
voorwerpen:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
We verzamelen jmeter-master
afbeelding:
$ oc start-build jmeter-master -n perftest --from-dir=. --follow
Jobomschrijving:
Job
's worden gebruikt OpenShift
'e om er een of meer uit te voeren POD
's en garanderen hun succesvolle voltooiing na het uitvoeren van de opdracht/script.
$ 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
Maak een object Job
:
$ oc create -f job.yaml -n perftest
Laten we de status van de taak controleren:
$ oc get jobs -n perftest
NAME DESIRED SUCCESSFUL AGE
jmeter-master 1 1 5m
Verwijderen Job
laten we het commando gebruiken:
$ oc delete jobs/jmeter-master -n perftest --ignore-not-found=true
Jenkins-pijpleiding
Nu automatisering. Laten we de stappen nog eens doornemen:
git clone
oc whoami -t
oc start-build ...
oc delete jobs/jmeter-master
oc create -f job.yaml -n perftest
Hieronder ziet u een pijplijn waarin het klonen, verwijderen en OpenShift-creatie van repository's worden uitgevoerd 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}"
}
}
}
}
Nadat Pipeline zijn werking heeft voltooid, ontvangen we een melding per e-mail '[email protected]
van [email protected]
.
Door op de link te klikken files
, waarin testrapporten worden opgeslagen:
Bestand inhoud 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
Conclusie
Dit artikel demonstreerde een van de opties voor het uitvoeren van JMeter-tests in de OpenShift-omgeving. We hebben alle stappen handmatig voltooid, waarna we Jenkins Pipeline hebben gemaakt om het proces van het uitvoeren van tests te automatiseren.
Bronnen en documentatie
JMeter – Gedistribueerde belastingtesten met Docker JMeter-tests uitvoeren in OpenShift vanuit een Jenkins-pijplijn open dienstPersistente opslag Builds en beeldstreams
Bron: www.habr.com