Hello sa tanan!
Niini nga artikulo gusto nakong ipaambit ang usa sa mga paagi sa pagpadagan sa JMeter performance tests sa OpenShift gamit ang Jenkins isip automation. Una atong buhaton ang tanan nga gikinahanglan nga mga lakang (pagmugna ImageStreams
, BuildConfig
, Job
ug uban pa) sa manual mode. Human niana, atong isulat ang Jenkins Pipeline.
Ingon usa ka punto sa pagsugod kinahanglan naton:
- nagpadagan sa OpenShift (v3.11) cluster
- Jenkins server nga adunay gi-configure nga mga kredensyal aron magtrabaho sa OpenShift
- file
apache-jmeter-5.2.tgz
Ingon sa mga pagsulay kini mahimong yano HTTP Request
sa ya.ru
sa usa ka sapa.
Paghimo og proyekto sa OpenShift
Magsugod ta pinaagi sa paghimo og bag-ong palibot. Magbuhat ta perftest
gilibutan sa usa ka team:
$ oc new-project perftest --display-name="Performance Tests" --description="Performance Tests - JMeter"
Awtomatiko kami nga ibalhin sa bag-ong gibuhat nga palibot perftest
, atong susihon nga mao kini:
$ oc project
Using project "perftest" on server "https://127.0.0.1:8443".
Paglalang sa Pagtipig
Ang mga taho sa pagsulay tipigan nga parehas sa web server ug jmeter-meter
'usa ka dapit- /jmeter/reports
.
Mas maayo nga maghimo og Storajs karon, tungod kay ang mga POD ihigot kanila jmeter-web
ΠΈ jmeter-master
.
Makita nimo ang mas detalyado nga kasayuran sa pagtipig sa opisyal nga dokumentasyon
Magbuhat ta yaml files para sa 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
Magbuhat ta PV
ΠΈ PVC
gilibutan sa OpenShift:
$ oc create -f pv.yaml -n perftest
$ oc create -f pvc.yaml -n perftest
Pagsusi sa kahimtang alang sa 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
Ania kung unsa ang hitsura niini sa GUI:
Paghimo og JMeter Base Image
Mopadayon kita sa paghimo ImageStream
ΠΈ BuildConfig
.
Makita nimo ang tanang gikinahanglan nga impormasyon sa dokumentasyon -
Ang estratehiya sa paghimo sa imahe mao Docker
gikan sa lokal nga tinubdan.
Maghimo kita og base nga imahe jmeter-base
, nga mahimong basehan sa 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
is.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
Magbuhat ta og mga butang IS
ΠΈ BC
:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Karon atong tipunon ang base nga imahe jmeter-base
:
$ oc start-build jmeter-base -n perftest --from-dir=. --follow
JMeter WEB
jmeter-web
Kini usa ka Apache web server. Ang tahas niini mao ang paghatag usa ka direktoryo nga adunay mga resulta sa pagsulay alang sa pagtan-aw.
Giandam Dockerfile
ug configuration file httpd.conf
. Alang sa direktiba DocumentRoot
gitakda nga kantidad /jmeter/reports
, i.e. ang direktoryo diin ang mga resulta sa pagsulay gitipigan.
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
is.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
Magbuhat ta ImageStream
ΠΈ BuildConfig
mga butang:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Pagkolekta og imahe gikan sa 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
Magbuhat ta og mga butang Service
ΠΈ DeploymentConfig
:
$ oc create -f sc.yaml -n perftest
$ oc create -f dc.yaml -n perftest
Jmeter-master
Atong sugdan ang pagdeploy sa Apache web server.
Kini ang Dockerfile jmeter-master
'a, base sa jmeter-base
, nga magpadagan sa mga pagsulay ug i-save ang mga resulta sa pagtipig.
Dockerfile
Dockerfile
alang sa jmeter-master
, base sa 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
kini usa ka script nga nagpadagan sa JMeter ug nagtipig sa mga resulta sa usa ka direktoryo files
.
Matag higayon nga gilansad ang script, tangtangon niini ang nangaging mga pagsulay, aron mahimo ra nimo magamit ang labing bag-ong datos. Apan dili kini problema, tungod kay mahimo nimo kini usbon aron mohaum sa imong mga panginahanglan.
#!/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
is.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
Magbuhat ta IS
ΠΈ BC
mga butang:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Nangolekta kami jmeter-master
hulagway:
$ oc start-build jmeter-master -n perftest --from-dir=. --follow
Job
Job
's gigamit sa OpenShift
'e aron makadagan ang usa o daghan pa POD
's ug garantiya ang ilang malampuson nga pagkompleto human sa pagpatuman sa command/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
EOF
Paghimo og butang Job
:
$ oc create -f job.yaml -n perftest
Atong susihon ang kahimtang sa trabaho:
$ oc get jobs -n perftest
NAME DESIRED SUCCESSFUL AGE
jmeter-master 1 1 5m
Aron mapapas Job
atong gamiton ang sugo:
$ oc delete jobs/jmeter-master -n perftest --ignore-not-found=true
Jenkins Pipeline
Karon automation. Atong balikon ang mga lakang pag-usab:
git clone
oc whoami -t
oc start-build ...
oc delete jobs/jmeter-master
oc create -f job.yaml -n perftest
Sa ubos usa ka pipeline diin gihimo ang pag-clone sa repository, pagtangtang ug paghimo sa OpenShift Job
ni.
#!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}"
}
}
}
}
Human makompleto sa Pipeline ang operasyon niini, makadawat kami og pahibalo pinaagi sa email '[email protected]
gikan sa [email protected]
.
Pinaagi sa pag-klik sa link files
, nga nagtipig sa mga taho sa pagsulay:
Mga sulod sa file 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
konklusyon
Gipakita sa kini nga artikulo ang usa sa mga kapilian sa pagpadagan sa mga pagsulay sa JMeter sa palibot sa OpenShift. Gikompleto namo ang tanan nga mga lakang sa mano-mano, pagkahuman among gibuhat ang Jenkins Pipeline aron awtomatiko ang proseso sa pagpadagan sa mga pagsulay.
Mga tinubdan ug dokumentasyon
JMeter - Giapod-apod nga Pagsulay sa Pag-load gamit ang Docker Pagpadagan sa JMeter Tests sa OpenShift gikan sa usa ka Jenkins Pipeline openhiftNagpadayon nga pagtipig Mga Pagtukod ug Mga Agos sa Imahe
Source: www.habr.com