рдЬреЗрдирдХрд┐рдиреНрд╕ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╡рд╛рдкрд░реВрди 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.

рдЖрддрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ, рдХрд╛рд░рдг 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 рдордзреНрдпреЗ рддреЗ рдХрд╕реЗ рджрд┐рд╕реЗрд▓ рддреЗ рдпреЗрдереЗ рдЖрд╣реЗ:

рдЬреЗрдирдХрд┐рдиреНрд╕ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╡рд╛рдкрд░реВрди 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

рдЖрд╣реЗ.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

рдЖрд╣реЗ.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 рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░ рддреИрдирд╛рдд рдХрд░рдгреЗ рд╕реБрд░реВ рдХрд░реВрдпрд╛.

рд╣реА рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдЖрд╣реЗ 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

рдЖрд╣реЗ.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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛