Github Action, как вызывать триггер только при пуше и не вызывать его при слиянии веток после Pull Request

Вопрос или проблема

У меня есть рабочий процесс 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

Пояснение

  1. Триггер on: push – Этот триггер будет запускать рабочий процесс при каждом push в ветку test.

  2. Условие 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, где важно избегать избыточных сборок при частых слияниях веток. Если у вас есть дополнительные вопросы или требуется дальнейшая помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...