Обработка срочных запросов на слияние с использованием очередей слияний

Обработка экстренных 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.

Shell

 

mkdir emergency-pr-demo
cd emergency-pr-demo
git init
npx create-react-app .

Для справки, вот как будет выглядеть наша финальная структура проекта после добавления нашей CI и конфигурации Mergify.

YAML

 

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.

YAML

 

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

YAML

 

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. 

После этого нам нужно будет сделать первоначальный коммит и отправить наш код с помощью следующих команд:

Shell

 

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

Shell

 

git checkout -b regular-pr
git add .

Для демонстрационных целей мы добавим класс в файл App.css.

CSS

 

.Regular-change-class {
    background-color: white;
}

После этого мы сделаем коммит и отправим наши изменения на GitHub. 

Shell

 

git commit -m 'regular CSS change'
git push --set-upstream origin regular-pr

Далее мы создадим запрос на вытягивание (Pull Request) без каких-либо тегов.

Создание второго ПР (Срочный ПР)

Теперь мы создадим новую ветку urgent-pr для наших изменений.

Shell

 

git checkout main
git branch -b urgent-pr

Сначала мы сделаем коммит, где создадим новый компонент Urgent.js.

JavaScript

 

import React from "react";

export default function Urgent() {
  return <div>This is an Urgent Change</div>;
}

Затем мы отправим эту (urgent-pr) ветку в наш репозиторий на GitHub.

Shell

 

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