كيفية استخدام Node.js وGithub Webhooks لمزامنة المشاريع عن بعد

0 الأسهم
0
0
0
0

مقدمة

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

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

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

في هذا الدليل، ستنشئ خادم Node.js يستمع إلى إشعارات GitHub webhook عند قيامك أنت أو أي شخص آخر برفع أي كود إلى GitHub. يقوم هذا البرنامج النصي تلقائيًا بتحديث مستودع على خادم بعيد بأحدث إصدار من الكود، مما يُغنيك عن تسجيل الدخول إلى الخادم لإجراء عمليات الإيداع الجديدة.

المتطلبات الأساسية
  • إعداد خادم أوبونتو يتضمن مستخدمًا غير جذري يتمتع بصلاحيات sudo وجدار حماية.
  • تم تثبيت Git على جهازك المحلي.
  • تم تثبيت Node.js و npm على الخادم البعيد باستخدام PPA الرسمي.
  • مستودع على موقع Github يحتوي على كود مشروعك.

الخطوة 1 - إعداد Webhook

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

سجّل الدخول إلى حسابك على GitHub وانتقل إلى المستودع الذي ترغب بمراقبته. انقر على تبويب "الإعدادات" في شريط القوائم أعلى صفحة المستودع، ثم انقر على "Webhooks" في قائمة التنقل على اليسار. انقر على "إضافة Webhook" في الزاوية اليمنى وأدخل كلمة مرور حسابك عند المطالبة. ستظهر لك صفحة مشابهة لما يلي:

  • في حقل عنوان URL الخاص بالحمولة، أدخل http://your_server_ip:8080. هذا هو عنوان ومنفذ خادم Node.js الذي سنكتبه قريبًا.
  • غيّر نوع المحتوى إلى application/json. البرنامج النصي الذي نكتبه يتوقع بيانات JSON ولا يمكنه فهم أنواع البيانات الأخرى.
  • في خانة "السر"، أدخل كلمة مرور سرية لهذا الرابط الإلكتروني. ستستخدم هذه الكلمة السرية على خادم Node.js الخاص بك للتحقق من صحة الطلبات والتأكد من إرسالها من GitHub.
  • لتحديد الأحداث التي ترغب في تفعيل هذا الرابط الإلكتروني لها، ما عليك سوى اختيار حدث الدفع. نحتاج فقط إلى حدث الدفع لأنه يُحدَّث الكود عند هذه اللحظة، ويجب مزامنته مع خادمنا.
  • حدد خانة الاختيار "نشط".
  • راجع الحقول وانقر على "إضافة رابط ويب" لإنشائه.

سيفشل اختبار الاتصال في البداية، لكن اطمئن، فقد تم إعداد رابط الويب الخاص بك الآن. الآن، لنقم بنسخ المستودع إلى الخادم.

الخطوة الثانية - استنساخ المستودع إلى الخادم

يمكن لبرنامجنا تحديث المستودع، لكنه لا يستطيع تهيئته، لذا سنقوم بذلك الآن. سجّل الدخول إلى خادمك:

ssh sammy@your_server_ip

تأكد من وجودك في مجلدك الرئيسي. ثم استخدم Git لاستنساخ مستودعك. تأكد من استبدال اسم مستخدم GitHub الخاص بك بـ sammy واسم مشروع GitHub الخاص بك بـ hello_hapi.

cd
git clone https://github.com/sammy/hello_hapi.git

سيؤدي هذا إلى إنشاء مجلد جديد يحتوي على مشروعك. ستستخدم هذا المجلد في الخطوة التالية.

بعد استنساخ مشروعك، يمكنك إنشاء برنامج webhook النصي.

الخطوة 3 - إنشاء نص برمجي لـ Webhook

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

انتقل إلى القائمة الرئيسية:

cd ~

أنشئ مجلدًا جديدًا لبرنامج الويب هوك الخاص بك باسم NodeWebhooks:

mkdir ~/NodeWebhooks

ثم انتقل إلى المجلد الجديد:

cd ~/NodeWebhooks

أنشئ ملفًا جديدًا باسم webhook.js في دليل NodeWebhooks.

nano webhook.js

أضف هذين السطرين إلى البرنامج النصي:

/* Your codevar secret = "your_secret_here";
var repo = "/home/sammy/hello_hapi";... */

يُعرّف السطر الأول متغيرًا لحفظ السرّ الذي تم إنشاؤه في الخطوة 1، والذي يتحقق من أن الطلبات واردة من GitHub. أما السطر الثاني، فيُعرّف متغيرًا لحفظ المسار الكامل للمستودع الذي ترغب بتحديثه على القرص المحلي. يجب أن يشير هذا المسار إلى المستودع الذي قمت باستخراجه في الخطوة 2.

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

let http = require('http');
let crypto = require('crypto');

بعد ذلك، أضف مكتبة child_process حتى تتمكن من تشغيل أوامر shell من البرنامج النصي الخاص بك:

const exec = require('child_process').exec;

بعد ذلك، أضف هذا الكود لتعريف خادم ويب جديد سيتعامل مع طلبات GitHub webhook، وإذا كان الطلب صالحًا، فسيتم دفع الإصدار الجديد من الكود إلى أسفل:

http.createServer(function (req, res) {
req.on('data', function(chunk) {
let sig = "sha1=" + crypto.createHmac('sha1', secret).update(chunk.toString()).digest('hex');
if (req.headers['x-hub-signature'] == sig) {
exec('cd ' + repo + ' && git pull');
}
});
res.end();
}).listen(8080);

تبدأ الدالة http.createServer() خادم ويب على المنفذ 8080 يستمع إلى الطلبات الواردة من GitHub. ولأغراض أمنية، نتحقق من تطابق السر المُضمّن في الطلب مع السر الذي حددناه عند إنشاء رابط الويب في الخطوة 1. يُرسل هذا السر في ترويسة x-hub-signature كسلسلة مُجزأة باستخدام SHA1، لذا نقوم بتجزئة سرنا ومقارنته بما يرسله لنا GitHub.

إذا كان الطلب صحيحًا، فإننا نقوم بتشغيل أمر shell لتحديث مستودعنا المحلي باستخدام git pull.

يبدو النص الكامل كالتالي:

const secret = "your_secret_here";
const repo = "~/your_repo_path_here/";
const http = require('http');
const crypto = require('crypto');
const exec = require('child_process').exec;
http.createServer(function (req, res) {
req.on('data', function(chunk) {
let sig = "sha1=" + crypto.createHmac('sha1', secret).update(chunk.toString()).digest('hex');
if (req.headers['x-hub-signature'] == sig) {
exec('cd ' + repo + ' && git pull');
}
});
res.end();
}).listen(8080);

إذا اتبعت دليل إعداد الخادم الأولي، فأنت بحاجة إلى السماح لخادم الويب هذا بالاتصال بالويب الخارجي عن طريق السماح بمرور البيانات على المنفذ 8080:

sudo ufw allow 8080/tcp

الآن وقد أصبح برنامجنا جاهزاً، دعونا نتأكد من أنه يعمل بشكل صحيح.

الخطوة 4 - اختبار Webhook

يمكننا اختبار رابط الويب الخاص بنا باستخدام Node.js لتشغيله من سطر الأوامر. ابدأ تشغيل البرنامج النصي واترك العملية مفتوحة في نافذة الطرفية.

cd ~/NodeWebhooks
nodejs webhook.js

ارجع إلى صفحة مشروعك على Github.com. انقر على تبويب "الإعدادات" في شريط القوائم أعلى صفحة مستودعك، ثم انقر على "Webhooks" في قائمة التنقل على اليسار. انقر على "تعديل" بجوار رابط الويب الذي قمت بإعداده في الخطوة 1. مرر لأسفل لرؤية قسم "آخر التغييرات"، كما هو موضح في الصورة أدناه:

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

الآن يمكننا التأكد من أن برنامجنا النصي يعمل في الخلفية ويبدأ عند تشغيل النظام. سيؤدي استخدام CTRL+C إلى إيقاف خادم الويب هوك الخاص بالعقدة.

الخطوة 5 - تثبيت Webhook كخدمة Systemd

يُعدّ systemd مدير مهام نظام أوبونتو للتحكم في الخدمات. سنقوم بتشغيل خدمة تُمكّننا من بدء تشغيل برنامج webhook النصي عند بدء التشغيل، واستخدام أوامر systemd لإدارته كما هو الحال مع أي خدمة أخرى.

ابدأ بإنشاء ملف خدمة جديد:

sudo nano /etc/systemd/system/webhook.service

أضف التكوين التالي إلى ملف الخدمة الذي يُخبر systemd بكيفية تشغيل البرنامج النصي. يُخبر هذا التكوين systemd بمكان العثور على برنامج Node النصي الخاص بنا ويصف خدمتنا.

تأكد من استبدال "سامي" باسم المستخدم الخاص بك.

[Unit]
Description=Github webhook
After=network.target
[Service]
Environment=NODE_PORT=8080
Type=simple
User=sammy
ExecStart=/usr/bin/nodejs /home/sammy/NodeWebhooks/webhook.js
Restart=on-failure
[Install]
WantedBy=multi-user.target

قم بتمكين الخدمة الجديدة لتبدأ عند تشغيل النظام:

sudo systemctl enable webhook.service

ابدأ الخدمة الآن:

sudo systemctl start webhook

تأكد من بدء تشغيل الخدمة:

sudo systemctl status webhook

ستظهر لك المخرجات التالية التي تشير إلى أن الخدمة نشطة:

Output
● webhook.service - Github webhook
Loaded: loaded (/etc/systemd/system/webhook.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2018-08-17 19:28:41 UTC; 6s ago
Main PID: 9912 (nodejs)
Tasks: 6
Memory: 7.6M
CPU: 95ms
CGroup: /system.slice/webhook.service
└─9912 /usr/bin/nodejs /home/sammy/NodeWebhooks/webhook.js

يمكنك الآن دفع التغييرات الجديدة إلى مستودعك ورؤية التغييرات على خادمك.

قم بمحاكاة المستودع من جهاز الكمبيوتر الخاص بك:

git clone https://github.com/sammy/hello_hapi.git

قم بتغيير أحد الملفات في المستودع. ثم قم بتثبيت الملف وادفع الكود الخاص بك إلى GitHub.

git add index.js
git commit -m "Update index file"
git push origin master

سيتم تفعيل رابط الويب وستظهر تغييراتك على خادمك.

نتيجة

لقد قمتَ بإعداد سكربت Node.js يقوم تلقائيًا بنشر التغييرات الجديدة إلى مستودع بعيد. يمكنك استخدام هذه العملية لإعداد مستودعات إضافية ترغب في مراقبتها. بل يمكنك أيضًا تهيئته لنشر موقع ويب أو تطبيق إلى بيئة الإنتاج عند دفع التغييرات إلى مستودعك.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

قد يعجبك أيضاً