خوش آمدید!
در این مقاله میخواهم یکی از راههای اجرای تستهای عملکرد JMeter در OpenShift با استفاده از Jenkins به عنوان اتوماسیون را به اشتراک بگذارم. ابتدا تمام مراحل لازم را انجام خواهیم داد (ایجاد ImageStreams
, BuildConfig
, Job
و غیره) در حالت دستی. بعد از آن، بیایید خط لوله جنکینز را بنویسیم.
به عنوان نقطه شروع باید داشته باشیم:
- خوشه 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
.
اکنون بهتر است استوراج ها را ایجاد کنید، زیرا 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
در اینجا چه شکلی در رابط کاربری گرافیکی خواهد بود:
ایجاد یک تصویر پایه JMeter
بیایید به سمت ایجاد حرکت کنیم ImageStream
и BuildConfig
.
شما می توانید تمام اطلاعات لازم را در اسناد پیدا کنید -
استراتژی ساخت تصویر است Docker
از یک منبع محلی
بیایید یک تصویر پایه ایجاد کنیم jmeter-base
، که مبنای آن خواهد بود 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
بیایید اشیاء ایجاد کنیم 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
این یک وب سرور آپاچی است. وظیفه آن ارائه یک فهرست با نتایج آزمایش برای مشاهده است.
آماده شده Dockerfile
و فایل پیکربندی httpd.conf
. برای بخشنامه DocumentRoot
مجموعه ارزش /jmeter/reports
، یعنی دایرکتوری که نتایج تست در آن ذخیره می شود.
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
بیایید ایجاد کنیم 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
جی متر-استاد
بیایید شروع به استقرار وب سرور آپاچی کنیم.
این Dockerfile است jmeter-master
A، بر اساس jmeter-base
، که آزمایش ها را اجرا می کند و نتایج را در ذخیره سازی ذخیره می کند.
dockerfile
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
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
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
بیایید ایجاد کنیم 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 را نشان می دهد. ما تمام مراحل را به صورت دستی انجام دادیم و پس از آن خط لوله Jenkins را ایجاد کردیم تا فرآیند اجرای آزمایشها را خودکار کند.
منابع و مستندات
JMeter - تست بار توزیع شده با استفاده از Docker اجرای تست های JMeter در OpenShift از یک خط لوله جنکینز شیفت بازذخیره سازی مداوم ساخت و جریان تصویر
منبع: www.habr.com