• github
  • автоматизация

Автоматически перезапускать ваш GitHub workflow после сбоя

Иногда ваш workflow GitHub Actions ведет себя капризно и терпит неудачу по случайным причинам. Давайте посмотрим, как вы можете автоматически перезапустить его, чтобы сэкономить ваше время.

Gao
Gao
Founder

Введение

Мы любим GitHub Actions. Он мощный и предлагает щедрый бесплатный уровень.

По мере роста нашего проекта мы добавили все больше и больше интеграционных тестов для запуска в нашем workflow GitHub Actions. Как и другие крутые проекты, мы запускаем тесты для каждого pull request, push и release.

Однако, из-за природы интеграционных тестов, иногда наш workflow терпит неудачу по случайным причинам. Это может быть проблема с сетью, сбой браузера или другие трудновоспроизводимые причины.

Когда workflow терпит неудачу, нам приходится вручную перезапускать его. Вначале это не так уж и важно, но для высокоэффективных разработчиков, таких как мы, это все равно раздражает.

Как это работает

На момент написания GitHub Actions не предоставляет встроенного способа автоматического перезапуска неудавшегося workflow. Давайте разберем это и посмотрим, как мы можем этого достичь.

Когда workflow НЕ запущен и завершился с ошибкой, вы можете вручную перезапустить его, нажав кнопку "Re-run jobs". Откроется меню с выпадающим списком, в котором есть приятная опция "Re-run failed jobs", которая позволяет пропустить успешные задачи.

Итак, идея простая:

  1. Нам нужно обнаружить, когда workflow завершился с ошибкой.
  2. Нам нужно запустить действие по повторному запуску ПОСЛЕ завершения workflow.

Очевидно, что мы не можем сделать это в том же workflow, потому что workflow не может ничего сделать, когда он не запущен. Поэтому нам нужен другой workflow, который будет отслеживать статус предыдущего workflow и запускать действие по его перезапуску. Это можно проиллюстрировать следующим образом:

Обновите свои workflows

Создайте новый файл 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 перезапуска с ветки, которая потерпела неудачу

Если вы хотите запустить workflow перезапуска с ветки, которая потерпела неудачу, а не с ветки по умолчанию, вы можете использовать следующую команду:

Контекст github.head_ref будет использован, если это pull request, иначе будет использован github.ref_name.

Благодарности

Идея данного подхода взята из этого комментария к обсуждению на GitHub.