د جینکنز پایپ لاین په کارولو سره په OpenShift کې د JMeter ازموینې چلول

سلام هر!

پدې مقاله کې زه غواړم د جینکنز په کارولو سره په OpenShift کې د JMeter فعالیت ازموینې چلولو یوه لاره شریکه کړم. لومړی به موږ ټول اړین ګامونه ترسره کړو (جوړول ImageStreams, BuildConfig, Job وغيره) په لاسي حالت کې. له هغې وروسته، راځئ چې جینکنز پایپ لاین ولیکئ.

د پیل ټکي په توګه موږ باید ولرو:

  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.

دا غوره ده چې اوس سټوراجونه جوړ کړئ، ځکه چې PODs به ورسره تړلي وي 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 کې ښکاري:

د جینکنز پایپ لاین په کارولو سره په 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 ویب

jmeter-web دا د اپاچي ویب سرور دی. د دې دنده د لیدو لپاره د ازموینې پایلو سره لارښود چمتو کول دي.

چمتو شوی Dockerfile او د ترتیب فایل httpd.conf. د لارښوونې لپاره DocumentRoot ارزښت ټاکل /jmeter/reports, i.e. هغه لارښود چې د ازموینې پایلې پکې خوندي کیږي.

ډکولر

$ 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

جیمیټر - ماسټر

راځئ چې د اپاچي ویب سرور پلي کول پیل کړو.

دا د ډاکر فایل دی 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د یو یا ډیرو چلولو لپاره 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}"
            }
        }

    }
}

وروسته له دې چې پایپ لاین خپل عملیات بشپړ کړي، موږ به د بریښنالیک له لارې خبرتیا ترلاسه کړو '[email protected] от [email protected].

د لینک په کلیک کولو سره http://jmeter-web.127.0.0.1.nip.io/ موږ به لارښود وګورو files، کوم چې د ازموینې راپورونه ذخیره کوي:

د جینکنز پایپ لاین په کارولو سره په 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 ازموینې چلولو لپاره یو له اختیارونو څخه ښودلی. موږ ټول مرحلې په لاسي ډول بشپړې کړې، وروسته له هغه چې موږ د چلولو ازموینو پروسې اتومات کولو لپاره جینکنز پایپ لاین رامینځته کړ.

سرچینې او اسناد

سرچینه: www.habr.com

Add a comment