Команды run и переменные env

Учимся выполнять собственные команды и передавать им настройки через окружение.

Ключ run выполняет команды в shell runner; env задаёт переменные окружения, доступные этим командам.

Одна команда и много команд

Простой случай — одна команда в строке:

- run: npm test

Несколько команд оформляют блоком через символ | (literal в YAML):

- name: Сборка
  run: |
    npm ci
    npm run build
    echo "Готово"

Команды в одном run выполняются в одном shell-процессе и падают на первой же ошибке (по умолчанию включён set -e для bash).

Рабочая директория и shell

По умолчанию команды выполняются в корне склонированного репозитория. Можно сменить директорию и оболочку:

- run: pytest
  working-directory: backend
  shell: bash

Переменные окружения

env можно задать на трёх уровнях, от широкого к узкому:

УровеньГде действует
workflowво всех jobs и steps
jobво всех steps этого job
stepтолько в этом шаге
env:
  NODE_ENV: production        # уровень workflow

jobs:
  test:
    runs-on: ubuntu-latest
    env:
      CI: "true"              # уровень job
    steps:
      - run: echo "$NODE_ENV / $CI"
      - run: npm test
        env:
          LOG_LEVEL: debug     # уровень step

Более узкий уровень перекрывает более широкий, если имена совпадают. Обращение к переменной в shell — обычное: $NAME (bash) или %NAME% (cmd).

Передача значения между шагами

Чтобы один шаг «сообщил» значение следующему, пишут в специальный файл $GITHUB_ENV:

- run: echo "VERSION=1.4.2" >> "$GITHUB_ENV"
- run: echo "Версия — $VERSION"

Так значение, вычисленное в первом шаге, становится переменной окружения во всех последующих шагах того же job.

Итог

  • run запускает команды; многострочный блок — через |.
  • env работает на уровне workflow/job/step; узкий уровень перекрывает широкий.
  • Передать значение следующим шагам можно записью в $GITHUB_ENV.
Проверьте себя
1. Как в одном шаге run выполнить несколько команд?
AИспользовать блок run: | и писать команды построчно
BПеречислить их через запятую
CСоздать отдельный job на каждую команду
DЭто невозможно, только одна команда на step
2. На каких уровнях можно задавать переменные env?
AТолько на уровне workflow
Bworkflow, job и step, причём узкий уровень перекрывает широкий
CТолько внутри секретов
DТолько через actions/checkout
3. Как передать вычисленное значение из одного шага в последующие шаги job?
AСохранить в обычную переменную bash
BЗакоммитить его в репозиторий
CЗаписать его в файл $GITHUB_ENV
DПередать через runs-on