Jenkins Pipeline ашиглан OpenShift дээр JMeter тестийг ажиллуулж байна

хүн бүрт Сайн байна уу!

Энэ нийтлэлд би Женкинсийг автоматжуулалт болгон ашиглан OpenShift дээр JMeter гүйцэтгэлийн тестийг ажиллуулах аргуудын нэгийг хуваалцахыг хүсч байна. Эхлээд бид шаардлагатай бүх алхмуудыг хийх болно (үүсгэх ImageStreams, BuildConfig, Job гэх мэт) гарын авлагын горимд. Үүний дараа Jenkins Pipeline гэж бичье.

Эхлэх цэг болгон бид дараах зүйлсийг хийх ёстой:

  1. OpenShift (v3.11) кластер ажиллаж байна
  2. OpenShift дээр ажиллахаар тохируулсан итгэмжлэл бүхий Женкинс сервер
  3. файл 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.

Storaj-уудыг одоо үүсгэх нь дээр, учир нь 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

Энэ нь GUI дээр хэрхэн харагдахыг энд харуулав.

Jenkins Pipeline ашиглан OpenShift дээр JMeter тестийг ажиллуулж байна

JMeter-ийн үндсэн зураг үүсгэх

Үргэлжлүүлэн бүтээх ажилдаа орцгооё ImageStream и BuildConfig.

Та баримт бичигт шаардлагатай бүх мэдээллийг олж авах боломжтой - Барилга ба зургийн урсгал.

Зураг бүтээх стратеги нь Docker орон нутгийн эх сурвалжаас.

Үндсэн зургийг бүтээцгээе jmeter-base, энэ нь үндэс суурь болно jmeter-master.

Докер файл

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 Энэ бол Apache вэб сервер юм. Түүний даалгавар бол үзэхийн тулд туршилтын үр дүнг агуулсан лавлахыг өгөх явдал юм.

Бэлтгэсэн Dockerfile болон тохиргооны файл httpd.conf. Удирдамжийн хувьд DocumentRoot утгыг тогтоосон /jmeter/reports, өөрөөр хэлбэл туршилтын үр дүнг хадгалах лавлах.

Докер файл

$ 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

Жметр-мастер

Apache вэб серверийг байрлуулж эхэлцгээе.

Энэ бол Dockerfile юм jmeter-master'a, үндэслэсэн jmeter-base, энэ нь туршилтыг явуулж, үр дүнг хадгалахад хадгалах болно.

Докер файл

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'e нэг буюу хэд хэдэн ажиллуулахын тулд 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

Женкинс дамжуулах хоолой

Одоо автоматжуулалт. Дахин алхам алхмуудыг авч үзье:

  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

Доорх нь репозиторыг хувилах, устгах, OpenShift үүсгэх үйл явц юм Job-ийн.

#!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].

Холбоос дээр дарснаар http://jmeter-web.127.0.0.1.nip.io/ бид лавлахыг харах болно files, туршилтын тайланг хадгалдаг:

Jenkins Pipeline ашиглан OpenShift дээр JMeter тестийг ажиллуулж байна

Файлын агуулга 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

дүгнэлт

Энэ нийтлэл нь OpenShift орчинд JMeter тестийг ажиллуулах сонголтуудын нэгийг харуулсан. Бид бүх алхмуудыг гараар хийж дуусгасны дараа туршилтын ажиллагааг автоматжуулах зорилгоор Jenkins Pipeline-ийг бүтээсэн.

Эх сурвалж, баримт бичиг

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх