Сведения о стратегиях матрицы
Стратегия матрицы позволяет использовать переменные в одном определении задания для автоматического создания нескольких выполнений заданий, основанных на сочетаниях переменных. Например, можно использовать стратегию матрицы для тестирования кода в нескольких версиях языка или в нескольких операционных системах.
Добавление стратегии матрицы в задание рабочего процесса
Используйте 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
Использование выходных данных для определения двух матриц
Выходные данные из одного задания можно использовать для определения матриц для нескольких заданий.
Например, в следующем рабочем процессе показано, как определить матрицу значений в одном задании, использовать эту матрицу во втором задании для создания артефактов, а затем использовать эти артефакты в третьем задании. Каждый артефакт связан со значением из матрицы.
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@v3
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@v3
with:
name: ${{ matrix.color }}
- name: Report Color
run: |
cat color
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@v3
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@v3
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.