Hello!
Bu yazıda mən Jenkins-dən avtomatlaşdırma olaraq istifadə edərək OpenShift-də JMeter performans testlərini icra etməyin yollarından birini bölüşmək istəyirəm. Əvvəlcə bütün lazımi addımları atacağıq (yaratmaq ImageStreams
, BuildConfig
, Job
s.) əl rejimində. Bundan sonra Jenkins Pipeline yazaq.
Başlanğıc nöqtəsi olaraq bizdə olmalıdır:
- OpenShift (v3.11) klasterini işlədir
- OpenShift-də işləmək üçün konfiqurasiya edilmiş etimadnaməyə malik Jenkins serveri
- fayl
apache-jmeter-5.2.tgz
Testlər kimi sadə olacaq HTTP Request
haqqında ya.ru
bir axında.
OpenShift-də layihə yaratmaq
Yeni bir mühit yaratmaqla başlayaq. Yaradaq perftest
komandanın əhatəsində:
$ oc new-project perftest --display-name="Performance Tests" --description="Performance Tests - JMeter"
Biz avtomatik olaraq yeni yaradılmış mühitə köçürüləcəyik perftest
, bunun belə olduğunu yoxlayaq:
$ oc project
Using project "perftest" on server "https://127.0.0.1:8443".
Saxlamanın yaradılması
Test hesabatları veb server və ilə ümumi olaraq saxlanılacaq jmeter-meter
'yer - /jmeter/reports
.
İndi Storajlar yaratmaq daha yaxşıdır, çünki POD-lar onlara bağlanacaq jmeter-web
и jmeter-master
.
Saxlama haqqında daha ətraflı məlumatı rəsmi sənədlərdə tapa bilərsiniz
üçün yaml faylları yaradaq 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
Yaradaq PV
и PVC
OpenShift ilə əhatə olunmuşdur:
$ oc create -f pv.yaml -n perftest
$ oc create -f pvc.yaml -n perftest
üçün status yoxlanılır 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-də necə görünəcək:
JMeter Baza Şəkilinin yaradılması
Yaratmağa davam edək ImageStream
и BuildConfig
.
Bütün lazımi məlumatları sənədlərdə tapa bilərsiniz -
Təsvirin qurulması strategiyası budur Docker
yerli mənbədən.
Əsas şəkil yaradaq jmeter-base
üçün əsas olacaq jmeter-master
.
Docker faylı
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
Gəlin obyektlər yaradaq IS
и BC
:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
İndi əsas təsviri birləşdirək jmeter-base
:
$ oc start-build jmeter-base -n perftest --from-dir=. --follow
JMeter WEB
jmeter-web
Bu Apache veb serveridir. Onun vəzifəsi baxış üçün test nəticələri olan bir kataloq təqdim etməkdir.
Hazırlandı Dockerfile
və konfiqurasiya faylı httpd.conf
. Direktiv üçün DocumentRoot
dəyər dəsti /jmeter/reports
, yəni. test nəticələrinin saxlandığı qovluq.
Docker faylı
$ 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
Yaradaq ImageStream
и BuildConfig
obyektlər:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Şəklin toplanması 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
Gəlin obyektlər yaradaq Service
и DeploymentConfig
:
$ oc create -f sc.yaml -n perftest
$ oc create -f dc.yaml -n perftest
Jmeter-usta
Apache veb serverini yerləşdirməyə başlayaq.
Bu Docker faylıdır jmeter-master
'a, əsaslanır jmeter-base
, testləri həyata keçirəcək və nəticələri yaddaşda saxlayacaq.
Docker faylı
Dockerfile
uğrunda jmeter-master
, əsasən 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
bu, JMeter ilə işləyən və nəticələri qovluğa saxlayan skriptdir files
.
Skript hər dəfə işə salındıqda əvvəlki testləri silir, beləliklə siz yalnız ən son məlumatlarla işləyə bilərsiniz. Ancaq bu problem deyil, çünki ehtiyaclarınıza uyğun olaraq dəyişdirə bilərsiniz.
#!/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
Yaradaq IS
и BC
obyektlər:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Yığırıq jmeter-master
şəkil:
$ oc start-build jmeter-master -n perftest --from-dir=. --follow
iş
Job
-də istifadə olunur OpenShift
'e bir və ya daha çox işlətmək üçün POD
's və əmri/skripti yerinə yetirdikdən sonra onların müvəffəqiyyətlə tamamlanmasını təmin edin.
$ 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
Obyekt yaradın Job
:
$ oc create -f job.yaml -n perftest
İşin vəziyyətini yoxlayaq:
$ oc get jobs -n perftest
NAME DESIRED SUCCESSFUL AGE
jmeter-master 1 1 5m
Silmək üçün Job
əmrindən istifadə edək:
$ oc delete jobs/jmeter-master -n perftest --ignore-not-found=true
Jenkins Boru Kəməri
İndi avtomatlaşdırma. Yenidən addımları nəzərdən keçirək:
git clone
oc whoami -t
oc start-build ...
oc delete jobs/jmeter-master
oc create -f job.yaml -n perftest
Aşağıda repozitorun klonlaşdırılması, silinməsi və OpenShift yaradılmasının həyata keçirildiyi bir boru xətti var Job
nin.
#!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 istismarını başa vurduqdan sonra e-poçtla bildiriş alacağıq '[email protected]
etibarən [email protected]
.
Linkə klikləməklə files
, test hesabatlarını saxlayan:
Fayl məzmunu 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
Nəticə
Bu məqalə OpenShift mühitində JMeter testlərini yerinə yetirmək üçün seçimlərdən birini nümayiş etdirdi. Biz bütün addımları əl ilə tamamladıq, bundan sonra testlərin aparılması prosesini avtomatlaşdırmaq üçün Jenkins Pipeline yaratdıq.
Mənbələr və sənədlər
JMeter – Docker istifadə edərək paylanmış yük testi Jenkins Boru Kəmərindən OpenShift-də JMeter Testlərini yerinə yetirmək açıq keçidDavamlı saxlama Quraşdırma və Şəkil axını
Mənbə: www.habr.com