Ndewo onye ọ bụla!
N'isiokwu a, achọrọ m ịkọrọ otu n'ime ụzọ isi mee ule arụmọrụ JMeter na OpenShift iji Jenkins dị ka akpaaka. Nke mbụ, anyị ga-eme usoro niile dị mkpa (ịmepụta ImageStreams
, BuildConfig
, Job
wdg) na ụkpụrụ ntuziaka. Mgbe nke ahụ gasịrị, ka anyị dee Jenkins Pipeline.
Dịka mmalite anyị kwesịrị inwe:
- na-agba OpenShift (v3.11) ụyọkọ
- Ihe nkesa Jenkins nwere nzere ahaziri ka ọ rụọ ọrụ na OpenShift
- faịlụ
apache-jmeter-5.2.tgz
Dị ka ule ọ ga-adị mfe HTTP Request
on ya.ru
n'otu iyi.
Ịmepụta ọrụ na OpenShift
Ka anyị malite site na ịmepụta gburugburu ebe obibi ọhụrụ. Ka anyị mepụta perftest
otu ndị gbara ya gburugburu:
$ oc new-project perftest --display-name="Performance Tests" --description="Performance Tests - JMeter"
A ga-ebufe anyị na-akpaghị aka na gburugburu ebe emepụtara ọhụrụ perftest
, ka anyị lelee na nke a bụ otu a:
$ oc project
Using project "perftest" on server "https://127.0.0.1:8443".
Ịmepụta Nchekwa
A ga-echekwa akụkọ nnwale na sava weebụ yana jmeter-meter
'otu ebe - /jmeter/reports
.
Ọ ka mma ịmepụta Storajs ugbu a, n'ihi na a ga-ejikọta POD na ha jmeter-web
и jmeter-master
.
Ị ga-achọta ozi ndị ọzọ gbasara nchekwa na akwụkwọ gọọmentị
Ka anyị mepụta yaml faịlụ maka 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
Ka anyị mepụta PV
и PVC
OpenShift gbara ya gburugburu:
$ oc create -f pv.yaml -n perftest
$ oc create -f pvc.yaml -n perftest
Na-enyocha ọkwa maka 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
Nke a bụ ihe ọ ga-adị na GUI:
Ịmepụta onyonyo ntọala JMeter
Ka anyị gaa n'ihu na-eke ImageStream
и BuildConfig
.
Ị nwere ike ịchọta ozi niile dị mkpa na akwụkwọ -
Atụmatụ ewu ihe oyiyi bụ Docker
site na isi obodo.
Ka anyị mepụta ihe oyiyi ntọala jmeter-base
, nke ga-abụ ihe ndabere maka 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
bu.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
Ka anyị mepụta ihe IS
и BC
:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Ugbu a, ka anyị kpọkọta ihe oyiyi isi jmeter-base
:
$ oc start-build jmeter-base -n perftest --from-dir=. --follow
JMeter WEB
jmeter-web
Nke a bụ sava weebụ Apache. Ọrụ ya bụ ịnye ndekọ nwere nsonaazụ ule maka nlele.
Kwadoro Dockerfile
na nhazi faịlụ httpd.conf
. Maka ntuziaka DocumentRoot
setịpụrụ uru /jmeter/reports
, i.e. akwụkwọ ndekọ aha nke echekwara nsonaazụ ule na ya.
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
bu.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
Ka anyị mepụta ImageStream
и BuildConfig
ihe:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Na-anakọta onyonyo site na 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
Ka anyị mepụta ihe Service
и DeploymentConfig
:
$ oc create -f sc.yaml -n perftest
$ oc create -f dc.yaml -n perftest
Jmeter-nna ukwu
Ka anyị malite ibunye sava weebụ Apache.
Nke a bụ Dockerfile jmeter-master
'a, dabere na jmeter-base
, nke ga-eme ule ma chekwaa nsonaazụ ya na nchekwa.
dockerfile
Dockerfile
n'ihi na jmeter-master
, dabere na 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"]
ọsọ.sh
run.sh
nke a bụ edemede na-agba JMeter ma chekwaa nsonaazụ ya na ndekọ files
.
Oge ọ bụla ewepụtara edemede ahụ, ọ na-ehichapụ ule ndị gara aga, yabụ naanị ị nwere ike iji data kachasị ọhụrụ rụọ ọrụ. Mana nke a abụghị nsogbu, n'ihi na ị nwere ike ịgbanwe ya ka ọ dabara na mkpa gị.
#!/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
bu.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
Ka anyị mepụta IS
и BC
ihe:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Anyị na-anakọta jmeter-master
onyonyo:
$ oc start-build jmeter-master -n perftest --from-dir=. --follow
Job
Job
A na-eji s OpenShift
'e iji gbaa otu ma ọ bụ karịa POD
's na ekwe nkwa na ha ga-emecha nke ọma mgbe emechara iwu/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
Mepụta ihe Job
:
$ oc create -f job.yaml -n perftest
Ka anyị lelee ọnọdụ ọrụ ahụ:
$ oc get jobs -n perftest
NAME DESIRED SUCCESSFUL AGE
jmeter-master 1 1 5m
Ka ihichapu Job
ka anyị jiri iwu ahụ:
$ oc delete jobs/jmeter-master -n perftest --ignore-not-found=true
Jenkins Pipeline
Ugbu a akpaaka. Ka anyị gagharịa usoro ndị a ọzọ:
git clone
oc whoami -t
oc start-build ...
oc delete jobs/jmeter-master
oc create -f job.yaml -n perftest
N'okpuru ebe a bụ ọkpọkọ ebe a na-eme cloning repository, ihichapụ na imepụta 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}"
}
}
}
}
Mgbe Pipeline rụchara ọrụ ya, anyị ga-enweta ọkwa site na email '[email protected]
si [email protected]
.
Site na ịpị njikọ ahụ files
, nke na-echekwa akụkọ nyocha:
Faịlụ ọdịnaya 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
nkwubi
Edemede a gosipụtara otu nhọrọ maka ịgba ọsọ ule JMeter na gburugburu OpenShift. Anyị ji aka mechaa usoro niile, mgbe nke ahụ gasịrị, anyị mepụtara Jenkins Pipeline iji megharịa usoro nke ịgba ọsọ ule.
Isi mmalite na akwụkwọ
JMeter – Nnwale ibu nke ekesara site na iji Docker Na-agba ọsọ ule JMeter na OpenShift site na pipeline Jenkins emepeNchekwa na-adịgide adịgide Na-ewu na iyi iyi
isi: www.habr.com