Tere kõigile!
Selles artiklis jagan ühte meetodit JMeteri jõudluse testide käivitamiseks OpenShiftis, kasutades Jenkinsit automatiseerimiseks. Esiteks teeme kõik vajalikud toimingud (loomine ImageStreams, BuildConfig, Töö ja muud) käsitsi. Pärast seda kirjutame Jenkins Pipeline'i.
Kasutuspunktina peaks meil olema:
- töötav OpenShift (v3.11) klaster
- Jenkins server, millel on seadistatud juurdepääsuandmed OpenShiftis töötamiseks
- fail
apache-jmeter-5.2.tgz
Testid on lihtsad HTTP Päring . Tundub, et ya.ru ühes voos.
Projekti loomine OpenShiftis
Alustame uue keskkonna loomisega. Loome perftest keskkonna käsuga:
$ oc new-project perftest --display-name="Jõudlustestid" --description="Jõudlustestid - JMeter"Kantakse automaatselt uude loodud keskkonda perftest, kontrollime, et see on nii:
$ oc project
Using project "perftest" on server "https://127.0.0.1:8443".Salvestuse loomine
Testide aruanded salvestatakse veebiserveri ja jmeter-meter'i kohta — /jmeter/reports.
Salvestuse loomine on parem teha nüüd, sest need on seotud POD'idega jmeter-web ja jmeter-master.
Rohkem teavet salvestuste 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 OpenShifti 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 see GUI's välja näeb:

JMeteri baaspildi loomine
Liigume baaspildi loomimise juurde ImageStream ja BuildConfig.
Kogu vajalik teave on dokumentatsioonis — .
Piltide kogumise strateegiana 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 objektid IS ja BC:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftestNüüd loome põhifoto jmeter-base:
$ oc start-build jmeter-base -n perftest --from-dir=. --followJMeter WEB
jmeter-web see on Apache server. Selle ülesanne on pakkuda testimistulemuste katalooge vaatamiseks.
Valmistatud Dockerfile ja konfiguratsioonifail httpd.conf. Direktiivi DocumentRoot väärtus on seatud /jmeter/reports, st kataloog, 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 perftestLoome pildi 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 objektid Teenused ja DeploymentConfig:
$ oc create -f sc.yaml -n perftest
$ oc create -f dc.yaml -n perftestJmeter-master
Hakkame tegelema Apache'i veebiserveri juurutamisega.
See on Dockerfile jmeter-master‘a, mis põhineb jmeter-base, mis käivitab testid ja salvestab tulemused salvestusse.
Dockerfile
Dockerfile jaoks jmeter-master, mis põhineb 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 on skript, mis käivitab JMeter'i ja salvestab tulemused katalooge. files.
Iga igal käivitamisel kustutab skript eelnevad testid, seega saab töötada ainult viimaste andmetega. Kuid see ei ole probleem, kuna seda saab kohandada vastavalt oma vajadustele.
#!/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öökasutatakse OpenShifte selleks, et käivitada üks või mitu PODja tagada nende edukas lõpetamine pärast käsu/skeemi täitmist.
$ 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 objekti 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. Korratakse samme:
git cloneoc whoami -toc start-build ...oc delete jobs/jmeter-masteroc create -f job.yaml -n perftest
Allpool on esitatud pipelines, kus toimub repos kloonimine, OpenShift'i kustutamine ja 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>START - Jõudluse Testid</strong><br /><br />Projekt: Projekti Nimi<br />Keskkond: PerfTest<br />Versiooni 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 "FAIL - Jõudluse Testid"
mail(to: 'username@srv.net', from: "jenkins@srv.net", subject: "FAIL - Jõudluse Testid",mimeType: "text\/html", body: "<strong>FAIL - Jõudluse Testid</strong><br /><br />Projekt: Projekti Nimi<br />Keskkond: PerfTest<br />Versiooni number: ${env.BUILD_NUMBER}<br />Build URL: ${env.BUILD_URL}"
}
success {
echo "ÕNNESTUNUD - Jõudluse Testid"
mail(to: 'username@srv.net', from: "jenkins@srv.net", subject: "ÕNNESTUNUD - Jõudluse Testid",mimeType: "text\/html", body: "<strong>ÕNNESTUNUD - Jõudluse Testid</strong><br /><br />Projekt: Projekti Nimi<br />Keskkond: PerfTest<br />Versiooni number: ${env.BUILD_NUMBER}<br />Build URL: ${env.BUILD_URL}"
}
}
}
}Pärast Pipeline'i töötamist saame e-kirja teavituse. 'username@srv.net alates jenkins@srv.net.
Minna lingile näeme katalooge files, kus on hoiustatud testide raportid:

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 demonstreeriti ühte võimalust käivitada JMeter teste OpenShift'i keskkonnas. Kõik sammud tehtud käsitsi, pärast mida loodi Jenkins Pipeline testide käivitamise protsessi automatiseerimiseks.
Allikad ja dokumentatsioon
- openshift
Allikas: habr.com
