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

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

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

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

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

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

```yaml
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](/ru/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategymatrix).

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

Чтобы создать матрицы с информацией о запусках рабочих процессов, переменных, средах выполнения, заданиях и шагах, доступ к контекстам с помощью синтаксиса `${{ <context> }}` выражения. Дополнительные сведения о контекстах см. в разделе [Справочник по контекстам](/ru/actions/reference/workflows-and-actions/contexts).

Например, следующий рабочий процесс активирует событие `repository_dispatch` и использует сведения из его полезных данных для построения матрицы. При создании события диспетчеризации репозитория с полезными данными, как показано ниже, переменная `version` матрицы будет иметь значение `[12, 14, 16]`. Дополнительные сведения об триггере `repository_dispatch` см. в разделе [События, инициирующие рабочие процессы](/ru/actions/reference/workflows-and-actions/events-that-trigger-workflows#repository_dispatch).

```json
{
  "event_type": "test",
  "client_payload": {
    "versions": [12, 14, 16]
  }
}
```

```yaml
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@v7
        with:
          node-version: ${{ matrix.version }}
```

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

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

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

```yaml
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](/ru/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategymatrixinclude).

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

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

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

```yaml
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](/ru/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategymatrixexclude)

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

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

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

```yaml copy
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@v5
      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` другие задания не будут затронуты.

```yaml
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`](/ru/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategyfail-fast) . и [`jobs.<job_id>.continue-on-error`](/ru/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idcontinue-on-error).

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

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

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

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

Справочные сведения см. в разделе [Синтаксис рабочего процесса для GitHub Actions](/ru/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstrategymax-parallel).