التعامل مع طلبات السحب الطارئة باستخدام طوابير الدمج

تم تناقش معالجة الطلبات العاجلة في مجتمع المطورين منذ ظهور ممارسات Agile و DevOps.

في مثل هذه المواقف، نحتاج إلى نظام يمكنه تحديد أولوية هذه الطلبات “العاجلة” على الطلبات العادية ويسمح لنا بتأجيل بعض فحوص CI إذا لزم الأمر.

إحدى الاستراتيجيات الجيدة هي تنفيذ طابور دمج منفصل بالكامل، مما يسمح لنا بالتقدم على الطابور الافتراضي حتى قبل اجتياز اختبارات CI وتعجيل إصلاحاتنا العاجلة إلى الإنتاج.

في هذا المقال، سنقوم بإنشاء طابوري دمج باستخدام Mergify محفز بواسطة تسميات PR. سنقوم بتكوين طابور واحد للطلبات العادية والآخر لمعالجة الطلبات العاجلة.

فلنبدأ إذن!

في هذا العرض التوضيحي، سنبدأ بتطبيق React بسيط. وبالنسبة لـ CI، سنستخدم CircleCI.

سنقوم بإنشاء طابوري دمج:

  • default: ستمر جميع الطلبات العرضية من خلالها بشكل عادي. تتطلب فحوص CircleCI قبل المعالجة.
  • urgent: يكون هذا الطابور فقط للطلبات العرضية التي لها تسمية urgent label في الطلب العرضي. يسمح هذا بقفز الطلبات العرضية إلى أمام الطلبات في طابور default دون تشغيل فحوص CircleCI.

مع مثل هذا التكوين، ستدخل طلب السحب الذي يحمل التسمية urgent إلى الطابور قبل حتى أن يتم تشغيل CI عليه.

سيكون في المقدمة من الطابور الافتراضي. سيقوم Mergify بتحديث طلب السحب بفرعه الأساسي إذا لزم الأمر، وينتظر اجتياز CI، ثم يدمج طلب السحب.

من وجهة نظر فريق التطوير أيضًا ، هذه عملية بسيطة للغاية. يحتاج المطور فقط إلى إضافة التصنيف ضروري أثناء إنشاء PR لتسريع العملية.

إعداد مشروعنا

هيا بنا نبدأ في إعداد مشروعنا. سننشأ تطبيق React جديد باستخدام 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 في الجذر من مشروعنا.

سننشئ مهمة بسيطة build_and_test ستساعدنا أولاً في التحقق مما إذا كان مشروعنا يبنى كما هو متوقع ثم تشغيل الاختبارات الوحدة مع الأمر 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 هو أداة تأتي بتلقائية عملية دمج طلبات السحب في مستودعات الكود بناءً على قواعد وشروط محددة مسبقًا.

نحتاج إلى تحديد طابورين في ملف التكوين كما خططنا: ضروري و افتراضي.

كلاهما يمتلك نفس 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 ستكتشف تلقائياً ملف التكوين لدينا في هذه الحالة.

يمكننا تثبيت Mergify في حساب GitHub عن طريق زيارة dashboard.mergify.com أو github.com/apps/mergify/installations/new وتسجيل الدخول بحساب GitHub.

ثم، يمكننا اختيار المستودعات التي نرغب في منح الوصول إليها من قبل Mergify.

بمجرد الانتهاء من الإعدادات، سنتمكن من رؤية كلا من طابورنا في لوحة التحكم في Mergify.

تم إصدار أول طلب سحب (PR العادي)

الآن دعونا نبدأ في إنشاء أول طلب سحب لدينا. سنقوم أولاً بإنشاء فرع جديد باسم 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

بعد ذلك، سنطلب سحب دون أي تسميات.

تم إصدار طلب السحب الثاني (PR العاجل)

الآن سنقوم بإنشاء فرع جديد باسم 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. لقد شاهدنا أيضًا كيفية الت prioritizing السياسيات العاجلة من الطلبات المستلمة على العادية.

هناك حلول أخرى متعددة لإدارة طلبات السحب العاجلة، مثل إنشاء فرع سريع للإصلاح خاص بها، وجود مراجعين مخصصين، وحتى تجاوز الشيكات يدويًا. لكن طوابيان الدمج هي واحدة من أفضل الاستراتيجيات والسهلة في التطبيق للتعامل مع هذه المشكلة.

زيارة Mergify لبدء إضافة طوابيان الدمج إلى تطبيقك!

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