Действия GitHub для обеспечения правильных названий ветвей и слияния связей с общественностью

В нашем проекте мы хотим:

  • все ветки git, созданные для нашей ветки dev, соответствуют этому регулярному выражению

    ^(bug|feature|code-cleanup)/JIRA-\d+-.+$
    

    примеры: bug/JIRA-123-fix-login-issue или code-cleanup/JIRA-4567-enable-code-linting

  • все ветки, созданные против нашей ветки qa, соответствуют этому регулярному выражению

    ^kickback/JIRA-\d+-.+$
    

    пример: kickback/JIRA-123-fix-login-issue-again

  • обеспечить, чтобы, если имя ветки начинается с kickback/, PR можно было сделать только против ветки qa.

Я нашел несколько действий GitHub, таких как nicklegan/github-repo-branch-naming-policy-action и deepakputhraya/action-branch-name, которые позволяют применять шаблон регулярных выражений глобального имени ветки, но это не кажется например, есть способ указать разные правила для разных баз ветвей. Если бы это было, позаботились бы о первых двух пунктах выше, но не о третьем.

Как я могу обеспечить выполнение этих проверок для проверки правильности имен ветвей и создания PR для правильной базовой ветки?

На ум приходят ограничения метаданных, но они доступны только на GitHub Enterprise.
Benjamin W. 20.02.2024 15:26

Я не уверен, что понял ваш вопрос, но было бы это нормально: 1. Проверьте, есть ли регулярное выражение dev maches. Если да, проверьте, равна ли цель pull_request dev. Если да - рабочий процесс пройден, если нет... 2. проверьте, соответствует ли ветка регулярному выражению qa. Ifo, поэтому проверьте, является ли его целью ветка qa. Если да - прошло. Если нет... 3. Сбой рабочего процесса.

ravenwing 20.02.2024 16:00

@BenjaminW. да, я это видел, но у нас нет Enterprise, поэтому я ищу обходной путь с помощью Actions вручную — и кажется, что это возможно!

Chris Barr 20.02.2024 16:35

@ravenwing Да, я согласен. Как мне это сделать в файле YAML? Или, возможно, есть лучший способ сделать это, которого нет в действиях YAML/github?

Chris Barr 20.02.2024 19:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
846
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я создал здесь репозиторий, который демонстрирует один из многих способов сделать это. ЗДЕСЬ

  1. Скопируйте код в свой рабочий процесс и настройте его под свои нужды.
  2. Зайдите в свой репо Settings -> rules -> ruleset
  3. Создать новый rulset -> new branch rulesets
  4. Установите целевые ветки для всех.
  5. Набор Require status checks to pass -> name it whatever -> chose github actions
  6. Сохраните и наслаждайтесь.

Но по сути это этот код:

name: Check Pull Request
on: pull_request

jobs:
  check_pr:
    runs-on: ubuntu-latest

    steps:
      - name: Check if PR target branch is ok
        run: |
          branch_name=${GITHUB_HEAD_REF}
          echo "pr branch name: $branch_name"
          
          target_branch=${GITHUB_BASE_REF}
          echo "target branch: $target_branch"
          dev_regex = "^(bug|feature|code-cleanup)/JIRA-[0-9]+.*$"
          qa_regex = "^kickback/JIRA-[0-9]+.*$"
          
          if [[ "$branch_name" =~ $dev_regex ]]; then
            echo "Branch name matches the first regex pattern."
            if [[ "$target_branch" != "dev" ]]; then
              echo "but doesn't match target branch"
              exit 1
            fi
          elif [[ "$branch_name" =~ $qa_regex ]]; then
            echo "Branch name matches the second regex pattern."
            if [[ "$target_branch" != "qa" ]]; then
              echo "but doesn't match target branch"
              exit 1
            fi
          else
            echo "Branch name does not match any regex. Exiting..."
            exit 1
          fi
        shell: bash

Это заняло у меня некоторое время, поэтому я мог допустить некоторые ошибки — если да, поделитесь, я их исправлю :)

Удивительно, спасибо вам огромное! Я не очень хорошо знаком со сценариями bash/shell, поэтому просто увидев это, я сэкономил массу времени на выяснении логики. По сути, я взял это и изменил для своих нужд, так как упустил несколько конкретных деталей в своем вопросе. (Одна незначительная вещь в вашем сценарии — это проверка шаблона QA, а затем проверка ветки dev, но вместо этого она должна проверять ветку qa.) Вот что я использую сейчас: gist.github.com/FiniteLooper/dcdbc18812964efb1db5c342c0fbaea‌​ 1

Chris Barr 21.02.2024 16:07

Хорошо, кажется, все работает нормально, но когда я проводил тест с веткой с именем kickback/DTD-123-testing-pr-integration на ветке dev, похоже, он попадает в мой последний блок else вместо того, чтобы соответствовать qa_regex и выдает мне сообщение о том, что он не основан на qa ветвь. Что я делаю не так?

Chris Barr 21.02.2024 17:14

Догадаться. Я не могу использовать \d в шаблонах регулярных выражений bash, вместо этого мне приходится использовать [0-9]

Chris Barr 21.02.2024 17:44

Спасибо, что поделились своими исправлениями. Обновлено соответственно!

ravenwing 22.02.2024 00:17

Другие вопросы по теме