Skip to main content

Выполнение вариантов заданий в рабочем процессе

Создайте матрицу для определения вариантов для каждого задания.

Сведения о стратегиях матрицы

Стратегия матрицы позволяет использовать переменные в одном определении задания для автоматического создания нескольких выполнений заданий, основанных на сочетаниях переменных. Например, можно использовать стратегию матрицы для тестирования кода в нескольких версиях языка или в нескольких операционных системах.

Добавление стратегии матрицы в задание рабочего процесса

Используйте jobs.<job_id>.strategy.matrix для создания матрицы различных конфигураций заданий В матрице определите одну или несколько переменных, за которыми следует массив значений. Например, в указанной ниже матрице есть переменная под именем version со значением [10, 12, 14] и переменная под именем os со значением [ubuntu-latest, windows-latest]:

jobs:
  example_matrix:
    strategy:
      matrix:
        version: [10, 12, 14]
        os: [ubuntu-latest, windows-latest]

Задание будет выполняться для каждой возможной комбинации переменных. В этом примере рабочий процесс будет выполнять шесть заданий, по одному для каждой комбинации переменных os и version.

Приведенная выше матрица создаст задания в следующем порядке.

  • {version: 10, os: ubuntu-latest}
  • {version: 10, os: windows-latest}
  • {version: 12, os: ubuntu-latest}
  • {version: 12, os: windows-latest}
  • {version: 14, os: ubuntu-latest}
  • {version: 14, os: windows-latest}

Справочные сведения и примеры см. в разделе Синтаксис рабочего процесса для GitHub Actions.

Использование контекстов для создания матриц

Чтобы создать матрицы с информацией о запусках рабочих процессов, переменных, средах выполнения, заданиях и шагах, доступ к контекстам с помощью синтаксиса выражения ${{ <context> }} . Дополнительные сведения о контекстах см. в разделе Справочник по контекстам.

Например, следующий рабочий процесс активирует событие repository_dispatch и использует сведения из его полезных данных для построения матрицы. При создании события диспетчеризации репозитория с полезными данными, как показано ниже, переменная version матрицы будет иметь значение [12, 14, 16]. Дополнительные сведения об триггере repository_dispatch см. в разделе События, инициирующие рабочие процессы.

{
  "event_type": "test",
  "client_payload": {
    "versions": [12, 14, 16]
  }
}
on:
  repository_dispatch:
    types:
      - test
 
jobs:
  example_matrix:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        version: ${{ github.event.client_payload.versions }}
    steps:
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.version }}

Развертывание или добавление конфигураций матрицы

Чтобы развернуть существующие конфигурации матрицы или добавить новые конфигурации, используйте jobs.<job_id>.strategy.matrix.include. Значение include является списком объектов.

Например, рассмотрим следующую матрицу.

strategy:
  matrix:
    fruit: [apple, pear]
    animal: [cat, dog]
    include:
      - color: green
      - color: pink
        animal: cat
      - fruit: apple
        shape: circle
      - fruit: banana
      - fruit: banana
        animal: cat

Это приведет к шести заданиям со следующими сочетаниями матриц.

  • {fruit: apple, animal: cat, color: pink, shape: circle}
  • {fruit: apple, animal: dog, color: green, shape: circle}
  • {fruit: pear, animal: cat, color: pink}
  • {fruit: pear, animal: dog, color: green}
  • {fruit: banana}
  • {fruit: banana, animal: cat}

Каждая include запись была применена следующим образом.

  • {color: green} добавляется ко всем исходным комбинациям матриц, так как его можно добавить без перезаписи любой части исходных комбинаций.
  • {color: pink, animal: cat} добавляет color:pink только к исходным комбинациям матриц, которые включают animal: cat. Это перезаписывает color: green, добавленный предыдущей записью include.
  • {fruit: apple, shape: circle} добавляет shape: circle только к исходным комбинациям матриц, которые включают fruit: apple.
  • {fruit: banana} невозможно добавить ни в какую исходную комбинацию матриц без перезаписи значения, поэтому он добавляется в качестве дополнительной комбинации матриц.
  • {fruit: banana, animal: cat} невозможно добавить ни в какую исходную комбинацию матриц без перезаписи значения, поэтому он добавляется в качестве дополнительной комбинации матриц. Он не добавляется к комбинации матриц {fruit: banana}, так как эта комбинация не была одной из исходных комбинаций матриц.

Справочные и примеры конфигураций см. в разделе Синтаксис рабочего процесса для GitHub Actions.

Исключение конфигураций матрицы

Чтобы удалить конкретные конфигурации, определенные в матрице, используйте jobs.<job_id>.strategy.matrix.exclude.

Например, следующий рабочий процесс будет выполнять девять заданий: одно задание для каждой из 12 конфигураций, минус одно исключенное задание, которое совпадает с {os: macos-latest, version: 12, environment: production}, и два исключенных задания, которые совпадают с {os: windows-latest, version: 16}.

strategy:
  matrix:
    os: [macos-latest, windows-latest]
    version: [12, 14, 16]
    environment: [staging, production]
    exclude:
      - os: macos-latest
        version: 12
        environment: production
      - os: windows-latest
        version: 16
runs-on: ${{ matrix.os }}

Справочные сведения см. в разделе Синтаксис рабочего процесса для GitHub Actions

Использование выходных данных для определения двух матриц

Выходные данные из одного задания можно использовать для определения матриц для нескольких заданий.

Например, в следующем рабочем процессе показано, как определить матрицу значений в одном задании, использовать эту матрицу во втором задании для создания артефактов, а затем использовать эти артефакты в третьем задании. Каждый артефакт связан со значением из матрицы.

YAML
name: shared matrix
on:
  push:
  workflow_dispatch:

jobs:
  define-matrix:
    runs-on: ubuntu-latest

    outputs:
      colors: ${{ steps.colors.outputs.colors }}

    steps:
      - name: Define Colors
        id: colors
        run: |
          echo 'colors=["red", "green", "blue"]' >> "$GITHUB_OUTPUT"

  produce-artifacts:
    runs-on: ubuntu-latest
    needs: define-matrix
    strategy:
      matrix:
        color: ${{ fromJSON(needs.define-matrix.outputs.colors) }}

    steps:
      - name: Define Color
        env:
          color: ${{ matrix.color }}
        run: |
          echo "$color" > color
      - name: Produce Artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.color }}
          path: color

  consume-artifacts:
    runs-on: ubuntu-latest
    needs:
    - define-matrix
    - produce-artifacts
    strategy:
      matrix:
        color: ${{ fromJSON(needs.define-matrix.outputs.colors) }}

    steps:
    - name: Retrieve Artifact
      uses: actions/download-artifact@v4
      with:
        name: ${{ matrix.color }}

    - name: Report Color
      run: |
        cat color

Обработка сбоев

Чтобы управлять обработкой сбоев заданий, используйте jobs.<job_id>.strategy.fail-fast и jobs.<job_id>.continue-on-error.

Можно использовать jobs.<job_id>.strategy.fail-fast и jobs.<job_id>.continue-on-error совместно. Например, следующий рабочий процесс запустит четыре задания. Для каждого задания continue-on-error определяется значением matrix.experimental. При сбое любого из заданий с continue-on-error: false все выполняемые или помещенные в очередь задания будут отменены. При сбое задания с continue-on-error: true другие задания не будут затронуты.

jobs:
  test:
    runs-on: ubuntu-latest
    continue-on-error: ${{ matrix.experimental }}
    strategy:
      fail-fast: true
      matrix:
        version: [6, 7, 8]
        experimental: [false]
        include:
          - version: 9
            experimental: true

Справочные сведения см jobs.<job_id>.strategy.fail-fast . и jobs.<job_id>.continue-on-error.

Определение максимального числа параллельных заданий

Для настройки максимального числа заданий, которые могут выполняться одновременно при применении стратегии задания matrix, используйте jobs.<job_id>.strategy.max-parallel.

Например, следующий рабочий процесс будет выполнять не более двух заданий одновременно, даже если для одновременного выполнения всех шести заданий доступны средства выполнения.

jobs:
  example_matrix:
    strategy:
      max-parallel: 2
      matrix:
        version: [10, 12, 14]
        os: [ubuntu-latest, windows-latest]

Справочные сведения см. в разделе Синтаксис рабочего процесса для GitHub Actions.