Переиспользуемые workflow и composite actions

Перестаём копировать одинаковые шаги между репозиториями и workflow.

Reusable workflow — workflow, который можно вызвать из другого workflow как функцию, передав параметры и секреты.

Проблема дублирования

Когда у вас десяток репозиториев с одинаковым CI, копипаста YAML превращается в кошмар сопровождения: поправил в одном — забыл в девяти. Два инструмента борются с этим: переиспользуемые workflow и composite actions.

Reusable workflow

Объявляется через триггер workflow_call с описанием входов и секретов:

# .github/workflows/reusable-ci.yml
name: Reusable CI
on:
  workflow_call:
    inputs:
      node-version:
        type: string
        default: "20"
    secrets:
      NPM_TOKEN:
        required: false

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ inputs.node-version }}
      - run: npm ci
      - run: npm test

Вызов из другого workflow — через uses на уровне job:

# .github/workflows/ci.yml
jobs:
  call-ci:
    uses: ./.github/workflows/reusable-ci.yml
    with:
      node-version: "22"
    secrets:
      NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

Логика описана один раз, а используется во многих местах с разными параметрами.

Composite action

Если нужно переиспользовать группу шагов внутри job (а не целый job), подойдёт composite action — мини-экшен из нескольких steps. Его кладут в свой каталог с файлом action.yml:

# .github/actions/setup/action.yml
name: "Setup project"
description: "Checkout, Node и зависимости одной строкой"
runs:
  using: "composite"
  steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: "20"
    - run: npm ci
      shell: bash

Подключение — обычным uses с путём к каталогу:

steps:
  - uses: ./.github/actions/setup
  - run: npm test

Когда что

Reusable workflowпереиспользуете целые jobs, в т.ч. между репозиториями
Composite actionпереиспользуете группу steps внутри job

Итог

  • Reusable workflow вызывается как функция (workflow_call + uses на уровне job) с inputs и secrets.
  • Composite action группирует несколько шагов и подключается обычным uses.
  • Оба убирают копипасту: правка в одном месте — эффект везде.
Проверьте себя
1. Какой триггер делает workflow переиспользуемым (вызываемым из другого workflow)?
Aworkflow_dispatch
Bworkflow_call
Cschedule
Drepository_dispatch
2. В каком случае лучше использовать composite action, а не reusable workflow?
AКогда нужно переиспользовать целые jobs между репозиториями
BКогда нужно переиспользовать группу steps внутри одного job
CКогда нужно расписание
DКогда нужны секреты организации
3. Главная польза от переиспользования workflow и actions — это...
AУскорение интернета
BУстранение копипасты: правишь в одном месте, эффект во всех потребителях
CОтключение тестов
DШифрование логов
Поддержать проект