Saluton ĉiuj!
En ĉi tiu artikolo mi volas dividi unu el la manieroj ruli JMeter-efikecajn testojn en OpenShift uzante Jenkins kiel aŭtomatigon. Unue ni faros ĉiujn necesajn paŝojn (kreante ImageStreams
, BuildConfig
, Job
ktp.) en mana reĝimo. Post tio, ni skribu Jenkins Pipeline.
Kiel deirpunkto ni devus havi:
- kurante OpenShift (v3.11) cluster
- Jenkins-servilo kun agorditaj akreditaĵoj por labori en OpenShift
- файл
apache-jmeter-5.2.tgz
Kiel provoj ĝi estos simpla HTTP Request
sur ya.ru
en unu rivereto.
Kreante projekton en OpenShift
Ni komencu kreante novan medion. Ni kreu perftest
ĉirkaŭita de teamo:
$ oc new-project perftest --display-name="Performance Tests" --description="Performance Tests - JMeter"
Ni estos aŭtomate translokigitaj al la nove kreita medio perftest
, ni kontrolu, ke ĉi tio estas tiel:
$ oc project
Using project "perftest" on server "https://127.0.0.1:8443".
Kreado de Stokado
Testraportoj estos konservitaj komune kun la retservilo kaj jmeter-meter
'loko - /jmeter/reports
.
Estas pli bone krei Storaj-ojn nun, ĉar POD-oj estos ligitaj al ili jmeter-web
и jmeter-master
.
Vi trovos pli detalajn informojn pri konservado en la oficiala dokumentaro
Ni kreu yaml dosierojn por 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
Ni kreu PV
и PVC
ĉirkaŭite de OpenShift:
$ oc create -f pv.yaml -n perftest
$ oc create -f pvc.yaml -n perftest
Kontrolante la staton por 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
Jen kiel ĝi aspektos en la GUI:
Kreante Bazan Bildon de JMeter
Ni transiru al kreado ImageStream
и BuildConfig
.
Vi povas trovi ĉiujn necesajn informojn en la dokumentado -
La bildo-konstrua strategio estas Docker
el loka fonto.
Ni kreu bazan bildon jmeter-base
, kiu estos la bazo por 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
estas.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
Ni kreu objektojn IS
и BC
:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Nun ni kunvenu la bazan bildon jmeter-base
:
$ oc start-build jmeter-base -n perftest --from-dir=. --follow
JMeter WEB
jmeter-web
Ĉi tio estas Apache-retservilo. Ĝia tasko estas provizi dosierujon kun testrezultoj por vidi.
Preta Dockerfile
kaj agorda dosiero httpd.conf
. Por direktivo DocumentRoot
valoro aro /jmeter/reports
, t.e. la dosierujo en kiu la testrezultoj estas konservitaj.
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
estas.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
Ni kreu ImageStream
и BuildConfig
objektoj:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Kolektante bildon de 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
Ni kreu objektojn Service
и DeploymentConfig
:
$ oc create -f sc.yaml -n perftest
$ oc create -f dc.yaml -n perftest
Jmeter-majstro
Ni komencu deploji la retservilon Apache.
Ĉi tio estas la Dockerfile jmeter-master
'a, bazita sur jmeter-base
, kiu funkcios testojn kaj konservos la rezultojn al stokado.
dockerfile
Dockerfile
por jmeter-master
, surbaze de 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"]
kuri.sh
run.sh
ĉi tio estas skripto, kiu rulas JMeter kaj konservas la rezultojn al dosierujo files
.
Ĉiufoje kiam la skripto estas lanĉita, ĝi forigas antaŭajn testojn, do vi povas labori nur kun la plej novaj datumoj. Sed ĉi tio ne estas problemo, ĉar vi povas ŝanĝi ĝin laŭ viaj bezonoj.
#!/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
estas.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
Ni kreu IS
и BC
objektoj:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Ni kolektas jmeter-master
bildo:
$ oc start-build jmeter-master -n perftest --from-dir=. --follow
job
Job
'oj estas uzataj en OpenShift
'e por kuri unu aŭ pli POD
's kaj garantiu ilian sukcesan kompletigon post ekzekuto de la komando/skripto.
$ 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
Krei objekton Job
:
$ oc create -f job.yaml -n perftest
Ni kontrolu la staton de la laboro:
$ oc get jobs -n perftest
NAME DESIRED SUCCESSFUL AGE
jmeter-master 1 1 5m
Forigi Job
ni uzu la komandon:
$ oc delete jobs/jmeter-master -n perftest --ignore-not-found=true
Jenkins Pipeline
Nun aŭtomatigo. Ni denove transiru la paŝojn:
git clone
oc whoami -t
oc start-build ...
oc delete jobs/jmeter-master
oc create -f job.yaml -n perftest
Malsupre estas dukto en kiu deponejo klonado, forigo kaj OpenShift kreado estas faritaj 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}"
}
}
}
}
Post kiam Pipeline kompletigis sian funkciadon, ni ricevos sciigon retpoŝte '[email protected]
el [email protected]
.
Alklakante la ligilon files
, kiu stokas testajn raportojn:
Dosiera enhavo 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
konkludo
Ĉi tiu artikolo montris unu el la ebloj por ruli JMeter-testojn en la OpenShift-medio. Ni kompletigis ĉiujn paŝojn permane, post kio ni kreis Jenkins Pipeline por aŭtomatigi la procezon de rulado de testoj.
Fontoj kaj dokumentado
JMeter - Disdonita Ŝarĝo-Testo uzante Docker Kurante JMeter-testojn en OpenShift de Jenkins Pipeline malfermprogramoPersista stokado Konstruaĵoj kaj Bildaj Rojoj
fonto: www.habr.com