В нашем проекте мы хотим:
все ветки 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 для правильной базовой ветки?
Я не уверен, что понял ваш вопрос, но было бы это нормально: 1. Проверьте, есть ли регулярное выражение dev maches. Если да, проверьте, равна ли цель pull_request dev. Если да - рабочий процесс пройден, если нет... 2. проверьте, соответствует ли ветка регулярному выражению qa. Ifo, поэтому проверьте, является ли его целью ветка qa. Если да - прошло. Если нет... 3. Сбой рабочего процесса.
@BenjaminW. да, я это видел, но у нас нет Enterprise, поэтому я ищу обходной путь с помощью Actions вручную — и кажется, что это возможно!
@ravenwing Да, я согласен. Как мне это сделать в файле YAML? Или, возможно, есть лучший способ сделать это, которого нет в действиях YAML/github?





Я создал здесь репозиторий, который демонстрирует один из многих способов сделать это. ЗДЕСЬ
Settings -> rules -> rulesetrulset -> new branch rulesetsRequire status checks to pass -> name it whatever -> chose github actionsНо по сути это этот код:
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
Хорошо, кажется, все работает нормально, но когда я проводил тест с веткой с именем kickback/DTD-123-testing-pr-integration на ветке dev, похоже, он попадает в мой последний блок else вместо того, чтобы соответствовать qa_regex и выдает мне сообщение о том, что он не основан на qa ветвь. Что я делаю не так?
Догадаться. Я не могу использовать \d в шаблонах регулярных выражений bash, вместо этого мне приходится использовать [0-9]
Спасибо, что поделились своими исправлениями. Обновлено соответственно!