在 CentOS 上将 JMeter 集成到 CI/CD 的落地方案
一 架构与准备
- 组件选型
- 版本控制与触发:GitLab/GitHub(Webhook 触发流水线)。
- CI/CD 引擎:Jenkins(自建)或 GitLab CI/GitHub Actions(托管)。
- 执行环境:CentOS 7/8 代理节点(可容器化),预装 Java 8/11、JMeter 5.x。
- 安装 JMeter(示例)
- 安装 OpenJDK 8:sudo yum install -y java-1.8.0-openjdk-devel
- 下载并解压 JMeter(以 5.4.3 为例):
- wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.4.3.tgz
- tar -xzf apache-jmeter-5.4.3.tgz -C /opt/
- ln -sfn /opt/apache-jmeter-5.4.3 /opt/jmeter
- 配置环境变量(/etc/profile 或 ~/.bashrc):
- export JMETER_HOME=/opt/jmeter
- export PATH=$PATH:$JMETER_HOME/bin
- 验证:jmeter -v
- 建议目录结构
- /opt/jmeter-tests/:存放 .jmx 脚本、数据文件、报告目录
- /var/lib/jenkins/workspace/…:Jenkins 工作空间(自动拉取代码)
- 代理与权限
- 为 Jenkins 代理或运行用户授予对 /opt/jmeter 与 /opt/jmeter-tests 的读写权限
- 如需远程分布式压测,开放 RMI 1099 端口并配置 server.rmi.localport、remote_hosts 等参数
二 执行引擎选择与示例
- 方式 A:命令行直跑(最简洁,适合任何 CI)
- 典型命令
- jmeter -n -t /opt/jmeter-tests/perf/login.jmx -l /opt/jmeter-tests/results/result.jtl -e -o /opt/jmeter-tests/results/html-report
- 说明
- -n 非 GUI;-t 指定脚本;-l 输出 JTL;-e 生成 HTML 报告;-o 指定报告目录(需为空)
- 可在 CI 中保存 JTL/HTML 为构件,便于归档与对比
- 方式 B:Ant 批量执行(传统方案,便于生成 HTML 报告)
- 安装 Ant:sudo yum install -y ant
- 将 JMeter extras 中的 ant-jmeter-1.1.1.jar 复制到 $ANT_HOME/lib
- 在 JMeter 的 extras 目录可找到 build.xml 示例,按需修改 jmeter.home、test.jmx、result.jtl、result.html 路径
- 运行:cd /ant && ant
- 报告样式可通过替换 jmeter-results-detail-report_21.xsl 或自定义 XSL 实现
- 方式 C:Maven 插件执行(适合 Java 项目一体化)
- 在 pom.xml 中引入 jmeter-maven-plugin,配置 、、 等
- 运行:mvn verify(或 mvn jmeter:gui 本地调试)
- 报告默认生成在 target/jmeter/,可结合 maven-resources-plugin 拷贝归档
- 方式 D:容器化执行(环境一致性最佳)
- 示例(在 CI 中使用官方镜像运行 JMeter,挂载脚本与结果目录):
- docker run --rm -v /opt/jmeter-tests:/tests justb4/jmeter:5.4.3 -n -t /tests/login.jmx -l /tests/results.jtl -e -o /tests/report
三 在 CI/CD 平台中的落地示例
- Jenkins 流水线(声明式)
- 关键步骤
- 拉取代码(Git)
- 安装 Java 与 JMeter(或使用已预装代理)
- 执行 JMeter(命令行或 Ant/Maven)
- 归档 JTL/HTML 报告,发布到 HTML Publisher 或 Performance Plugin
- 阈值门禁(如 95th 响应时间 < 2s、错误率 < 1%)
- 示例 Jenkinsfile(片段)
- pipeline {
agent { label ‘centos-jmeter’ }
tools { jdk ‘openjdk8’ }
stages {
stage(‘Checkout’) { steps { git url: ‘git@gitlab.com:xxx/perf-tests.git’, branch: ‘main’ } }
stage(‘Run JMeter’) {
steps {
sh ‘’’
mkdir -p results
/opt/jmeter/bin/jmeter -n -t tests/login.jmx -l results/result.jtl -e -o results/html-report
‘’’
}
}
stage(‘Archive & Report’) {
steps {
archiveArtifacts artifacts: ‘results/**’, fingerprint: true
publishHTML(target: [reportDir: ‘results/html-report’, reportFiles: ‘index.html’, reportName: ‘JMeter Report’])
}
}
stage(‘Threshold Gate’) {
steps {
script {
def summary = readFile ‘results/html-report/summary.json’ // 需配合 JMeter 插件导出
// 解析并判断阈值,失败则 currentBuild.result = ‘FAILURE’
}
}
}
}
}
- 插件建议:Git、HTML Publisher、Performance Plugin、Warnings NG
- GitLab CI 示例(.gitlab-ci.yml)
- 示例
- stages: [test]
jmeter:
image: justb4/jmeter:5.4.3
stage: test
script:
- mkdir -p results
- jmeter -n -t tests/login.jmx -l results/result.jtl -e -o results/html-report
artifacts:
paths: [results/]
when: always
only:
- main
- GitHub Actions 示例(.github/workflows/perf.yml)
- 示例
- name: JMeter Performance Test
on: [push]
jobs:
perf:
runs-on: ubuntu-latest
container: justb4/jmeter:5.4.3
steps:
- uses: actions/checkout@v4
- name: Run JMeter
run: |
mkdir -p results
jmeter -n -t tests/login.jmx -l results/result.jtl -e -o results/html-report
- name: Upload Report
uses: actions/upload-artifact@v4
with:
path: results/