Tere kõigile!
Selles artiklis jagan ühte võimalust, kuidas käivitada JMeteri jõudlusteste OpenShiftis Jenkinsit automatiseerimise jaoks kasutades. Esiteks teeme kõik vajalikud toimingud (loomine, ImageStreams, BuildConfig, Töö ja muud) käsitsi. Pärast seda kirjutame Jenkins Pipeline'i.
Lähtespunktina peaks meil olema:
- töötav OpenShift (v3.11) klaster
- Jenkins server, millel on õigesti seadistatud tunnused OpenShiftis töötamiseks
- fail
apache-jmeter-5.2.tgz
Testid koosnevad lihtsast HTTP Päringust järgnevaga ya.ru ühes voos.
Projekti loomine OpenShiftis
Alustame uue keskkonna loomisega. Loome perftest keskkonna käsuga:
$ oc new-project perftest --display-name="Performance Tests" --description="Performance Tests - JMeter"Oleme automaatselt suunatud äsja loodud keskkonda, perftestkontrollime, et see on nii:
$ oc project
Using project "perftest" on server "https://127.0.0.1:8443".Säilitusruumi loomine
Testide raportid salvestatakse veebiserverile ühisesse jmeter-meterkoht — /jmeter/reports.
Säilitusruumid tasuks loomine nüüd, kuna need seonduvad POD'idega jmeter-web ja jmeter-master.
Rohkem üksikasju säilitusruumide kohta leiate ametlikust dokumentatsioonist .
Loome yaml-failid PV ja 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
EOFLoome PV ja PVC OpenShift'i keskkonnas:
$ oc create -f pv.yaml -n perftest
$ oc create -f pvc.yaml -n perftestKontrollime staatust 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 8mNii näeb see välja GUI's:

JMeteri baaspildi loomine
Liigume edasi loomisega ImageStream ja BuildConfig.
Kogu vajalik teave on saadaval dokumentatsioonis — .
Pildistrateegiana kasutatakse Docker kohalikku allikat.
Loome baaspildi jmeter-base, mis on aluseks 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
EOFLoome objekte IS ja BC:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftestNüüd loome põhifaili jmeter-base:
$ oc start-build jmeter-base -n perftest --from-dir=. --followJMeter WEB
jmeter-web see on Apache veebiserver. Selle ülesanne on pakkuda testimistulemuste kausta vaatamiseks.
Valmistatud Dockerfile ja konfigureerimisfail httpd.conf. Direktiivile DocumentRoot on määratud väärtus /jmeter/reports, st kaust, kuhu salvestatakse testimistulemused.
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
EOFLoome ImageStream ja BuildConfig objektid:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftestKogume pilt 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
EOFLoome objekte Teenused ja DeploymentConfig:
$ oc create -f sc.yaml -n perftest
$ oc create -f dc.yaml -n perftestJmeter-master
Hakkame Apache veebiserverit seadistama.
See on Dockerfile jmeter-master‘a, mille põhjal jmeter-base, mis hakkab teste jooksutama ja salvestama tulemusi salvestusse.
Dockerfile
Dockerfile kuna jmeter-master, põhinev 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 see skript, mille läbiviimine JMeteri ja tulemuste salvestamine katalooge files.
Iga skripti käivitamisel kustutab ta varasema testimise, nii et tööd saab teha ainult viimaste andmetega. Kuid see ei ole probleem, kuna seda saab muuta oma vajaduste järgi.
#!/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
EOFLoome IS ja BC objektid:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftestKogume jmeter-master pilt:
$ oc start-build jmeter-master -n perftest --from-dir=. --followTöö
Töö‘d kasutatakse OpenShift‘e selleks, et käivitada ühte või mitut POD‘d ja tagada nende edukat lõpetamist käsu/stsenaariumi täitmise järel.
$ 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
EOFLoome objekt Töö:
$ oc create -f job.yaml -n perftestKontrollime töö staatust:
$ oc get jobs -n perftest
NAME DESIRED SUCCESSFUL AGE
jmeter-master 1 1 5mKustutamiseks Töö kasutame käsku:
$ oc delete jobs/jmeter-master -n perftest --ignore-not-found=trueJenkins Pipeline
Nüüd automatiseerimine. Korrame samme:
git cloneoc whoami -toc start-build ...oc delete jobs/jmeter-masteroc create -f job.yaml -n perftest
Allpool on esitatud pipeline, kus toimuvad repository kloonimine, eemaldamine ja OpenShift loomine Töö‘id.
#!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>ALUSTA - Tulemuskatsetused</strong><br /><br />Projekt: Projekti nimi<br />Keskkond: PerfTest<br />Ehitusnumber: ${env.BUILD_NUMBER}<br />Ehituslink: ${env.BUILD_URL}"
}
}
}
etapp('Git checkout') {
sammud {
...
}
}
etapp('Tulemuste testid') {
sammud {
skript {
sh '''
OC_CMD1="oc login -u=kasutajanimi -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 "EPALDUNUD - Tulemuskatsetused"
mail(to: 'username@srv.net', from: "jenkins@srv.net", subject: "EPALDUNUD - Tulemuskatsetused", mimeType: "text/html", body: "<strong>EPALDUNUD - Tulemuskatsetused</strong><br /><br />Projekt: Projekti nimi<br />Keskkond: PerfTest<br />Ehitusnumber: ${env.BUILD_NUMBER}<br />Ehituslink: ${env.BUILD_URL}"
}
success {
echo "ÕNNESTUNUD - Tulemuskatsetused"
mail(to: 'username@srv.net', from: "jenkins@srv.net", subject: "ÕNNESTUNUD - Tulemuskatsetused", mimeType: "text/html", body: "<strong>ÕNNESTUNUD - Tulemuskatsetused</strong><br /><br />Projekt: Projekti nimi<br />Keskkond: PerfTest<br />Ehitusnumber: ${env.BUILD_NUMBER}<br />Ehituslink: ${env.BUILD_URL}"
}
}
}
}Pärast seda, kui Pipeline töötab, saame teate e-posti aadressile 'username@srv.net alates jenkins@srv.net.
Järgides linki näeme katalooge files, kus hoitakse testide aruandeid:

Faili sisu 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,259Kokkuvõte
Selles artiklis demonstreerime üht võimalust käivitada JMeteri teste OpenShift'i keskkonnas. Tegime kõik sammud käsitsi ja seejärel loome Jenkins Pipeline'i testide käivitamise protsessi automatiseerimiseks.
Allikad ja dokumentatsioon
- openshift
Allikas: habr.com
