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 vereistCircleCI
controles voordat het wordt verwerkt.urgent
: Deze wachtrij is alleen voor de PR’s die heturgent label
in de PR hebben. Dit stelt de PR’s in staat om naar de voorkant van de PR’s in destandaard 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
.
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.
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.
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
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:
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.
git checkout -b regular-pr
git add .
Alleen voor demonstratiedoeleinden zullen we nu een klasse toevoegen in het App.css
bestand.
.Regular-change-class {
background-color: white;
}
Hierna zullen we een commit maken en onze wijzigingen naar GitHub pushen.
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.
git checkout main
git branch -b urgent-pr
Eerst zullen we een commit
maken, waarbij we een nieuw component Urgent.js
creëren.
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.
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