Автоматизация процессов CI/CD в GitHub Actions — это не просто последовательный запуск команд. Настоящая магия начинается тогда, когда вы учитесь гибко управлять потоком выполнения задач (Jobs) и отдельных шагов (Steps) в зависимости от их статуса.
В этой статье мы разберем, как использовать функции проверки статуса, чтобы ваши пайплайны стали «умными»: умели отправлять уведомления при ошибках, выполнять очистку ресурсов в любом случае или запускать специфические скрипты при отмене процесса.
Зачем управлять статусом шагов?
По умолчанию GitHub Actions выполняет шаги один за другим. Если один из шагов завершается ошибкой, выполнение джоба прерывается, и все последующие шаги пропускаются. Однако в реальной разработке часто требуется иное поведение:
- Очистка данных: Удаление временных файлов или остановка контейнеров, даже если тесты упали.
- Логирование: Отправка сообщения в Slack или Telegram именно в случае сбоя.
- Условный деплой: Запуск деплоя только при условии успешного прохождения всех проверок.
Основные функции проверки статуса
Для реализации сложной логики в GitHub Actions предусмотрено условие if, внутри которого используются специальные функции.
1. success() — Поведение по умолчанию
Функция success() возвращает true, если все предыдущие шаги завершились успешно. Интересный факт: если вы не указываете условие if у шага, GitHub автоматически подразумевает if: success().
2. always() — Выполнить во что бы то ни стало
Эта функция заставляет шаг выполняться даже в том случае, если один из предыдущих шагов упал с ошибкой или выполнение было отменено. Это идеально подходит для шагов «Post-cleanup» или генерации отчетов.
3. failure() — Обработка ошибок
Возвращает true, если любой из предыдущих этапов текущего джоба завершился неудачей. Именно эту функцию мы используем для уведомлений об ошибках:
- name: Send Slack Notification on Failure
if: failure()
run: ./send-error-report.sh
4. cancelled() — Ручная отмена
Функция срабатывает только в том случае, если выполнение workflow было прервано вручную (например, нажатием кнопки «Cancel workflow» в интерфейсе GitHub).
Практические примеры использования
Условное выполнение между Jobs
Функции статуса можно применять не только к шагам, но и к целым задачам. Допустим, у нас есть основной Job сборки, и мы хотим запустить «запасной» Job, если основной провалился. Для этого используется ключ needs:
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: make build
rollback:
runs-on: ubuntu-latest
needs: build
if: failure()
steps:
- run: echo "Запуск процесса отката..."
Проверка конкретного шага через context
Иногда нужно проверить на ошибку не «любой предыдущий шаг», а конкретный. Для этого шагу присваивается id, а затем проверяется его свойство conclusion:
steps:
- name: Run Tests
id: test_step
run: npm test
- name: Specific Error Handling
if: steps.test_step.conclusion == 'failure'
run: echo "Ошибка произошла именно в тестах!"
Важно: При такой проверке в условии if также должна присутствовать одна из статусных функций (обычно failure()), иначе логика GitHub по умолчанию может переопределить поведение.
Дополнительные функции: JSON и Форматирование
Помимо статусов, в арсенале GitHub Actions есть функции для работы с данными:
toJSON()— преобразует объект контекста в строку JSON (полезно для отладки).format()— позволяет подставлять значения в строки.contains(),startsWith(),endsWith()— для работы со строковыми условиями.
Заключение
Освоение функций if, success(), always() и failure() — это переход от простых линейных скриптов к созданию отказоустойчивых и гибких систем автоматизации. Правильное использование этих инструментов позволяет экономить время команды и гарантирует, что критические действия (вроде очистки или уведомлений) будут выполнены при любом исходе сборки.

