αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž JMeter αž“αŸ…αž€αŸ’αž“αž»αž„ OpenShift αžŠαŸ„αž™αž”αŸ’αžšαžΎ Jenkins Pipeline

αž‡αŸ†αžšαžΆαž”αžŸαž½αžšαž˜αž“αž»αžŸαŸ’αžŸαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αž“αžΆ!

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αžœαž·αž’αžΈαž˜αž½αž™αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž JMeter αž“αŸ…αž€αŸ’αž“αž»αž„ OpenShift αžŠαŸ„αž™αž”αŸ’αžšαžΎ Jenkins αž‡αžΆαžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜αŸ” αžŠαŸ†αž”αžΌαž„αž™αžΎαž„αž“αžΉαž„αž’αŸ’αžœαžΎαž‡αŸ†αž αžΆαž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ (αž”αž„αŸ’αž€αžΎαž ImageStreams, BuildConfig, Job αž›) αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αŸ€αž”αžŠαŸ„αž™αžŠαŸƒαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡ αž…αžΌαžšαž™αžΎαž„αžŸαžšαžŸαŸαžš Jenkins Pipeline αŸ”

αž‡αžΆαž…αŸ†αžŽαž»αž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž™αžΎαž„αž‚αž½αžšαžαŸ‚αž˜αžΆαž“αŸ–

  1. αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš OpenShift (v3.11) cluster
  2. αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Jenkins αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ 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.

αžœαžΆαž”αŸ’αžšαžŸαžΎαžšαž‡αžΆαž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž Storajs αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž–αŸ’αžšαŸ„αŸ‡ 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αŸ–

αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž JMeter αž“αŸ…αž€αŸ’αž“αž»αž„ OpenShift αžŠαŸ„αž™αž”αŸ’αžšαžΎ Jenkins Pipeline

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ JMeter

αž…αžΌαžšαž”αž“αŸ’αžαž‘αŸ…αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž ImageStream ΠΈ BuildConfig.

αž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αž–αŸαžαŸŒαž˜αžΆαž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš - αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžŸαŸ’αž‘αŸ’αžšαžΈαž˜αžšαžΌαž”αž—αžΆαž–.

αž™αž»αž‘αŸ’αž’αžŸαžΆαžŸαŸ’αžαŸ’αžšαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž‚αžΊ Docker αž–αžΈαž”αŸ’αžšαž—αž–αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αŸ”

αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ jmeter-baseαžŠαŸ‚αž›αž“αžΉαž„αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 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

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 αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžš Apache αŸ” αž—αžΆαžšαž€αž·αž…αŸ’αž…αžšαž”αžŸαŸ‹αžœαžΆαž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αžαž›αŸ‹αž“αžΌαžœαžαžαžŠαŸ‚αž›αž˜αžΆαž“αž›αž‘αŸ’αž’αž•αž›αžαŸαžŸαŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž˜αžΎαž›αŸ”

αžšαŸ€αž”αž…αŸ† Dockerfile αž“αž·αž„αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ httpd.conf. αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ† DocumentRoot αžαž˜αŸ’αž›αŸƒαž€αŸ†αžŽαžαŸ‹ /jmeter/reports, i.e. αžαžαžŠαŸ‚αž›αž›αž‘αŸ’αž’αž•αž›αžαŸαžŸαŸ’αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αŸ”

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

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-មេ

αžαŸ„αŸ‡αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžš Apache αŸ”

αž“αŸαŸ‡αž‚αžΊαž‡αžΆ Dockerfile jmeter-master'a, αž•αŸ’αž’αŸ‚αž€αž›αžΎ jmeter-baseαžŠαŸ‚αž›αž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž αž“αž·αž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž›αž‘αŸ’αž’αž•αž›αž‘αŸ…αž€αž“αŸ’αž›αŸ‚αž„αž•αŸ’αž‘αž»αž€αŸ”

Dockerfile

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"]

αžšαžαŸ‹.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's αž“αž·αž„αž’αžΆαž“αžΆαž€αžΆαžšαž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ/αžŸαŸ’αž‚αŸ’αžšαžΈαž”αŸ”

$ 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

αž”αŸ†αž–αž„αŸ‹ Jenkins

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜αŸ” αž…αžΌαžšαž™αžΎαž„αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž‡αŸ†αž αžΆαž“αž˜αŸ’αžαž„αž‘αŸ€αžαŸ–

  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αžŠαŸ‚αž›αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαžŸαžΆαž€αž›αŸ’αž”αž„αŸ–

αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž JMeter αž“αŸ…αž€αŸ’αž“αž»αž„ OpenShift αžŠαŸ„αž™αž”αŸ’αžšαžΎ Jenkins Pipeline

αž˜αžΆαžαž·αž€αžΆαž―αž€αžŸαžΆαžš 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

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž‡αž˜αŸ’αžšαžΎαžŸαž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž JMeter αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸ OpenShift αŸ” αž™αžΎαž„αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž‡αŸ†αž αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ„αž™αžŠαŸƒ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž€αžΎαž Jenkins Pipeline αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αŸ”

αž”αŸ’αžšαž—αž– αž“αž·αž„αž―αž€αžŸαžΆαžš

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹