GitHub Action执行JMeter测试超时,如何延长或动态创建作业
解决GitHub Action JMeter测试超时问题
一、关于延长作业超时时间
GitHub Actions的单作业最长执行时间有明确限制:
- 公共仓库、免费版私有仓库:单作业最多6小时,无法突破这个限制
- GitHub Team/Enterprise计划:可以在仓库的「Settings → Actions → General」里调整作业超时时间,最长可设置为9小时
如果你的测试总时长超过9小时,或者使用的是免费版,那么拆分作业是唯一可行的方案,也就是为每个子目录单独创建作业并行执行。
二、动态生成多作业的实现方案
通过GitHub Actions的matrix结合前置作业,可以自动识别子目录并生成对应作业,具体步骤如下:
1. 前置作业:识别子目录
先创建一个前置作业,遍历psr-scripts下的子目录,将目录列表输出为JSON格式,作为后续作业的矩阵数据源。
2. 动态矩阵作业:并行执行测试
基于前置作业输出的目录列表,生成动态矩阵,每个矩阵项对应一个子目录,单独执行该目录下的JMeter测试,最后上传各自的测试结果。
修改后的完整工作流代码
name: JMeter Automation on: workflow_dispatch: defaults: run: shell: bash jobs: # 前置作业:发现所有包含maxLoad.jmx的子目录 discover-directories: runs-on: ubuntu-latest outputs: dirs: ${{ steps.set-dirs.outputs.dirs }} steps: - name: Check out repository code uses: actions/checkout@v3 with: ref: main - name: List target directories id: set-dirs run: | # 找出所有包含*maxLoad.jmx的子目录,去重后转为JSON数组 dirs=$(find psr-scripts -name "*maxLoad.jmx" -type f | xargs dirname | sort | uniq | jq -R . | jq -s .) echo "dirs=$dirs" >> $GITHUB_OUTPUT # 动态生成的JMeter测试作业,每个子目录一个作业 run-jmeter-tests: needs: discover-directories runs-on: ubuntu-latest strategy: matrix: dir: ${{ fromJSON(needs.discover-directories.outputs.dirs) }} # 可选:如果某个作业失败,继续执行其他作业 fail-fast: false steps: - name: Check out repository code uses: actions/checkout@v3 with: ref: main - name: Set up Java uses: actions/setup-java@v3 with: java-version: '11' distribution: 'temurin' - name: Cache JMeter and plugins uses: actions/cache@v3 with: path: | apache-jmeter-5.4.3 key: jmeter-5.4.3-plugins - name: Download JMeter if: steps.cache.outputs.cache-hit != 'true' run: | wget https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.4.3.tgz tar -xvf apache-jmeter-5.4.3.tgz - name: Download JMeter Plugins if: steps.cache.outputs.cache-hit != 'true' run: | mkdir -p $PWD/apache-jmeter-5.4.3/lib/ext # 下载插件 wget https://jmeter-plugins.org/files/packages/jpgc-casutg-2.10.zip unzip -o jpgc-casutg-2.10.zip -d $PWD/apache-jmeter-5.4.3/ wget https://jmeter-plugins.org/files/packages/jpgc-graphs-basic-2.0.zip unzip -o jpgc-graphs-basic-2.0.zip -d $PWD/apache-jmeter-5.4.3/ wget https://jmeter-plugins.org/files/packages/jpgc-graphs-additional-2.0.zip unzip -o jpgc-graphs-additional-2.0.zip -d $GITHUB_WORKSPACE/apache-jmeter-5.4.3/ - name: Set up JMeter properties run: | echo "HEAP=-Xms10g -Xmx20g" >> $GITHUB_WORKSPACE/apache-jmeter-5.4.3/bin/jmeter.properties echo "jmeter.save.saveservice.thread_counts=true" >> $GITHUB_WORKSPACE/apache-jmeter-5.4.3/bin/jmeter.properties - name: Run JMeter Test for directory working-directory: ${{ matrix.dir }} run: | # 创建结果目录 mkdir -p ../results # 找到当前目录下的maxLoad.jmx文件 jmx_file=$(find . -name "*maxLoad.jmx" -type f | head -1) jmx_name=$(basename "$jmx_file") dir_name=$(basename "${{ matrix.dir }}") # 执行JMeter测试,同时生成jtl和csv(注:JMeter可以通过配置一次生成,此处保留原逻辑) $GITHUB_WORKSPACE/apache-jmeter-5.4.3/bin/jmeter -n -t "$jmx_file" -l "../results/${dir_name}_maxLoad.jtl" $GITHUB_WORKSPACE/apache-jmeter-5.4.3/bin/jmeter -n -t "$jmx_file" -l "../results/${dir_name}_maxLoad.csv" - name: Upload Directory Reports if: always() uses: actions/upload-artifact@v3 with: name: JMeter Reports - ${{ github.run_number }} - ${{ basename(matrix.dir) }} path: ${{ matrix.dir }}/../results/
关键说明
- 前置作业
discover-directories:使用find命令定位包含maxLoad.jmx的子目录,通过jq转为JSON数组,输出给后续作业。 - 动态矩阵
strategy.matrix:通过fromJSON解析前置作业的输出,自动生成对应数量的作业,并行执行。 - 缓存优化:添加了
actions/cache,避免每次作业都重复下载JMeter和插件,节省时间和带宽。 - 独立结果上传:每个作业上传自己的测试结果,文件名包含目录名,方便区分。
额外优化建议
- 原脚本中两次执行JMeter生成jtl和csv是冗余的,可以修改JMeter的
jmeter.properties配置,让一次执行同时生成两种格式,或者使用插件将jtl转换为csv,减少执行时间。 - 如果子目录数量较多,可以通过
max-parallel限制并行作业数量,避免超出GitHub的并发限制。
内容的提问来源于stack exchange,提问作者Maxx
相关产品推荐
相关产品推荐

