Автоматически перезапускать ваш GitHub workflow после сбоя
Иногда ваш workflow GitHub Actions ведет себя капризно и терпит неудачу по случайным причинам. Давайте посмотрим, как вы можете автоматически перезапустить его, чтобы сэкономить ваше время.
Иногда ваш workflow GitHub Actions ведет себя капризно и терпит неудачу по случайным причинам. Давайте посмотрим, как вы можете автоматически перезапустить его, чтобы сэкономить ваше время.
Мы любим GitHub Actions. Он мощный и предлагает щедрый бесплатный уровень.
По мере роста нашего проекта мы добавили все больше и больше интеграционных тестов для запуска в нашем workflow GitHub Actions. Как и другие крутые проекты, мы запускаем тесты для каждого pull request, push и release.
Однако, из-за природы интеграционных тестов, иногда наш workflow терпит неудачу по случайным причинам. Это может быть проблема с сетью, сбой браузера или другие трудновоспроизводимые причины.
Когда workflow терпит неудачу, нам приходится вручную перезапускать его. Вначале это не так уж и важно, но для высокоэффективных разработчиков, таких как мы, это все равно раздражает.
На момент написания GitHub Actions не предоставляет встроенного способа автоматического перезапуска неудавшегося workflow. Давайте разберем это и посмотрим, как мы можем этого достичь.
Когда workflow НЕ запущен и завершился с ошибкой, вы можете вручную перезапустить его, нажав кнопку "Re-run jobs". Откроется меню с выпадающим списком, в котором есть приятная опция "Re-run failed jobs", которая позволяет пропустить успешные задачи.
Итак, идея простая:
Очевидно, что мы не можем сделать это в том же workflow, потому что workflow не может ничего сделать, когда он не запущен. Поэтому нам нужен другой workflow, который будет отслеживать статус предыдущего workflow и запускать действие по его перезапуску. Это можно проиллюстрировать следующим образом:
Создайте новый файл workflow в своем репозитории, например, .github/workflows/rerun.yml:
Благодаря GitHub CLI, мы можем легко отслеживать статус workflow и перезапускать его с помощью двух простых команд:
gh run watch для отслеживания статуса workflow (документация здесь).gh run rerun для перезапуска workflow. Флаг --failed перезапустит только неудавшиеся задачи (документация здесь).Все, что вам нужно сделать, это указать run_id неудавшегося workflow, что можно сделать, используя контекст github.run_id. Например, вы можете запустить workflow перезапуска, добавив следующий шаг в свой оригинальный workflow:
Условие if: failure() вызовет выполнение этого шага только в случае, если задача завершилась неудачей. Условие fromJSON(github.run_attempt) < 3 вызовет перезапуск только для первых 2 попыток. Вы можете настроить количество в соответствии с вашими потребностями.
Этот шаг использует команду gh workflow run для запуска workflow перезапуска. Ознакомьтесь с документацией для получения более подробной информации.
Если вы хотите запустить workflow перезапуска с ветки, которая потерпела неудачу, а не с ветки по умолчанию, вы можете использовать следующую команду:
Контекст github.head_ref будет использован, если это pull request, иначе будет использован github.ref_name.
Идея данного подхода взята из этого комментария к обсуждению на GitHub.