Контексты и выражения
Учимся читать и писать выражения ${{ ... }} — язык, на котором 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скобки можно опускать.