Xin chào tất cả mọi người!
Trong bài viết này tôi muốn chia sẻ một trong những cách để chạy thử nghiệm hiệu suất JMeter trong OpenShift bằng cách sử dụng Jenkins làm tự động hóa. Đầu tiên chúng ta sẽ thực hiện tất cả các bước cần thiết (tạo ImageStreams
, BuildConfig
, Job
v.v.) ở chế độ thủ công. Sau đó, hãy viết Jenkins Pipeline.
Là điểm khởi đầu chúng ta nên có:
- đang chạy cụm OpenShift (v3.11)
- Máy chủ Jenkins có thông tin xác thực được định cấu hình để hoạt động trong OpenShift
- tập tin
apache-jmeter-5.2.tgz
Khi kiểm tra nó sẽ đơn giản HTTP Request
trên ya.ru
trong một luồng.
Tạo dự án trong OpenShift
Hãy bắt đầu bằng cách tạo một môi trường mới. Hãy tạo ra perftest
được bao quanh bởi một đội:
$ oc new-project perftest --display-name="Performance Tests" --description="Performance Tests - JMeter"
Chúng ta sẽ được tự động chuyển sang môi trường mới tạo perftest
, hãy kiểm tra xem điều này có đúng không:
$ oc project
Using project "perftest" on server "https://127.0.0.1:8443".
Tạo lưu trữ
Báo cáo thử nghiệm sẽ được lưu trữ chung với máy chủ web và jmeter-meter
'một nơi - /jmeter/reports
.
Tốt hơn là nên tạo Storaj ngay bây giờ vì POD sẽ được liên kết với chúng jmeter-web
и jmeter-master
.
Bạn sẽ tìm thấy thông tin chi tiết hơn về việc lưu trữ trong tài liệu chính thức
Hãy tạo các tập tin yaml cho 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
Hãy tạo ra PV
и PVC
được bao quanh bởi OpenShift:
$ oc create -f pv.yaml -n perftest
$ oc create -f pvc.yaml -n perftest
Kiểm tra trạng thái cho 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
Đây là giao diện của nó trong GUI:
Tạo hình ảnh cơ sở JMeter
Hãy chuyển sang việc tạo ImageStream
и BuildConfig
.
Bạn có thể tìm thấy tất cả thông tin cần thiết trong tài liệu -
Chiến lược xây dựng hình ảnh là Docker
từ một nguồn địa phương.
Hãy tạo một hình ảnh cơ bản jmeter-base
, đây sẽ là cơ sở để 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
là.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
Hãy tạo các đối tượng IS
и BC
:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Bây giờ hãy lắp ráp hình ảnh cơ sở jmeter-base
:
$ oc start-build jmeter-base -n perftest --from-dir=. --follow
WEB JMeter
jmeter-web
Đây là một máy chủ web Apache. Nhiệm vụ của nó là cung cấp một thư mục chứa kết quả kiểm tra để xem.
Chuẩn bị Dockerfile
và tập tin cấu hình httpd.conf
. Để chỉ thị DocumentRoot
tập giá trị /jmeter/reports
, I E. thư mục lưu kết quả xét nghiệm.
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
là.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
Hãy tạo ra ImageStream
и BuildConfig
các đối tượng:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Thu thập hình ảnh từ 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
Hãy tạo các đối tượng Service
и DeploymentConfig
:
$ oc create -f sc.yaml -n perftest
$ oc create -f dc.yaml -n perftest
Jmeter-master
Hãy bắt đầu triển khai máy chủ web Apache.
Đây là tệp Docker jmeter-master
'a, dựa trên jmeter-base
, sẽ chạy thử nghiệm và lưu kết quả vào bộ nhớ.
Dockerfile
Dockerfile
cho jmeter-master
, dựa trê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"]
chạy.sh
run.sh
đây là tập lệnh chạy JMeter và lưu kết quả vào một thư mục files
.
Mỗi lần khởi chạy tập lệnh, tập lệnh sẽ xóa các bài kiểm tra trước đó, do đó bạn chỉ có thể làm việc với dữ liệu mới nhất. Nhưng đây không phải là vấn đề, vì bạn có thể thay đổi nó cho phù hợp với nhu cầu của mình.
#!/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
là.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
Hãy tạo ra IS
и BC
các đối tượng:
$ oc create -f is.yaml -n perftest
$ oc create -f bc.yaml -n perftest
Chúng tôi thu thập jmeter-master
hình ảnh:
$ oc start-build jmeter-master -n perftest --from-dir=. --follow
Việc làm
Job
được sử dụng trong OpenShift
'e để chạy một hoặc nhiều POD
's và đảm bảo chúng hoàn thành thành công sau khi thực thi lệnh/tập lệnh.
$ 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
Tạo một đối tượng Job
:
$ oc create -f job.yaml -n perftest
Hãy kiểm tra trạng thái của công việc:
$ oc get jobs -n perftest
NAME DESIRED SUCCESSFUL AGE
jmeter-master 1 1 5m
Xóa Job
hãy sử dụng lệnh:
$ oc delete jobs/jmeter-master -n perftest --ignore-not-found=true
Đường ống Jenkins
Bây giờ tự động hóa. Chúng ta hãy xem lại các bước:
git clone
oc whoami -t
oc start-build ...
oc delete jobs/jmeter-master
oc create -f job.yaml -n perftest
Dưới đây là một quy trình trong đó việc sao chép, xóa và tạo OpenShift kho lưu trữ được thực hiện 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}"
}
}
}
}
Sau khi Pipeline hoàn tất hoạt động chúng ta sẽ nhận được thông báo qua email '[email protected]
từ [email protected]
.
Bằng cách theo liên kết files
, nơi lưu trữ các báo cáo thử nghiệm:
Nội dung tập tin 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
Kết luận
Bài viết này đã trình bày một trong các tùy chọn để chạy thử nghiệm JMeter trong môi trường OpenShift. Chúng tôi đã hoàn thành tất cả các bước theo cách thủ công, sau đó chúng tôi tạo Đường dẫn Jenkins để tự động hóa quá trình chạy thử nghiệm.
Nguồn và tài liệu
JMeter – Kiểm tra tải phân tán bằng Docker Chạy thử nghiệm JMeter trong OpenShift từ Đường dẫn Jenkins mở cửaLưu trữ liên tục Bản dựng và luồng hình ảnh
Nguồn: www.habr.com