Обработка экстренных pull requests вызывала споры в сообществе разработчиков с появлением практик Agile и DevOps.
В таких ситуациях нам нужна система, которая может ставить эти ‘срочные’ запросы выше обычных PR и позволяет отложить некоторые проверки CI, если это необходимо.
Один из хороших подходов может заключаться в создании отдельной очереди слияния, которая позволяет опередить основную очередь, даже если тесты CI еще не прошли, и ускорить наши срочные исправления в производство.
В этой статье мы создадим две очереди слияния с использованием Mergify, активируемого метками PR. Мы настроим одну для обычных PR, а другую для экстренных PR.
Так что давайте приступим!
Для этой демонстрации мы собираемся начать с простого приложения React
. И для CI мы будем использовать CircleCI
.
Мы создадим две очереди слияния:
default
: Все PR будут проходить через нее регулярно. Она требует проверкиCircleCI
перед обработкой.urgent
: Эта очередь предназначена только для PR, которые имеют меткуurgent label
в PR. Это позволяет PR перепрыгнуть в начало PR вdefault queue
без запуска проверок CircleCI.
С такой конфигурацией pull request с меткой urgent
попадет в очередь до того, как CI даже запустится на нем.
Он будет впереди основной очереди. Mergify обновит pull request с его базовым веткой при необходимости, подождет, пока CI пройдет, и затем объединит pull request.
С точки зрения команды разработчиков тоже, это довольно простой процесс. Разработчик просто должен добавить метку urgent
при создании PR, чтобы ускорить процесс.
Настройка Нашего Проекта
Давайте начнем с настройки нашего проекта. Мы создадим новый реакт-приложение с помощью create-react-app
.
mkdir emergency-pr-demo
cd emergency-pr-demo
git init
npx create-react-app .
Для справки, вот как будет выглядеть наша финальная структура проекта после добавления нашей CI и конфигурации Mergify.
emergency-pr-demo/
├── .circleci
│ └── config.yml
├── README.md
├── package-lock.json
├── package.json
├── .gitignore
├── .mergify.yml
├── .vscode
├── public
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── robots.txt
└── src
├── App.css
├── App.js
├── App.test.js
├── index.css
├── index.js
├── logo.svg
├── reportWebVitals.js
└── setupTests.js
Создание Конфигурации CI
Для запуска наших тестов мы будем использовать CircleCI. Он легко настроить и начать работать с ним.
Здесь мы создадим файл config.yml
в новой директории .circleci
в корне нашего проекта.
Мы создадим простой job build_and_test
, который сначала поможет нам проверить, успешно ли собирается наш проект, а затем запустит unit тесты с помощью команды npm run test
.
version: 2.1
orbs:
node: circleci/[email protected]
jobs:
build_and_test:
executor: node/default
steps:
- checkout
- node/install-packages:
pkg-manager: npm
- run:
command: npm run test
name: Run tests
- run:
command: npm run build
name: Build app
- persist_to_workspace:
root: ~/project
paths:
- .
workflows:
test_my_app:
jobs:
- build_and_test
.circleci/config.yml
Создание Конфигурации Mergify
Теперь пришло время создать наш файл конфигурации Mergify.
Mergify – это инструмент, который автоматизирует процесс слияния pull запросов в репозиториях кода на основе предопределенных правил и условий.
Нам нужно определить две очереди в нашем файле конфигурации, как планировалось: urgent
и default
.
Оба имеют одинаковые merge_conditions, check-success=ci/circleci: build_and_test
, что означает, что код должен успешно пройти проверку build_and_test
в CircleCI
перед тем, как его можно будет слить.
Раздел pull_request_rules
описывает, как обрабатывать запросы на вытягивание. Мы поместим наш PR в очередь urgent
, если он имеет метку urgent. В противном случае он попадет в стандартную очередь.
.mergify.yml
queue_rules:
- name: urgent
merge_conditions:
- "check-success=ci/circleci: build_and_test"
- name: default
merge_conditions:
- "check-success=ci/circleci: build_and_test"
pull_request_rules:
- name: move to urgent queue when label urgent
conditions:
- base=main
- label=urgent
actions:
queue:
name: urgent
- name: merge using the default queue after running the CI checks
conditions:
- base=main
- "check-success=ci/circleci: build_and_test"
- label!=urgent
actions:
queue:
name: default
Настройка Репозитория
Нет, мы пойдем дальше и создадим новый репозиторий на GitHub.
После этого нам нужно будет сделать первоначальный коммит и отправить наш код с помощью следующих команд:
git add .
git commit -m "Initial commit"
git remote add origin <REPO_URL>
git push -u origin master
Далее нам нужно настроить CircleCI. Для этого мы посетим Панель управления CircleCI, затем перейдем в раздел проектов и настроим наш проект.
Нам также нужно указать нашу main
ветку. В этом случае CircleCI автоматически обнаружит наш config
файл.
Мы можем установить Mergify в нашем аккаунте GitHub, посетив dashboard.mergify.com или github.com/apps/mergify/installations/new и войдя в систему с нашим аккаунтом GitHub.
Затем мы можем выбрать репозитории, к которым хотим предоставить доступ Mergify.
После настройки мы сможем видеть обе наши очереди в Панели управления Mergify.
Создание первого ПР (Обычный ПР)
Теперь давайте приступим к созданию нашего первого ПР. Сначала мы создадим новую ветку regular-pr
git checkout -b regular-pr
git add .
Для демонстрационных целей мы добавим класс в файл App.css
.
.Regular-change-class {
background-color: white;
}
После этого мы сделаем коммит и отправим наши изменения на GitHub.
git commit -m 'regular CSS change'
git push --set-upstream origin regular-pr
Далее мы создадим запрос на вытягивание (Pull Request) без каких-либо тегов.
Создание второго ПР (Срочный ПР)
Теперь мы создадим новую ветку urgent-pr
для наших изменений.
git checkout main
git branch -b urgent-pr
Сначала мы сделаем коммит
, где создадим новый компонент Urgent.js
.
import React from "react";
export default function Urgent() {
return <div>This is an Urgent Change</div>;
}
Затем мы отправим эту (urgent-pr
) ветку в наш репозиторий на GitHub.
git add .
git commit -m 'Create a component for Urgent change'
git push --set-upstream origin urgent-pr
После этого мы перейдем в наш репозиторий и создадим новый ПР из ветки urgent-pr
в ветку main
и добавим новый лейбл urgent
.
Mergify автоматически помещает второй ПР в очередь urgent
и запускает проверки CI, затем сливает его с веткой main
.
Затем он автоматически сливает первый ПР.
Вы можете ознакомиться с репозиторием на GitHub здесь для справки: github.com/hugoescafit/emergency-pr-demo
Заключение
Вот и все на этот раз!
В этом уроке мы изучили процесс настройки двух различных очередей слияния, по умолчанию и срочных, с помощью Mergify и настройки проверок CI с помощью CircleCI. Также мы увидели, как устанавливать приоритет над срочными pull-запросами по сравнению с обычными.
Существует множество других решений для управления срочными pull-запросами, таких как создание специального ветки hotfix для этого, наличие специальных рецензентов и даже ручное отключение проверок. Но очереди слияния являются одним из лучших и легко реализуемых стратегий для решения этой проблемы.
Посетите Mergify, чтобы начать добавлять очереди слияния в ваше приложение!
Source:
https://dzone.com/articles/handling-emergency-pull-requests-using-merge-queue