Hej alle sammen!
I denne artikel vil jeg dele en metode til at køre JMeter ydeevnetests i OpenShift ved hjælp af Jenkins som automatisering. Først vil vi udføre alle nødvendige handlinger (oprettelse og andet) manuelt. Derefter vil vi skrive en Jenkins Pipeline. ImageStreams, BuildConfig, Job og andet i manuel tilstand. Herefter skriver vi Jenkins Pipeline.
Som udgangspunkt skal vi have:
- et fungerende OpenShift (v3.11) cluster
- Jenkins-server med konfigurerede legitimationsoplysninger til at arbejde i OpenShift
- fil
apache-jmeter-5.2.tgz
Testene vil være en simpel HTTP-forespørgsel og få en fungerende kommando. ya.ru i én tråd.
Oprettelse af projekt i OpenShift
Lad os starte med at oprette et nyt miljø. Vi opretter perftest miljøet med følgende kommando:
$ oc new-project perftest --display-name="Performance Tests" --description="Performance Tests - JMeter"Vi bliver automatisk sendt til det nysoprettede miljø perftest, lad os tjekke det:
$ oc project
Using project "perftest" on server "https://127.0.0.1:8443".Oprettelse af Storage
Testsrapporter vil blive gemt i et fælles område for webserveren og jmeter-meter’s plads — /jmeter/reports.
Det er bedst at oprette storage nu, da de vil være knyttet til POD'erne jmeter-web og jmeter-master.
Du kan finde mere detaljeret information om storage i den officielle dokumentation .
Lad os oprette yaml-filer til PV og 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 opretter PV og PVC i OpenShift-miljøet:
$ oc create -f pv.yaml -n perftest
$ oc create -f pvc.yaml -n perftestTjekker 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 8mHer er, hvordan det vil se ud i GUI:

Oprettelse af grundlæggende JMeter billede
Lad os gå videre til oprettelse af ImageStream og BuildConfig.
Du kan finde alle nødvendige oplysninger i dokumentationen — .
Som bygge-strategi for billeder anvendes Docker fra en lokal kilde.
Lad os oprette det grundlæggende billede jmeter-base, som vil være grundlaget for 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
EOFLad os oprette objekter IS og BC:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftestLad os nu bygge basebilledet jmeter-base:
$ oc start-build jmeter-base -n perftest --from-dir=. --followJMeter WEB
jmeter-web det er Apache-webserveren. Dens opgave er at levere en mappe med testresultater til visning.
Forberedt Dockerfile og konfigurationsfilen httpd.conf. For direktivet DocumentRoot er værdien indstillet til /jmeter/reports, dvs. mappen, hvor testresultaterne gemmes.
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 opretter ImageStream og BuildConfig objekter:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftestVi bygger billedet fra 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
EOFLad os oprette objekter Service og DeploymentConfig:
$ oc create -f sc.yaml -n perftest
$ oc create -f dc.yaml -n perftestJmeter-master
Lad os arbejde med deploymenten af Apache-webserveren.
Dette er Dockerfile jmeter-master‘a, baseret på jmeter-base, som vil køre testene og gemme resultaterne i lageret.
Dockerfile
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 det er et script, der udfører opstart af JMeter og gemmer resultaterne i mappen files.
Ved hver kørsel sletter scriptet tidligere tests, så man kan kun arbejde med de nyeste data. Men det er ikke et problem, da det kan ændres til ens egne 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 opretter IS og BC objekter:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftestVi samler jmeter-master billede:
$ oc start-build jmeter-master -n perftest --from-dir=. --followJob
Job‘er bruges til Mandag den 1. juni 12:00-14:00‘e til at køre en eller flere POD‘er og sikre deres succesfulde afslutning efter udførelse af kommandoen/skriptet.
$ 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 opretter objektet Job:
$ oc create -f job.yaml -n perftestLad os tjekke jobs status:
$ oc get jobs -n perftest
NAME DESIRED SUCCESSFUL AGE
jmeter-master 1 1 5mFor at slette Job bruger vi kommandoen:
$ oc delete jobs/jmeter-master -n perftest --ignore-not-found=trueJenkins Pipeline
Nu til automatiseringen. Lad os gennemgå trinene igen:
git cloneoc whoami -toc start-build ...oc delete jobs/jmeter-masteroc create -f job.yaml -n perftest
Nedenfor er et pipeline, hvor kloning af repository, sletning og oprettelse af OpenShift Job‘er udføres.
#!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 - Performance Tests</strong><br /><br />Projekt: Navn på projekt<br />Miljø: PerfTest<br />Byg nummer: ${env.BUILD_NUMBER}<br />Byg 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 "MISLYKKET - Performance Tests"
mail(to: 'username@srv.net', from: "jenkins@srv.net", subject: "MISLYKKET - Performance Tests",mimeType: "text/html", body: "<strong>MISLYKKET - Performance Tests</strong><br /><br />Projekt: Navn på projekt<br />Miljø: PerfTest<br />Byg nummer: ${env.BUILD_NUMBER}<br />Byg URL: ${env.BUILD_URL}"
}
success {
echo "VILLE HENDE - Performance Tests"
mail(to: 'username@srv.net', from: "jenkins@srv.net", subject: "VILLE HENDE - Performance Tests",mimeType: "text/html", body: "<strong>VILLE HENDE - Performance Tests</strong><br /><br />Projekt: Navn på projekt<br />Miljø: PerfTest<br />Byg nummer: ${env.BUILD_NUMBER}<br />Byg URL: ${env.BUILD_URL}"
}
}
}
}Når pipelinen er afsluttet, får vi en meddelelse via e-mail 'username@srv.net fra jenkins@srv.net.
Ved at klikke på linket ser vi mappen files, hvor test rapporter gemmes:

Indholdet af 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,259Konklusion
I denne artikel blev en af metoderne til at køre JMeter tests i OpenShift miljøet demonstreret. Vi gennemførte alle trin manuelt, hvorefter vi oprettede en Jenkins Pipeline til at automatisere testkøringsprocessen.
Kilder og dokumentation
- openshift
Kilde: habr.com
