devops-在jenkins-slave(k8s)中集成Jmeter使用

简介: devops-在jenkins-slave(k8s)中集成maven使用


环境准备

centos7

k8s集群

jenkins + gitlab




下载jenkins相关插件



HTML Publisher plugin

image.png





创建流水线




image.png




流水线配置





image.png



脚本内容


声明式,构建slave节点的流水线。

// 为了解决jmeter生成的HTML报告无法显示的问题。参考https://blog.csdn.net/qq_29427355/article/details/82424467
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
pipeline {  agent {    kubernetes {      //yamlFile 'KubernetesPod.yaml'      cloud 'kubernetes'      yaml '''---apiVersion: v1
kind: Pod
metadata:  namespace: devops
spec:  nodeSelector:    kubernetes.io/os: linux
  restartPolicy: Never
  serviceAccountName: jenkins
  containers:    - name: "docker"      image: "docker:latest"      imagePullPolicy: "IfNotPresent"      resources:        limits: {}        requests: {}      command:      - cat
      tty: true      volumeMounts:        - mountPath: /var/run/docker.sock
          name: docker-sock
          readOnly: false    - name: "python3"      image: "python:3.8.6"      imagePullPolicy: "IfNotPresent"      resources:        limits: {}        requests: {}      command:      - cat
      tty: true      volumeMounts:        - mountPath: /var/run/docker.sock
          name: docker-sock
          readOnly: false    - name: "maven36"      image: "yfy/maven:3.6-jdk-11"      imagePullPolicy: "IfNotPresent"      resources:        limits: {}        requests: {}      command:      - cat
      tty: true      volumeMounts:        - mountPath: /root/.m2/repository
          name: maven-repo
          readOnly: false    - name: "jmeter55"      image: "justb4/jmeter:latest"      imagePullPolicy: "IfNotPresent"      resources:        limits: {}        requests: {}      command:      - cat
      tty: true      volumeMounts:        - mountPath: /plugin
          name: jmeter-plugins
          readOnly: false  volumes:    - hostPath:        path: /var/run/docker.sock
      name: docker-sock
    - hostPath:        path: /data/devops/jenkins/.m/repository
      name: maven-repo
    - hostPath:        path: /data/devops/jenkins/tools/jmeter/plugins
      name: jmeter-plugins
'''}}    options {        //设置管道运行的超时时间,在此之后,Jenkins将中止管道
        timeout(time: 20, unit: 'MINUTES')
        // 失败重试次数
        retry(2)
        //输出时间戳
        timestamps()
}    environment {        //构建分支 master、test
        // Brand='test'        //定义Maven编译环境 dev/test/prod
        ACTIVE = "test"        //jar包名称
        JAR_NAME = 'yss-datamiddle-multiplecheck.jar'        //JOB所在根目录,JOB_NAME
        WORKSPACE_PATH = "/opt/dataMiddle-service/workspace/${JOB_NAME}/"}  stages {        stage('checkout') {          steps {            checkout([$class: 'GitSCM',                      branches: [[name: '*/main']],                      extensions: [],                      userRemoteConfigs: [[credentialsId: 'gitlab-author', url: 'http://192.168.10.200:8085/yfy-test/jmeter-pytest-scaffolding.git']]])
}}        stage('jmeter55'){            steps{                container('jmeter55'){                    // jmeter -n -t test.jmx -l test.jtl -e -o /path
                    // # -n: 以非GUI形式运行Jmeter                     // # -t:source.jmx 脚本路径                     // # -l result.jtl 运行结果保存路径(.jtl),此文件必须不存在                     // # -e:在脚本运行结束后生成html报告                     // # -o:用于存放html报告的目录                    sh "jmeter --version"                    sh "jmeter  -n -Jthreadcount=5 -t jmeter-test.jmx -l reports/jmeter-test-report.jtl -e -o reportshtml/"}}}        stage("性能测试报告") {            steps {             // echo '---Performance Reports---'             // perfReport filterRegex: '', showTrendGraphs: true, sourceDataFiles: 'reports/*.jtl'              echo '--- HTML Report ---'               //展示测试报告
                publishHTML([allowMissing: false,                            alwaysLinkToLastBuild: false,                            keepAll: false,                            reportDir: 'reportshtml',                            reportFiles: 'index.html',                            reportName: 'jmeterHTMLReport',                            reportTitles: '',                            useWrapperFileDirectly: true]                )
}}    // stage('maven3.6'){    //     steps{    //         container('maven36'){    //             sh "mvn -v"    //             sh "mvn clean package -DskipTests=true"    //         }    //     }    // }    // stage('build-allure-results') {    //     steps {    //         container('python3') {    //             sh """    //             python --version
    //             pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
    //             python main.py ${allure_results_path}    //             """    //         }    //     }    // }    // stage('build-allure-export') {    //     steps {    //         // 通过jenkins的全局工具配置,下载allure工具
    //         allure includeProperties: false, jdk: '',  results: [[path: '${allure_results_path}']]    //     }    // }    // stage('docker build') {    //   steps {    //     container('docker') {    //       sh """    //         docker version
    //       """    //     }    //     container('python3') {    //       print('user mutil container...')
    //     }    //   }    // }}}




使用kubernets作为slave节点配置


kubernetes: slave节点

yaml: 声明式定义pod template

pipeline {  agent {    kubernetes {      //yamlFile 'KubernetesPod.yaml'      cloud 'kubernetes'      yaml '''




在pod-template中使用jmeter容器




    - name: "jmeter55"      image: "justb4/jmeter:latest"      imagePullPolicy: "IfNotPresent"      resources:        limits: {}        requests: {}      command:      - cat
      tty: true      volumeMounts:        - mountPath: /plugin
          name: jmeter-plugins
          readOnly: false


- mountPath: /plugin  :  容器内持久化挂载的jmeter插件




  volumes:    - hostPath:        path: /var/run/docker.sock
      name: docker-sock
    - hostPath:        path: /data/devops/jenkins/.m/repository
      name: maven-repo
    - hostPath:        path: /data/devops/jenkins/tools/jmeter/plugins
      name: jmeter-plugins


- hostPath:

       path: /data/devops/jenkins/tools/jmeter/plugins

     name: jmeter-plugins


jmeter插件在宿主机上的位置




注意:提前把jmeter使用的相关插件拷贝到 此目录下:

/data/devops/jenkins/tools/jmeter/plugins


如图所示:


image.png




checkout仓库



        stage('checkout') {          steps {            checkout([$class: 'GitSCM',                      branches: [[name: '*/main']],                      extensions: [],                      userRemoteConfigs: [[credentialsId: 'gitlab-author', url: 'http://192.168.10.200:8085/yfy-test/jmeter-pytest-scaffolding.git']]])
}}


使用jmeter容器生成HTML报表


        stage('jmeter55'){            steps{                container('jmeter55'){                    // jmeter -n -t test.jmx -l test.jtl -e -o /path
                    // # -n: 以非GUI形式运行Jmeter                     // # -t:source.jmx 脚本路径                     // # -l result.jtl 运行结果保存路径(.jtl),此文件必须不存在                     // # -e:在脚本运行结束后生成html报告                     // # -o:用于存放html报告的目录                    sh "jmeter --version"                    sh "jmeter  -n -Jthreadcount=5 -t jmeter-test.jmx -l reports/jmeter-test-report.jtl -e -o reportshtml/"}}}




        stage("性能测试报告") {            steps {             // echo '---Performance Reports---'             // perfReport filterRegex: '', showTrendGraphs: true, sourceDataFiles: 'reports/*.jtl'              echo '--- HTML Report ---'               //展示测试报告
                publishHTML([allowMissing: false,                            alwaysLinkToLastBuild: false,                            keepAll: false,                            reportDir: 'reportshtml',                            reportFiles: 'index.html',                            reportName: 'jmeterHTMLReport',                            reportTitles: '',                            useWrapperFileDirectly: true]                )
}}



执行流水线


Started by user jenkins
[Pipeline] Start of Pipeline
[Pipeline] podTemplate
[Pipeline]{[Pipeline] node
Created Pod: kubernetes devops/jmeter-pytest-pipeline-16-nzxgn-n639w-jqzn0
Still waiting to schedule task
‘jmeter-pytest-pipeline-16-nzxgn-n639w-jqzn0’ is offline
Agent jmeter-pytest-pipeline-16-nzxgn-n639w-jqzn0 is provisioned from template jmeter-pytest-pipeline_16-nzxgn-n639w
---apiVersion: "v1"kind: "Pod"metadata:  annotations:    buildUrl: "http://192.168.10.201:30080/job/jmeter-pytest-pipeline/16/"    runUrl: "job/jmeter-pytest-pipeline/16/"  labels:    jenkins: "slave"    jenkins/label-digest: "ae6ed240d3a142da64181870bc68b00255b964cc"    jenkins/label: "jmeter-pytest-pipeline_16-nzxgn"  name: "jmeter-pytest-pipeline-16-nzxgn-n639w-jqzn0"  namespace: "devops"spec:  containers:  - command:    - "cat"    image: "docker:latest"    imagePullPolicy: "IfNotPresent"    name: "docker"    resources:      limits: {}      requests: {}    tty: true    volumeMounts:    - mountPath: "/var/run/docker.sock"      name: "docker-sock"      readOnly: false    - mountPath: "/home/jenkins/agent"      name: "workspace-volume"      readOnly: false  - command:    - "cat"    image: "python:3.8.6"    imagePullPolicy: "IfNotPresent"    name: "python3"    resources:      limits: {}      requests: {}    tty: true    volumeMounts:    - mountPath: "/var/run/docker.sock"      name: "docker-sock"      readOnly: false    - mountPath: "/home/jenkins/agent"      name: "workspace-volume"      readOnly: false  - command:    - "cat"    image: "yfy/maven:3.6-jdk-11"    imagePullPolicy: "IfNotPresent"    name: "maven36"    resources:      limits: {}      requests: {}    tty: true    volumeMounts:    - mountPath: "/root/.m2/repository"      name: "maven-repo"      readOnly: false    - mountPath: "/home/jenkins/agent"      name: "workspace-volume"      readOnly: false  - command:    - "cat"    image: "justb4/jmeter:latest"    imagePullPolicy: "IfNotPresent"    name: "jmeter55"    resources:      limits: {}      requests: {}    tty: true    volumeMounts:    - mountPath: "/plugin"      name: "jmeter-plugins"      readOnly: false    - mountPath: "/home/jenkins/agent"      name: "workspace-volume"      readOnly: false  - env:    - name: "JENKINS_SECRET"      value: "********"    - name: "JENKINS_AGENT_NAME"      value: "jmeter-pytest-pipeline-16-nzxgn-n639w-jqzn0"    - name: "JENKINS_NAME"      value: "jmeter-pytest-pipeline-16-nzxgn-n639w-jqzn0"    - name: "JENKINS_AGENT_WORKDIR"      value: "/home/jenkins/agent"    - name: "JENKINS_URL"      value: "http://192.168.10.201:30080/"    image: "jenkins/inbound-agent:4.11-1-jdk11"    name: "jnlp"    resources:      limits: {}      requests:        memory: "256Mi"        cpu: "100m"    volumeMounts:    - mountPath: "/home/jenkins/agent"      name: "workspace-volume"      readOnly: false  nodeSelector:    kubernetes.io/os: "linux"  restartPolicy: "Never"  serviceAccountName: "jenkins"  volumes:  - hostPath:      path: "/var/run/docker.sock"    name: "docker-sock"  - hostPath:      path: "/data/devops/jenkins/.m/repository"    name: "maven-repo"  - hostPath:      path: "/data/devops/jenkins/tools/jmeter/plugins"    name: "jmeter-plugins"  - emptyDir:      medium: ""    name: "workspace-volume"Running on jmeter-pytest-pipeline-16-nzxgn-n639w-jqzn0 in /home/jenkins/agent/workspace/jmeter-pytest-pipeline
[Pipeline]{[Pipeline] withEnv
[Pipeline]{[Pipeline] timeout
Timeout set to expire in 20 min
[Pipeline]{[Pipeline] retry
[Pipeline]{[Pipeline] timestamps
[Pipeline]{[Pipeline] stage
[Pipeline]{ (checkout)
[Pipeline] checkout
08:32:00  The recommended git tool is: NONE
08:32:06  using credential gitlab-author
08:32:06  Cloning the remote Git repository
08:32:07  Cloning repository http://192.168.10.200:8085/yfy-test/jmeter-pytest-scaffolding.git
08:32:07   > git init /home/jenkins/agent/workspace/jmeter-pytest-pipeline # timeout=1008:32:08  Fetching upstream changes from http://192.168.10.200:8085/yfy-test/jmeter-pytest-scaffolding.git
08:32:08   > git --version # timeout=1008:32:08   > git --version # 'git version 2.30.2'08:32:08  using GIT_ASKPASS to set credentials gitlab-author
08:32:08   > git fetch --tags --force --progress -- http://192.168.10.200:8085/yfy-test/jmeter-pytest-scaffolding.git +refs/heads/*:refs/remotes/origin/* # timeout=1008:32:09   > git config remote.origin.url http://192.168.10.200:8085/yfy-test/jmeter-pytest-scaffolding.git # timeout=1008:32:09   > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=1008:32:10  Avoid second fetch
08:32:10  Checking out Revision 6deb2f3a38f079cd55fbd1d9189872c75d1ea676 (refs/remotes/origin/main)
08:32:10   > git rev-parse refs/remotes/origin/main^{commit}# timeout=1008:32:10   > git config core.sparsecheckout # timeout=1008:32:10   > git checkout -f 6deb2f3a38f079cd55fbd1d9189872c75d1ea676 # timeout=1008:32:13  Commit message: "Update Jenkinsfile"08:32:13   > git rev-list --no-walk 40205a28a67e6a6b48cee7b8f2c98e6bea88ff8c # timeout=10[Pipeline]}[Pipeline] // stage
[Pipeline] stage
[Pipeline]{ (jmeter55)
[Pipeline] container
[Pipeline]{[Pipeline] sh
08:32:14  + jmeter --version
08:32:19  Dec 18, 2022 1:32:18 AM java.util.prefs.FileSystemPreferences$1 run
08:32:19  INFO: Created user preferences directory.
08:32:19      _    ____   _    ____ _   _ _____       _ __  __ _____ _____ _____ ____
08:32:19     / \  |  _ \ / \  / ___| | | | ____|     | |  \/  | ____|_   _| ____|  _ \
08:32:19    / _ \ | |_) / _ \| |   | |_| |  _|    _  | | |\/| |  _|   | | |  _| | |_) |
08:32:19   / ___ \|  __/ ___ \ |___|  _  | |___  | |_| | |  | | |___  | | | |___|  _ <
08:32:19  /_/   \_\_| /_/   \_\____|_| |_|_____|  \___/|_|  |_|_____| |_| |_____|_| \_\ 5.5
08:32:19  
08:32:19  Copyright (c) 1999-2022 The Apache Software Foundation
08:32:19  
[Pipeline] sh
08:32:20  + jmeter -n '-Jthreadcount=5' -t jmeter-test.jmx -l reports/jmeter-test-report.jtl -e -o reportshtml/
08:32:23  Creating summariser <summary>
08:32:23  Created the tree successfully using jmeter-test.jmx
08:32:23  Starting standalone test @ December 18, 2022 1:32:22 AM CET (1671323542996)
08:32:23  Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
08:32:25  summary =      2 in 00:00:01 =    1.4/s Avg:   560 Min:    81 Max:  1039 Err:     0 (0.00%)
08:32:25  Tidying up ...    @ December 18, 2022 1:32:24 AM CET (1671323544991)
08:32:26  ... end of run
[Pipeline]}[Pipeline] // container
[Pipeline]}[Pipeline] // stage
[Pipeline] stage
[Pipeline]{ (性能测试报告)
[Pipeline] echo
08:32:27  --- HTML Report ---
[Pipeline] publishHTML
08:32:27  [htmlpublisher] Archiving HTML reports...
08:32:27  [htmlpublisher] Archiving at PROJECT level /home/jenkins/agent/workspace/jmeter-pytest-pipeline/reportshtml to /var/lib/jenkins/jobs/jmeter-pytest-pipeline/htmlreports/jmeterHTMLReport
[Pipeline]}[Pipeline] // stage
[Pipeline]}[Pipeline] // timestamps
[Pipeline]}[Pipeline] // retry
[Pipeline]}[Pipeline] // timeout
[Pipeline]}[Pipeline] // withEnv
[Pipeline]}[Pipeline] // node
[Pipeline]}[Pipeline] // podTemplate
[Pipeline] End of Pipeline
Finished: SUCCESS



查看HTML测试报告


reportng html报告在jenkins中显示有问题,或者 css样式不显示

如下不显示内容

image.png




解决jmeter测试报告HTML页面无法正常显示



在pipeline代码中添加以下代码:


// 为了解决jmeter生成的HTML报告无法显示的问题。参考https://blog.csdn.net/qq_29427355/article/details/82424467
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")


再次执行流水线,流水线会失败,并输出一下内容:


image-20221218001336651.png


点击提示中的超链接,授权并批准administrators权限

image-20221218001547157.png


或者


在系统管理 》进行授权

image-20221218001445245.png




授权成功以后,重新构建流水线,再次查看HTML报表



image.png



参考相关代码:


https://gitee.com/yyyfly/devops-k8s-pytest-jmeter




相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
7月前
|
Kubernetes Devops 应用服务中间件
基于 Azure DevOps 与阿里云 ACK 构建企业级 CI/CD 流水线
本文介绍如何结合阿里云 ACK 与 Azure DevOps 搭建自动化部署流程,涵盖集群创建、流水线配置、应用部署与公网暴露,助力企业高效落地云原生 DevOps 实践。
876 2
|
jenkins Devops Java
DevOps实践:Jenkins在持续集成与持续部署中的价值
【10月更文挑战第27天】在快速发展的软件开发领域,DevOps实践日益重要。Jenkins作为一款流行的开源自动化服务器,在持续集成(CI)和持续部署(CD)中扮演关键角色。本文通过案例分析,探讨Jenkins在Java项目中的应用,展示其自动化构建、测试和部署的能力,提高开发效率和软件质量。
498 2
|
存储 监控 Devops
DevOps实践:持续集成/持续部署(CI/CD)的实战指南
DevOps实践:持续集成/持续部署(CI/CD)的实战指南
|
监控 jenkins Shell
jenkins结合gitlab实现CI(持续集成)
通过本文的介绍,我们详细了解了如何结合Jenkins和GitLab实现持续集成。从环境准备、插件配置到Pipeline任务创建和CI流程监控,每一步都提供了详细的操作步骤和示例代码。希望本文能帮助开发者快速搭建起高效的CI系统,提高项目开发效率和代码质量。
1501 9
|
Java jenkins 持续交付
Jenkins集成Maven
通过以上步骤,可以在Jenkins中成功集成Maven,实现自动化构建和部署。通过定时构建、SCM轮询等方式,可以确保代码库中的最新变更能够及时构建和测试,提高开发效率和代码质量。这种集成方式在实际项目中具有广泛的应用前景,能够显著提升团队的协作效率。
524 8
|
监控 jenkins Linux
从 Jenkins 持续集成出发:探究如何监控员工电脑屏幕
Jenkins 在企业信息化管理中用于自动化构建、测试和部署,提高开发效率。本文讨论了其重要性,并从技术角度探讨了屏幕监控的可能性,但明确反对非法监控,强调应合法合规地管理企业和尊重员工隐私。
314 12
|
运维 Devops jenkins
DevOps实践:持续集成与持续部署在现代软件开发中的作用
【10月更文挑战第42天】在快节奏的软件开发世界里,DevOps已经成为一种提升效率、确保质量和加速交付的重要方法。本文将深入探讨DevOps的核心组成部分—持续集成(CI)和持续部署(CD)—并展示它们如何通过自动化流程优化开发周期。我们将从基础概念讲起,逐步过渡到实际操作,最终通过一个简单代码示例来演示这一过程。文章旨在为读者提供清晰的指导,帮助他们理解和实现CI/CD流程,从而在软件开发领域取得竞争优势。
|
运维 jenkins Java
Jenkins在持续集成与持续部署中的价值
Jenkins在持续集成与持续部署中的价值
|
Devops jenkins 测试技术
DevOps实践:自动化部署与持续集成的融合之旅
【10月更文挑战第41天】在软件开发的世界中,快速迭代和高效交付是企业竞争力的关键。本文将带你走进DevOps的核心实践——自动化部署与持续集成,揭示如何通过它们提升开发流程的效率与质量。我们将从DevOps的基本理念出发,逐步深入到具体的技术实现,最终展示一个实际的代码示例,让理论与实践相结合,为你的开发旅程提供清晰的指引。
284 4
|
运维 Devops jenkins
DevOps实践之持续集成与持续交付
【10月更文挑战第32天】在软件开发的快节奏世界中,DevOps已经成为提升效率和质量的关键策略。通过将开发(Development)和运维(Operations)紧密结合,DevOps促进了更快速的软件发布和更高的可靠性。本文将深入探讨DevOps的核心组成部分——持续集成(CI)和持续交付(CD),并展示如何通过实际代码示例实现它们,以帮助团队构建更加高效和稳定的软件发布流程。

推荐镜像

更多