Chạy thử nghiệm JMeter trong OpenShift bằng Jenkins Pipeline

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ó:

  1. đang chạy cụm OpenShift (v3.11)
  2. Máy chủ Jenkins có thông tin xác thực được định cấu hình để hoạt động trong OpenShift
  3. 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 Lưu trữ liên tụ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:

Chạy thử nghiệm JMeter trong OpenShift bằng Jenkins Pipeline

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 - Bản dựng và luồng hình ảnh.

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:

  1. git clone
  2. oc whoami -t
  3. oc start-build ...
  4. oc delete jobs/jmeter-master
  5. 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 http://jmeter-web.127.0.0.1.nip.io/ chúng ta sẽ xem thư mục files, nơi lưu trữ các báo cáo thử nghiệm:

Chạy thử nghiệm JMeter trong OpenShift bằng Jenkins Pipeline

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

Nguồn: www.habr.com

Thêm một lời nhận xét