تم تناقش معالجة الطلبات العاجلة في مجتمع المطورين منذ ظهور ممارسات 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
.
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
في الجذر من مشروعنا.
سننشئ مهمة بسيطة build_and_test
ستساعدنا أولاً في التحقق مما إذا كان مشروعنا يبنى كما هو متوقع ثم تشغيل الاختبارات الوحدة مع الأمر 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 هو أداة تأتي بتلقائية عملية دمج طلبات السحب في مستودعات الكود بناءً على قواعد وشروط محددة مسبقًا.
نحتاج إلى تحديد طابورين في ملف التكوين كما خططنا: ضروري
و افتراضي
.
كلاهما يمتلك نفس 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 ستكتشف تلقائياً ملف التكوين لدينا في هذه الحالة.
يمكننا تثبيت Mergify في حساب GitHub عن طريق زيارة dashboard.mergify.com أو github.com/apps/mergify/installations/new وتسجيل الدخول بحساب GitHub.
ثم، يمكننا اختيار المستودعات التي نرغب في منح الوصول إليها من قبل Mergify.
بمجرد الانتهاء من الإعدادات، سنتمكن من رؤية كلا من طابورنا في لوحة التحكم في Mergify.
تم إصدار أول طلب سحب (PR العادي)
الآن دعونا نبدأ في إنشاء أول طلب سحب لدينا. سنقوم أولاً بإنشاء فرع جديد باسم 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
بعد ذلك، سنطلب سحب دون أي تسميات.
تم إصدار طلب السحب الثاني (PR العاجل)
الآن سنقوم بإنشاء فرع جديد باسم 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. لقد شاهدنا أيضًا كيفية الت prioritizing السياسيات العاجلة من الطلبات المستلمة على العادية.
هناك حلول أخرى متعددة لإدارة طلبات السحب العاجلة، مثل إنشاء فرع سريع للإصلاح خاص بها، وجود مراجعين مخصصين، وحتى تجاوز الشيكات يدويًا. لكن طوابيان الدمج هي واحدة من أفضل الاستراتيجيات والسهلة في التطبيق للتعامل مع هذه المشكلة.
زيارة Mergify لبدء إضافة طوابيان الدمج إلى تطبيقك!
Source:
https://dzone.com/articles/handling-emergency-pull-requests-using-merge-queue