You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 23:49:51