خطاف بوابة

نشرت: 2022-07-02

Git هو نظام قوي للتحكم في الإصدار بالكاد خدشنا السطح عليه خلال مشاركاتنا القليلة الماضية. اليوم ، سنلقي نظرة على قوة الأتمتة التي يمكن أن توفرها لك Git مع Git Hooks.

يتم تضمين خطافات في كل مستودع عند استخدام الأمر git init . عند تهيئة المستودع ، تحصل على دليل مخفي .git وبداخله يوجد دليل يسمى الخطافات التي ستحتوي على جميع الخطافات الخاصة بك. افتح أي مستودع git لديك واستخدم ls -a لرؤية الدليل المخفي ، ثم افتحه في محرر الكود المفضل لديك.

للبدء ، سترى مجموعة من الملفات ذات امتدادات ملفات .sample . هذه هي بالضبط ما يقولونه ، نماذج من البرامج النصية التي يمكنك استخدامها في مشاريعك. تمت تسمية الملفات لتتوافق مع الخطاف الذي تعمل عليه. لذا فإن post-commit.sample الالتزام.sample يعمل على خطاف post-commit .

يمكنك استخدام أي لغة تقريبًا لكتابة خطاف. يتم تحليل الملف وفقًا لتدوين shebang الموجود أعلى الملف. إذا أردت استخدام العقدة ، فستستخدم #! /usr/bindi/env node #! /usr/bindi/env node وسيتم تحليل ملفك كملف عقدة.

قبل أن نتعمق في ما يمكنك فعله باستخدام git hooks ، دعنا نلقي نظرة على بعض الخطافات المتوفرة لك.

أنواع جيت هوكس

ربط سير العمل هوكس

يتم تشغيل pre-commit قبل إدخال رسالة الالتزام الخاصة بك ويمكن تجاوزها باستخدام الأمر git commit --no-verify .

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

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

يدير ما بعد post-commit بعد كل خطافات التنفيذ أعلاه. إنه مفيد للغاية بالنسبة لإشعار أنه تم إجراء التزام.

خطاف العميل

يتم تشغيل ما بعد post-checkout بعد تشغيل أمر git checkout بنجاح. إذا كانت لديك مجموعة من الملفات الكبيرة مستخدمة على الموقع ولكنك لا تريدها في التحكم بالمصادر ، فيمكنك استخدام هذا الأمر لنقل الملفات نيابة عنك.

pre-push أثناء أمر git push قبل نقل أي كائنات إلى المستودع البعيد.

خطاطيف الخادم

يتم تشغيل pre-receive عندما يدفع العميل رمزًا إلى مستودع بعيد. يمكن استخدام هذا للتحقق من الكود الذي يتم دفعه للتأكد من أنه يفي بمعايير مشروعك قبل قبول الدفع.

يتم تشغيل ما بعد post-receive بعد استلام المستودع البعيد للتحديثات. يمكن استخدام هذا لاستدعاء رابط الويب الذي يؤدي إلى بدء عملية النشر أو إخطار غرفة الدردشة باستلام التزام وجاهز للمراجعة.

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

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

من الناحية العملية ، فإن معظم الخطافات التي استخدمتها هي:

  • ما قبل ارتكاب
  • ما قبل الدفع
  • الالتزام-msg
  • استقبال مسبق
  • بعد الالتزام
  • بعد الاستلام

الآن دعونا نفعل شيئًا مع هذه الخطافات.

تنشيط مكون WordPress الإضافي باستخدام WP Cli و Git Hooks

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

للبدء ، سنحتاج إلى فرع جديد يسمى store. يمكننا الحصول على هذا باستخدام checkout -b store . يؤدي هذا إلى إنشاء فرع جديد والتحقق من ذلك لنا. الآن دعنا نجهز الخطاف.

نحتاج أولاً إلى إنشاء خطاف ما بعد الخروج باستخدام هذا الأمر touch .git/hooks/post-checkout .

بعد ذلك نحتاج إلى جعله قابلاً للتنفيذ. يمكننا القيام بذلك باستخدام الأمر chmod من الطرفية chmod +x .git/hooks/post-checkout .

الآن افتح الملف في محرر الكود الذي تختاره وانسخ الكود أدناه في ملف post-checkout .

#! /bin/bash

wp plugin activate woocommerce

echo "activated WooCommerce"

wp plugin activate automatewoo

echo "activated AutomateWoo"

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

ما نريده حقًا هو تشغيلها عندما ننتقل إلى فرع متجرنا ، ثم نوقف تشغيلها عندما نكون في فرعنا الرئيسي. للقيام بذلك ، سنحتاج إلى الخطاف لاكتشاف الفرع الذي نحن فيه واحد. قم بتبديل محتويات post-checkout بالرمز أدناه.

#! /bin/bash

oldrev=$1
newrev=$2

branch_name="(git symbolic-ref HEAD 2>/dev/null)"

if [ "refs/head/store" = "$branch_name" ];then
wp plugin activate woocommerce
echo "activated Woo"

wp plugin activate automatewoo
echo "activated AutomateWoo"
fi

if [ "refs/head/main" = "$branch_name" ];then
wp plugin deactivate woocommerce
echo "deactivated Woo"

wp plugin deactivate automatewoo
echo "deactivated AutomateWoo"
fi

يبدأ هذا الرمز بتعيين الفرع الذي نتحقق منه إلى متغير branch_name . ثم لدينا اثنين من عبارات if. الشيكات الأولى لمعرفة ما إذا كنا قد انتقلنا إلى فرع المتجر. إذا كان لدينا يستخدم WP CLI لتنشيط WooCommerce و AutomateWoo.

يتحقق بيان if التالي لمعرفة ما إذا كنا في الفرع الرئيسي. إذا كنا كذلك ، فسيتم إلغاء تنشيط المكونات الإضافية مع WP CLI وإخبارنا عنها في الجهاز.

التحكم في تدفقات عمل Git باستخدام خطافات Git

في منشور سابق على Git تحدثت عن مسارات عمل مختلفة لـ Git. إحدى حالات الاستخدام الشائعة جدًا للخطافات هي منع أي شخص من إرسال التعليمات البرمجية مباشرةً إلى الفرع الرئيسي. يمكنك استخدام خطاف للتأكد من دمج كل التعليمات البرمجية من فرع مختلف إلى رئيسي.

ابدأ بإعادة تسمية نموذج pre-commit ثم pre-commit.sample للتنفيذ كما وصفت أعلاه. بعد ذلك ، احصل على الكود أدناه واستخدمه في ملف التثبيت المسبق.

#! /bin/bash

username=$GIT_AUTHOR_NAME
branch="$(git symbolic-ref HEAD 2>/dev/null)"

if [ "$branch" = "refs/heads/main" ]; then
echo "WHOA that was '"${branch}"' you should not do that. Stop doing silly stuff and create your own branch and merge it."
exit 1 # if you remove this it won't block the commit but it will send the message to slack

fi

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

تذكر أن العديد من الأماكن تتغير إلى main كفرع لها. قد تحتاج المشاريع القديمة إلى master هنا إذا لم يتم تحديثها.

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

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

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