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