Bonjour Ă tous !
Dans cet article, je souhaite partager l'une des maniÚres d'exécuter des tests de performance JMeter dans OpenShift en utilisant Jenkins comme automatisation. Tout d'abord, nous allons effectuer toutes les actions nécessaires (création ImageStreams, BuildConfig, Job et autres) manuellement. Ensuite, nous rédigerons un Jenkins Pipeline.
Comme point de départ, nous devons avoir :
- un cluster OpenShift fonctionnel (v3.11)
- un serveur Jenkins avec des identifiants configurés pour travailler dans OpenShift
- fichier
apache-jmeter-5.2.tgz
Les tests consisteront en une simple Demande HTTP sur ya.ru dans un seul flux.
Création d'un projet dans OpenShift
Commençons par créer un nouvel environnement. Créons perftest l'environnement avec la commande :
$ oc new-project perftest --display-name="Tests de performance" --description="Tests de performance - JMeter"Cela nous redirigera automatiquement vers le nouvel environnement créé. perftest, vérifions que c'est le cas :
$ oc project
Using project "perftest" on server "https://127.0.0.1:8443".Création du Stockage
Les rapports de tests seront stockĂ©s dans un emplacement commun pour le serveur Web et jmeter-meter'a â /jmeter/reports.
Il vaut mieux créer le stockage maintenant, car il sera lié aux POD jmeter-web et jmeter-master.
Vous trouverez des informations plus détaillées sur le stockage dans la documentation officielle .
Créons des fichiers yaml pour PV et 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
EOFCréons PV et PVC dans l'environnement OpenShift :
$ oc create -f pv.yaml -n perftest
$ oc create -f pvc.yaml -n perftestVérifions le statut pour 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 8mVoici Ă quoi cela ressemblera dans l'interface graphique :

Création de l'image de base JMeter
Passons à la création de ImageStream et BuildConfig.
Toutes les informations nĂ©cessaires se trouvent dans la documentation â .
La stratégie de construction des images utilise Docker une source locale.
Créons une image de base jmeter-base, qui servira de base pour 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
EOFCréons des objets IS et BC:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftestConstruisons maintenant l'image de base jmeter-base:
$ oc start-build jmeter-base -n perftest --from-dir=. --followJMeter WEB
jmeter-web C'est un serveur Apache. Sa tùche est de fournir un répertoire avec les résultats des tests pour consultation.
Préparé Dockerfile et le fichier de configuration httpd.conf. Pour la directive DocumentRoot la valeur est définie à /jmeter/reports, c'est-à -dire le répertoire dans lequel les résultats des tests sont sauvegardés.
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
EOFCréons ImageStream et BuildConfig objets:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftestNous construisons l'image Ă partir de 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
EOFCréons des objets Service et DeploymentConfig:
$ oc create -f sc.yaml -n perftest
$ oc create -f dc.yaml -n perftestJmeter-master
Passons à la déploiement du serveur Apache.
Ceci est le Dockerfile jmeter-masterâa, basĂ© sur jmeter-base, qui exĂ©cutera les tests et enregistrera les rĂ©sultats dans le stockage.
Dockerfile
Dockerfile pour jmeter-master, basé sur 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 c'est le script qui exécute JMeter et enregistre les résultats dans le répertoire files.
Ă chaque exĂ©cution, le script supprime les tests prĂ©cĂ©dents, donc vous ne pouvez travailler qu'avec les derniĂšres donnĂ©es. Mais ce n'est pas un problĂšme, car il peut ĂȘtre modifiĂ© selon vos besoins.
#!/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
EOFCréons IS et BC objets:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftestCollecte jmeter-master image:
$ oc start-build jmeter-master -n perftest --from-dir=. --followJob
Jobâs sont utilisĂ©s pour OpenShiftâe pour exĂ©cuter un ou plusieurs PODâs et garantir leur succĂšs aprĂšs l'exĂ©cution de la commande/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
EOFCréons l'objet Job:
$ oc create -f job.yaml -n perftestVérifions l'état du job :
$ oc get jobs -n perftest
NAME DESIRED SUCCESSFUL AGE
jmeter-master 1 1 5mPour supprimer Job nous utiliserons la commande :
$ oc delete jobs/jmeter-master -n perftest --ignore-not-found=trueJenkins Pipeline
Maintenant, passons à l'automatisation. Révisons les étapes :
git cloneoc whoami -toc start-build ...oc delete jobs/jmeter-masteroc create -f job.yaml -n perftest
Voici le pipeline oĂč nous effectuons le clonage du dĂ©pĂŽt, la suppression et la crĂ©ation d'OpenShift Jobâs.
#!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>DÉBUT - Tests de performance</strong><br /><br />Projet : Nom du projet<br />Environnement : PerfTest<br />Numéro de build : ${env.BUILD_NUMBER}<br />URL de build : ${env.BUILD_URL}"
}
}
}
étape('Vérification Git') {
étapes {
...
}
}
étape('Tests de performance') {
étapes {
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 {
échec {
echo "ÉCHEC - Tests de performance"
mail(to: 'username@srv.net', from: "jenkins@srv.net", subject: "ÉCHEC - Tests de performance",mimeType: "text/html", body: "<strong>ÉCHEC - Tests de performance</strong><br /><br />Projet : Nom du projet<br />Environnement : PerfTest<br />Numéro de build : ${env.BUILD_NUMBER}<br />URL de build : ${env.BUILD_URL}"
succès {
echo "RÉUSSITE - Tests de performance"
mail(to: 'username@srv.net', from: "jenkins@srv.net", subject: "RÉUSSITE - Tests de performance",mimeType: "text/html", body: "<strong>RÉUSSITE - Tests de performance</strong><br /><br />Projet : Nom du projet<br />Environnement : PerfTest<br />Numéro de build : ${env.BUILD_NUMBER}<br />URL de build : ${env.BUILD_URL}"
}
}
}
}AprÚs que le Pipeline ait fonctionné, nous recevrons une notification par e-mail 'username@srv.net à partir de jenkins@srv.net.
En suivant le lien nous verrons le rĂ©pertoire files, oĂč sont stockĂ©s les rapports de tests :

Contenu du fichier 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,259Conclusion
Cet article présente l'une des façons d'exécuter des tests JMeter dans un environnement OpenShift. Nous avons effectué toutes les étapes manuellement, puis créé un pipeline Jenkins pour automatiser le processus de lancement des tests.
Sources et documentation
- openshift
Source : habr.com
