Вопрос или проблема
У меня есть рабочий процесс GitHub, который срабатывает при пуше. Если существует PR и ветка объединена, я не хочу, чтобы он срабатывал. Нужен совет, как это сделать.
Мой текущий код ниже не работает, потому что github.event.pull_request.merged применим или имеет значение только когда триггер — это PR.
on:
push:
branches:
- test
jobs:
do_not_run_on_merged:
if: (github.event.pull_request.merged == false)
runs-on: ubuntu-latest
steps:
- run: |
echo Это не объединение
Вы можете использовать github.ref
—
Если это merge
, ref
будет refs/pr_num/merge
, для любого другого push
это будет refs/heads/test
, так что вы можете с этим работать.
# Вы можете использовать:
if: "contains(github.ref, '/merge')"
# Или:
if: "!contains(github.ref, 'refs/heads/test')"
Ответ или решение
Вопрос о том, как настроить GitHub Actions таким образом, чтобы триггер срабатывал только при нормальном push
, а не при слиянии ветки после создания pull-request, является распространенной задачей среди разработчиков. Давайте разберем это решение более подробно.
Проблема
Ваша текущая конфигурация триггера on: push
запускает рабочий процесс каждый раз, когда происходит push
в указанную ветку (в вашем случае в ветку test
). Однако, если слияние (merge) с pull-request’ом происходит в ту же ветку, GitHub также считает этот шаг за push
, что и вызывает нежелательное поведение вашего рабочего процесса.
Решение
Для того чтобы триггер срабатывал только на обычный push
(не связанный с слиянием pull-requestа), вам необходимо использовать переменные, такие как github.ref
, чтобы затем проверить, является ли push
результатом слияния ветки.
Настройка конфигурации
Вот как можно обновить ваш YAML-файл для GitHub Actions:
on:
push:
branches:
- test
jobs:
do_not_run_on_merged:
if: "!contains(github.ref, 'refs/pull/')"
runs-on: ubuntu-latest
steps:
- run: |
echo This is not a merge
Пояснение
-
Триггер
on: push
– Этот триггер будет запускать рабочий процесс при каждомpush
в веткуtest
. -
Условие
if
– Мы добавляем условие, которое проверяет, чтоgithub.ref
не содержитrefs/pull/
. Это позволит избежать выполнения задания, когдаpush
является результатом слияния pull-requestа. Таким образом, еслиpush
связан с merge, он будет пропущен.
Альтернативный подход
Другой вариант проверки состоит в использовании проверки на наличие строки /merge
в github.ref
. Это может выглядеть следующим образом:
if: "!contains(github.ref, '/merge')"
Такое условие также будет работать должным образом, так как имя ветки, созданной для merge, обычно имеет такой формат.
Итог
С помощью данной настройки, ваш рабочий процесс будет отрабатывать при каждом push
в ветку test
, кроме тех случаев, когда это push
вызван слиянием pull-requestа. Это простое, но эффективное решение, которое позволит вам контролировать выполнение ваших действий в GitHub Actions более точно.
Заключение
Надеюсь, это руководство поможет вам корректно настроить ваши GitHub Actions в соответствии с вашими желаниями. Это решение удобно использовать в процессе CI/CD, где важно избегать избыточных сборок при частых слияниях веток. Если у вас есть дополнительные вопросы или требуется дальнейшая помощь, не стесняйтесь обращаться!