Behandeling van noodgevallen pull requests met behulp van merge queues

Het aanpakken van noodsituaties bij pull requests is al lange tijd een onderwerp van debat in de ontwikkelaarsgemeenschap sinds de komst van Agile en DevOps-praktijken.

In dergelijke scenario’s hebben we een systeem nodig dat deze ‘urgente’ verzoeken prioriteit geeft boven reguliere PR’s en ons in staat stelt sommige CI-controles indien nodig uit te stellen.

Een goede strategie kan zijn om een aparte merge-wachtrij in te voeren, waardoor we voor de standaardwachtrij kunnen gaan voordat de CI-tests zijn geslaagd en onze urgentie-fixes sneller kunnen doorvoeren naar productie.

In dit artikel gaan we twee merge-wachtrijen maken met Mergify die worden geactiveerd door PR-labels. We zullen er een configureren voor reguliere PR’s en een andere voor noodgevallen.

Dus laten we onze mouwen opzij schuiven en beginnen!

Voor deze demonstratie gaan we een eenvoudig React toepassingsproject initialiseren. En voor CI gaan we CircleCI gebruiken.

We zullen twee merge-wachtrijen maken:

  • standaard: Alle PR’s gaan er gewoonlijk doorheen. Het vereist CircleCI controles voordat het wordt verwerkt.
  • urgent: Deze wachtrij is alleen voor de PR’s die het urgent label in de PR hebben. Dit stelt de PR’s in staat om naar de voorkant van de PR’s in de standaard wachtrij te springen zonder CircleCI-controles uit te voeren.

Met een dergelijke configuratie zal een pull request met het label urgent in de wachtrij komen voordat de CI er al aan heeft gelopen.

Het zal aan de voorkant van de standaardwachtrij staan. Mergify zal de pull request bijwerken met zijn basisbranch indien nodig, wachten op de CI om te slagen, en vervolgens de pull request samenvoegen.

Vanuit het perspectief van het ontwikkelingsteam is dit ook een vrij eenvoudig proces. De ontwikkelaar hoeft alleen een urgent label toe te voegen bij het maken van de PR om het proces te versnellen.

Instellen van Ons Project

Laten we beginnen met het instellen van ons project. We zullen een nieuw React-toepassingsproject maken met create-react-app.

Shell

 

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

Ter referentie, dit zal onze eindstructuur van het project zijn nadat we onze CI en Mergify-configuratie toevoegen.

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

Maken van CI Config

Voor het uitvoeren van onze tests zullen we CircleCI gebruiken. Het is gemakkelijk in te stellen en aan de slag te gaan.

Hier zullen we een config.yml bestand maken in een nieuwe .circleci directory op de hoofdniveau van ons project.

We zullen een eenvoudige taak build_and_test maken die ons eerst helpt te controleren of ons project correct wordt gebouwd en vervolgens de unit tests uitvoert met de npm run test opdracht.

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

Maken van Mergify Config

Nu is het tijd om ons Mergify configuratiebestand te maken.

Mergify is een tool die het proces van het automatiseren van pull-request samenvoegingen in coderepositories op basis van vooraf bepaalde regels en voorwaarden.

We moeten twee wachtrijen in ons configuratiebestand definiëren zoals gepland: urgent en default.

Beide hebben dezelfde merge_conditions, check-success=ci/circleci: build_and_test, wat betekent dat de code moet slagen in de build_and_test controle in CircleCI voordat deze kan worden gemerged.

De pull_request_rules sectie beschrijft hoe pull-aanvragen moeten worden behandeld. We plaatsen onze PR in de urgent wachtrij als deze het label urgent heeft. Anders komt het in de standaardwachtrij terecht.

.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

Instellen van de Repository

Nee, we zullen verder gaan en een nieuwe repository op GitHub aanmaken. 

Daarna moeten we een eerste commit maken en onze code pushen met de volgende commando’s:

Shell

 

git add .
git commit -m "Initial commit"
git remote add origin <REPO_URL>
git push -u origin master

Vervolgens moeten we CircleCI instellen. Hiervoor bezoeken we de CircleCI Dashboard, gaan we naar de projecten sectie en stellen we ons project in.

We moeten ook onze main branch specificeren. CircleCI zal in dit geval automatisch onze config bestand detecteren.

We kunnen Mergify installeren in on咱 GitHub-account door dashboard.mergify.com of github.com/apps/mergify/installations/new te bezoeken en in te loggen met on咱 GitHub-account.

Vervolgens kunnen we de repositories selecteren waaraan we Mergify toegang willen geven.

Eens ingesteld, zouden we beide wachtrijen kunnen zien in het Mergify Dashboard

Opstellen van de Eerste PR (Reguliere PR)

Laten we nu beginnen met het maken van onze eerste PR. We zouden eerst een nieuwe branch regular-pr aanmaken.

Shell

 

git checkout -b regular-pr
git add .

Alleen voor demonstratiedoeleinden zullen we nu een klasse toevoegen in het App.css bestand.

CSS

 

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

Hierna zullen we een commit maken en onze wijzigingen naar GitHub pushen. 

Shell

 

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

Vervolgens zullen we een Pull Request aanmaken zonder enige tags.

Opstellen van de Tweede PR (Dringende PR)

Nu zullen we een nieuwe branch urgent-pr aanmaken voor onze wijzigingen.

Shell

 

git checkout main
git branch -b urgent-pr

Eerst zullen we een commit maken, waarbij we een nieuw component Urgent.js creëren.

JavaScript

 

import React from "react";

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

Nu zullen we deze (urgent-pr) branch naar onze GitHub-repo pushen.

Shell

 

git add .
git commit -m 'Create a component for Urgent change'
git push --set-upstream origin urgent-pr

Vervolgens gaan we naar onze repo en stellen we een nieuwe PR in van de urgent-pr branch naar de main branch en voegen we een nieuw label urgent toe.

Mergify plaatst de tweede PR automatisch in de urgent wachtrij, voert de CI-controles uit en voegt deze samen met de main branch.

Vervolgens voegt het de eerste PR automatisch samen.

Je kunt de GitHub-repository hier raadplegen voor referentie: github.com/hugoescafit/emergency-pr-demo

Conclusie

Dat is het voor deze keer!

In deze tutorial hebben we het proces onderzocht om twee verschillende merge queues in te stellen, standaard en urgent, met behulp van Mergify en het instellen van CI-controles met behulp van CircleCI. We hebben ook gezien hoe u noodgewongen PR’s kunt prioriteren boven reguliere.

Er zijn verschillende andere oplossingen voor het beheer van noodgewone pull-verzoeken, zoals het creëren van een speciale hotfix-branch, het hebben van gespecialiseerde reviewers en zelfs handmatig controle overschrijven. Maar merge queues zijn een van de beste en gemakkelijk te implementeren strategieën om dit probleem aan te pakken.

Bezoek Mergify om te beginnen met het toevoegen van merge queues aan uw applicatie!

Source:
https://dzone.com/articles/handling-emergency-pull-requests-using-merge-queue