Салом хама!
Дар ин мақола ман мехоҳам яке аз роҳҳои иҷро кардани санҷишҳои JMeter-ро дар OpenShift бо истифода аз Ҷенкинс ҳамчун автоматизатсия мубодила кунам. Аввалан мо тамоми қадамҳои заруриро иҷро мекунем (сохтани ImageStreams
, BuildConfig
, Job
ва ғайра) дар ҳолати дастӣ. Пас аз он, биёед Jenkins Pipeline нависед.
Ҳамчун нуқтаи ибтидоӣ мо бояд:
- кластери OpenShift (v3.11) кор мекунад
- Сервери Ҷенкинс бо маълумоти конфигуратсияшуда барои кор дар OpenShift
- файл
apache-jmeter-5.2.tgz
Ҳамчун санҷишҳо он оддӣ хоҳад буд HTTP Request
ба ya.ru
дар як ҷараён.
Эҷоди лоиҳа дар OpenShift
Биёед аз эҷоди муҳити нав оғоз кунем. биёед эҷод кунем perftest
дар иҳотаи даста:
$ oc new-project perftest --display-name="Performance Tests" --description="Performance Tests - JMeter"
Мо ба таври худкор ба муҳити навтаъсис интиқол дода мешавем perftest
, биёед тафтиш кунем, ки ин чунин аст:
$ oc project
Using project "perftest" on server "https://127.0.0.1:8443".
Эҷоди анбор
Ҳисоботи санҷишӣ дар якҷоягӣ бо сервери веб нигоҳ дошта мешаванд ва jmeter-meter
'ҷой - /jmeter/reports
.
Беҳтар аст, ки ҳоло Storajs эҷод кунед, зеро POD-ҳо ба онҳо пайваст карда мешаванд jmeter-web
и jmeter-master
.
Шумо маълумоти муфассалро дар бораи нигоҳдорӣ дар ҳуҷҷатҳои расмӣ хоҳед ёфт
Биёед файлҳои yaml барои 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
биёед эҷод кунем PV
и PVC
дар иҳотаи OpenShift:
$ oc create -f pv.yaml -n perftest
$ oc create -f pvc.yaml -n perftest
Тафтиши ҳолати 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
Ин аст он чизе ки дар GUI хоҳад буд:
Эҷоди тасвири пойгоҳи JMeter
Биёед ба эҷодкорӣ гузарем ImageStream
и BuildConfig
.
Шумо метавонед ҳама маълумоти заруриро дар ҳуҷҷатҳо пайдо кунед -
Стратегияи сохтани тасвир аст Docker
аз як манбаи маҳаллӣ.
Биёед тасвири асосиро эҷод кунем jmeter-base
, ки барои он асос хохад шуд jmeter-master
.
файли докер
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
аст.ямл
$ tee is.yaml<<EOF
apiVersion: v1
kind: ImageStream
metadata:
labels:
build: jmeter-base
name: jmeter-base
EOF
бк.ямл
$ 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
Биёед объектҳоро эҷод кунем IS
и BC
:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Акнун биёед тасвири асосиро ҷамъ кунем jmeter-base
:
$ oc start-build jmeter-base -n perftest --from-dir=. --follow
JMeter WEB
jmeter-web
Ин веб-сервери Apache аст. Вазифаи он пешниҳод кардани феҳрист бо натиҷаҳои санҷиш барои дидан аст.
Тайёр карда шудааст Dockerfile
ва файли конфигуратсия httpd.conf
. Барои дастур DocumentRoot
маҷмӯи арзиш /jmeter/reports
, яъне. директорияе, ки дар он натиҷаҳои санҷиш захира карда мешаванд.
файли докер
$ 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
аст.ямл
$ tee is.yaml<<EOF
apiVersion: v1
kind: ImageStream
metadata:
generation: 1
labels:
build: jmeter-web
name: jmeter-web
EOF
бк.ямл
$ 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
биёед эҷод кунем ImageStream
и BuildConfig
объектҳо:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Ҷамъоварии тасвир аз 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
Биёед объектҳоро эҷод кунем Service
и DeploymentConfig
:
$ oc create -f sc.yaml -n perftest
$ oc create -f dc.yaml -n perftest
Ҷметр - устод
Биёед ба ҷойгиркунии веб-сервери Apache оғоз кунем.
Ин файли Docker аст jmeter-master
'а, дар асоси jmeter-base
, ки санҷишҳоро иҷро мекунад ва натиҷаҳоро дар нигаҳдорӣ захира мекунад.
файли докер
Dockerfile
барои jmeter-master
, бар асоси 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
ин скриптест, ки JMeter-ро иҷро мекунад ва натиҷаҳоро дар директория захира мекунад files
.
Ҳар дафъае, ки скрипт оғоз мешавад, он санҷишҳои қаблиро нест мекунад, бинобар ин шумо метавонед танҳо бо маълумоти охирин кор кунед. Аммо ин мушкиле нест, зеро шумо метавонед онро мувофиқи ниёзҳои худ иваз кунед.
#!/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
аст.ямл
$ tee is.yaml<<EOF
apiVersion: image.openshift.io/v1
kind: ImageStream
metadata:
generation: 1
labels:
build: jmeter-master
name: jmeter-master
EOF
бк.ямл
$ 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
биёед эҷод кунем IS
и BC
объектҳо:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Мо ҷамъ jmeter-master
тасвир:
$ oc start-build jmeter-master -n perftest --from-dir=. --follow
кор
Job
-ҳо истифода мешаванд OpenShift
'е, то ки як ё якчанд кор кунад POD
-ро кафолат диҳед ва пас аз иҷрои фармон/скрипт ба анҷом расидани бомуваффақияти онҳоро кафолат диҳед.
$ 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
Объект эҷод кунед Job
:
$ oc create -f job.yaml -n perftest
Биёед вазъияти корро тафтиш кунем:
$ oc get jobs -n perftest
NAME DESIRED SUCCESSFUL AGE
jmeter-master 1 1 5m
Барои нест кардан Job
биёед фармонро истифода барем:
$ oc delete jobs/jmeter-master -n perftest --ignore-not-found=true
Ҷенкинс қубур
Акнун автоматика. Биёед бори дигар қадамҳоро аз назар гузаронем:
git clone
oc whoami -t
oc start-build ...
oc delete jobs/jmeter-master
oc create -f job.yaml -n perftest
Дар зер қубуре мавҷуд аст, ки дар он клонкунии анбор, несткунӣ ва эҷоди OpenShift иҷро карда мешавад 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}"
}
}
}
}
Пас аз ба итмом расонидани Pipeline, мо тавассути почтаи электронӣ огоҳинома мегирем '[email protected]
аз он [email protected]
.
Бо пахш кардани пайванд files
, ки гузоришҳои санҷиширо нигоҳ медорад:
Мундариҷаи файл 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
хулоса
Ин мақола яке аз имконоти иҷро кардани санҷишҳои JMeterро дар муҳити OpenShift нишон дод. Мо ҳама қадамҳоро дастӣ анҷом додем ва пас аз он мо Ҷенкинс қубурро барои автоматикунонии раванди санҷишҳо таъсис додем.
Сарчашмаҳо ва ҳуҷҷатҳо
JMeter - Санҷиши сарбории тақсимшуда бо истифода аз Docker Иҷрои санҷишҳои JMeter дар OpenShift аз лӯлаи Ҷенкинс кушодНигаҳдории доимӣ Сохтаҳо ва ҷараёни тасвирҳо
Манбаъ: will.com