Контексты и выражения

Учимся читать и писать выражения ${{ ... }} — язык, на котором workflow «думает».

Выражение в двойных фигурных скобках ${{ ... }} вычисляется GitHub перед запуском шага и подставляет результат в YAML.

Что такое контексты

Контекст — это набор данных о текущем запуске, доступный через выражения. Самые полезные:

КонтекстЧто внутри
githubсобытие, ветка, автор, SHA, имя репозитория
envпеременные окружения
secretsсекреты
varsпеременные
matrixтекущие значения осей матрицы
runnerОС и окружение runner

Полезные поля github

- run: |
    echo "Ветка: ${{ github.ref_name }}"
    echo "Событие: ${{ github.event_name }}"
    echo "Коммит: ${{ github.sha }}"
    echo "Автор: ${{ github.actor }}"
    echo "Репозиторий: ${{ github.repository }}"

Эти поля незаменимы: по github.event_name различают push и PR, по github.ref_name — текущую ветку или тег.

Операторы и функции

Внутри ${{ }} доступны сравнения (==, !=), логика (&&, ||, !) и встроенные функции:

contains(a, b)содержит ли a подстроку/элемент b
startsWith(s, p)начинается ли строка s с p
hashFiles(path)хеш по файлам (для ключей кэша)
format(tpl, ...)подстановка в шаблон

Выражения в условиях

Чаще всего выражения встречаются в if:. Здесь скобки ${{ }} можно опускать — поле if всегда трактуется как выражение:

- name: Только на main
  if: github.ref_name == 'main'
  run: echo "Это основная ветка"

- name: Только для тегов-релизов
  if: startsWith(github.ref, 'refs/tags/v')
  run: echo "Это релизный тег"

Где вычисляется

Выражения раскрываются до запуска команды, на стороне GitHub. То есть к моменту работы shell вместо ${{ github.sha }} уже стоит конкретный хеш. Не путайте это с переменными shell вроде $HOME, которые раскрывает уже оболочка во время выполнения.

Итог

  • Контексты (github, env, secrets, vars, matrix, runner) дают данные о запуске.
  • В ${{ }} работают операторы и функции (contains, startsWith, hashFiles).
  • Выражения вычисляются GitHub до запуска shell; в if скобки можно опускать.
Проверьте себя
1. Что содержит контекст github?
AТолько секреты репозитория
BДанные о текущем запуске: событие, ветку, автора, SHA, имя репозитория
CСписок установленных пакетов
DКэш зависимостей
2. Когда вычисляются выражения ${{ ... }}?
AВо время выполнения shell-команды
BGitHub раскрывает их до запуска шага, подставляя готовое значение в YAML
CТолько после завершения job
DНикогда, это просто строки
3. Какая функция проверит, что ref начинается с refs/tags/v (релизный тег)?
Acontains(github.ref, 'v')
BstartsWith(github.ref, 'refs/tags/v')
CendsWith(github.ref, 'v')
Dgithub.ref == 'v'
Поддержать проект