Github Actions含Matrix配置时提前超时问题求助
问题:GitHub Actions多PHP版本Matrix工作流提前被取消
我配置了一个包含多PHP版本Matrix的GitHub Actions基准测试工作流,已设置timeout-minutes:10,但每个作业仅运行21秒就被取消;移除Matrix后,单PHP版本的工作流可正常完成。请问这是什么原因?
含Matrix的配置文件
name: Benchmark on: push jobs: benchmark: strategy: matrix: PHP_VERSION: [ '4.4', '5.0', '5.1', '5.2', '5.3', '5.4', '5.5', '5.6', '7.1', '7.2', '7.3', '7.4', '8.0', '8.0jit', '8.1', '8.1jit', '8.2', '8.2jit' ] runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: "Setup Docker and Git Repo" run: | git clone -b 1.0 --single-branch https://github.com/phpseclib/phpseclib.git if [[ "${{ matrix.PHP_VERSION }}" == "8"* ]]; then docker pull "quay.io/phpseclib/php${{ matrix.PHP_VERSION }}" && docker image tag "quay.io/phpseclib/php${{ matrix.PHP_VERSION }}" "phpseclib/php${{ matrix.PHP_VERSION }}"; else docker pull "phpseclib/php${{ matrix.PHP_VERSION }}"; fi - name: "Run Benchmark" run: | docker run -v "`pwd`:/opt/src" \ -w "/opt/src" \ "phpseclib/php${{ matrix.PHP_VERSION }}" \ php test.php timeout-minutes: 10
作业日志
Cloning into 'phpseclib'... Using default tag: latest latest: Pulling from phpseclib/php4.4 2b15b7abe8b3: Pulling fs layer 292ae618967d: Pulling fs layer 71bbdbc9d3c1: Pulling fs layer 963fe8c066a2: Pulling fs layer 963fe8c066a2: Waiting 71bbdbc9d3c1: Verifying Checksum 71bbdbc9d3c1: Download complete 2b15b7abe8b3: Verifying Checksum 2b15b7abe8b3: Download complete 963fe8c066a2: Verifying Checksum 963fe8c066a2: Download complete 2b15b7abe8b3: Pull complete 292ae618967d: Verifying Checksum 292ae618967d: Download complete 292ae618967d: Pull complete 71bbdbc9d3c1: Pull complete Error: The operation was canceled.
无Matrix的正常配置文件
name: Benchmark on: push jobs: benchmark: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: "Setup Docker and Git Repo" run: | git clone -b 1.0 --single-branch https://github.com/phpseclib/phpseclib.git docker pull "phpseclib/php7.4" - name: "Run Benchmark" run: | docker run -v "`pwd`:/opt/src" -w "/opt/src" "phpseclib/php7.4" php test.php timeout-minutes: 10
原因分析
- 并发作业超限:GitHub Actions对免费版仓库有并发作业限制,你的Matrix包含18个PHP版本,会同时启动18个作业,超出平台分配的并发配额,系统自动取消作业释放资源。
- 镜像拉取限流:短时间内批量拉取大量Docker镜像,会被Docker Hub或quay.io的限流机制拦截,导致拉取中断,触发工作流取消。
- 未设置并发控制:默认情况下Matrix会并行运行所有作业,无任何并发限制时,资源争抢会触发平台的终止机制。
解决办法
- 限制并发数:在Matrix的strategy中添加
max-parallel参数,控制同时运行的作业数量,比如设置为4:strategy: matrix: PHP_VERSION: [ ... ] max-parallel: 4 - 优化镜像拉取:给镜像拉取命令添加重试逻辑,避免单次失败导致作业取消,比如:
if [[ "${{ matrix.PHP_VERSION }}" == "8"* ]]; then docker pull "quay.io/phpseclib/php${{ matrix.PHP_VERSION }}" || docker pull "quay.io/phpseclib/php${{ matrix.PHP_VERSION }}" || docker pull "quay.io/phpseclib/php${{ matrix.PHP_VERSION }}" docker image tag "quay.io/phpseclib/php${{ matrix.PHP_VERSION }}" "phpseclib/php${{ matrix.PHP_VERSION }}" else docker pull "phpseclib/php${{ matrix.PHP_VERSION }}" || docker pull "phpseclib/php${{ matrix.PHP_VERSION }}" || docker pull "phpseclib/php${{ matrix.PHP_VERSION }}" fi - 拆分工作流:把PHP版本按大版本(如4.x/5.x、7.x、8.x)拆分成多个独立工作流,避免一次性启动过多作业。
- 检查配额:在仓库的Actions设置页面查看当前并发配额,确认是否需要调整或升级。
内容的提问来源于stack exchange,提问作者neubert
相关产品推荐
相关产品推荐

