بناء البرمجيات الضخمة ليس بالسهولة التي يتصورها البعض، بل تحتاج لقواعد ومجهود متكامل يحقق الإستمرارية بصورة متوازية لمرحلة نشر تلك البرمجيات.
CI/CD
لا أريد أن أطيل الحديث عن مفهوم الـ Automated فهو ببساطة جعل العمل يحقق الاستمرارية أثناء مرحلة التطوير وأيضا الإستمرارية أثناء مرحلة نشر تلك البرمجيات – وذلك حتى يتسنى لك الإنتهاء من الإعمال التي تقوم بها في وقتها المحدد وبجدول زمني محدد Work Items.
حسنا في هذه المقالة سأقوم بعمل تطبيق بسيط يقوم بإنشاء حقول في أحد قواعد البيانات بعد كل دقيقة.
أثناء مرحلة إنشاء هذا التطبيق بالتأكيد أنت كمطور ستحتاج لإضافة بعض التحسينات بين وفترة وأخرى وبعد الإنتهاء من كل إضافة تقوم بها ستحتاج لنشر التطبيق حتى يقابل تلك التحسينات التي قمت بعملها. كل هذا سيتم بصورة يدوية، ففي كل مرة يُطلب منك أن تقوم بإضافة خاصية ما على التطبيق، ستحتاج لنشر هذه الإصافات ورفعها للعمل بصورة حقيقة، وهكذا مع كل إضافة ستقوم بعمل النشر بصورة يدوية.
حسنا ماذا لو قمت بعمل النشر بصورة ديناميكية، فبمجرد عمل merge للعمل الذي قمت به للـ branch الرئيسي سيقوم الـ GitHub بعملية النشر بصورة تلقائية.
هذه المقالة لن أتطرّق لكيفية إستخدام الـ GitHub في عملية إنشاء المشروع أو طريقة عمل الـ Branches أو طريقة عمل الـ Pull Requests فإذا لم تستخدم الـ GitHub من بإمكانك الذهاب للتوثيق الخاص بالمنصة وبداية التعلم ومن ثم بإمكانك الرجوم لهذا المقالة وتعلم كيفية النشر بصورة ديناميكية Automated Deployment.
حسنا الـ GitHub Actions تستطيع إستخدامها مع جميع برمجياتك سواء كنت تستخدم Java / Nodej / Angular / C# / Vuejs وبإمكانك ان تقوم بنشر البرمجيات على الأنظمة السحابية أو على الأجهزة المحلية، وما سنتطرق له في هذه المقالة كيفية عمل النشر على جهازك المحلي Local machine
حسنا التطبيق الذي أقوم بإستخدامه عبارة عن Worker Services يعتمد على .Net Core3.1 وهو عبارة عن Services ونريد أن نقوم بنشر هذا التطبيق على الـ Windows Services
أولا بعد رفع المشروع على الـ GitHub لابد من عمل الإعدادت التي تتيح لي عمل نشر للبرنامج بصورة ديناميكية، بعد رفع المشروع قم بالذهاب لـ Settings ومنها أسفل اليسار قم بالضغط على Actions ستجد مربع باللون الأخضر مكتوب على Add runner وهي التي ستقوم بالتعريف بين المشروع الذي نعمل عليه والجهاز أو السيرفر الذي نريد عمل نشر Deploying عليه. كما موضح بالصورة أدناه
بعد الضغط على هذا الزر سيقوم بإعطاءك أربعة أسطر من الأوامر ستقوم بعمل تنفيذ لها من خلال أي محرر أوامر لديك كمثال الـ Power Shell لكن قبل هذا قم بإنشاء مجلد في محرك الأقراص C بإسم actions-runner وقم بتنفيذ تلك الأوامر من خلال هذا المسار وبعد تنفيذ آخر أمر سترى النتيجة بهذه الطريقة الموضحة في الصورة أدناه.
قم بالضغط على Actions من القائمة الرئيسية للمشروع، سيقوم الـ GitHub Action بعملية مسح Scan للتطبيق وسيقوم بتقديم مقترح لك بالتقنية التي ستحتاجها لعمل نشر التطبيق وكما ترى في الصورة أدناه بإختيار تقنية .Net Core وهي التقنية التي قمت بإستخدامها في إنشاء التطبيق.
حسنا قم بالضغط على زر set up this work-flow سيقوم الـ GitHub Actions بعرض ملف yaml وهو عبارة عن ملف يستخدم في التعامل مع إعدادات الـ CI/CD وإذا كنت من مستخدمي Azure DevOps ستجد هذا الملف أيضا، وهو عبارة عن ملف بسيط يساعدك على كتابة الأوامر التي تريد تنفيذها والتي تقوم بنشر التطبيق الذي تود نشره.
الأوامر التي سأحتاجها لنشر التطبيق وعمل Deployment للتطبيق ستكون كالتالي وبعدها سأقوم بالضغط على زر Start commit لتنفيذ العملية ومن ثم Commit new file وكما موضح بالصورة التالية:
name: .NET Core
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build-and-deploy-to-win-services:
runs-on: self-hosted
steps:
- uses: actions/checkout@v2
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 3.1.301
- name: Install dependencies
run: dotnet restore
- name: Build
run: dotnet build --configuration Release --no-restore
- name: dotnet publish
run: |
dotnet publish -c Release -o hostedservicesapp
ماذا يعني هذا؟
الآن لقد قمت بأول خطوة وهي عملية Publish للتطبيق، وكما ترى في الصورة أدناه أن جميع الخطوات تمت بكل سلاسة.
ملاحظات في حال واجهت مشاكل: أولا قبل عملية التنفيذ هذه تأكدة من أن جهازك المحلى مربوط بالـ GitHub Actions وتظهر لك العلامة الخضراء. كما موضح بالصورة أدناه
ثانيا: في حال واجهت عملية فشل في خطورة الـ Dependency قم بإعطاء الـ Power Shell لديك صلاحية العميل بصورة Remotely وقم بتنفيذ هذا السطر من على ال Power Shell:
Set-ExecutionPolicy RemoteSigned
بإمكانك بعد الإنتهاء غلق هذه الخاصية بالسطر التالي:
Set-ExecutionPolicy Restricted
في حال أردت أن تكون هذه الخاصية مفتوحة بصورة دائمة بإمكانك ربطها مع جهازك فقط من خلال بعض الأوامر (وهي لحمايتك من التعرض لأي إختراق خارجي لا غير).
حسنا الخطوة الأولى لقد انتهت وهي أننا قمنا بنشر التطببيق في المسار الذي أنشأناه سابقا على القرص C والذي سميناه actions-runner وكما تري في الصورة التالية، موضح المسار الذي قمت بتنفيذ الأسطر التي قام الـ GitHub Actions بإعطائي لها ( في حالتي هنا اسم المسار actions-runner2 نسبة لأنه لدي تطبيق آخر يعمل على المسار actions-runners)، وكما موضح أيضا في الصندوق الأحمر ملف الـ exe والذي سنقوم بعملية التنفيذ له وتثبيته على الـ windows services من خلال التعديل على ملف ال yaml في المشروع نفسه.
ملاحظة: إذا لاحظت هنا في ملف الـ yaml ان أمر النشر الذي قمت بكتابته هنا هو نفسه الذي نستخدمه في ال Visual Studioفي نشر برمجياتنا، فقط الإختلاف هنا هو أن العملية هنا ستكون ديناميكية، فعندما أقوم بالتعديل على أي جزئية في المشروع وبمجرد عمل merge للـ Branch الرئيسي سيقوم الـ GitHub Actions بعملتي النشر والتنفيذ Publish and Deploy بصورة ديناميكية.
حسنا سيكون ملف الـ yaml مكتملا بهذه الصورة بعد التعديل الأخير، وهو إضافة خاصية تنفيذ الـ Services وتشغيلها مباشرة Start Services.
name: .NET Core
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build-and-deploy-to-win-services:
runs-on: self-hosted
steps:
- uses: actions/checkout@v2
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 3.1.301
- name: Install dependencies
run: dotnet restore
- name: Build
run: dotnet build --configuration Release --no-restore
- name: dotnet publish
run: |
dotnet publish -c Release -o hostedservicesapp
- name: execute to windows services
run: |
sc.exe create HostedServicesApp binpath= C:\actions-runner2\_work\HostedServicesApp\HostedServicesApp\HostedServicesApp start= auto
- name: start service
run: |
sc start HostedServicesApp
وكما ترى أيضا بعد التنفيذ قام الـ GitHub Actions بإظهار خطأ ، وهو أن المستخدم الذي أقوم بالعمل عليه ليس له صلاحية لتثبيت هذه الـ Services، طبعا بإمكانك تشغيل الجهاز كـ Administrator وعمل تنفيذ للمشروع أو بإمكانك عمل إعدادات لجعل المستخدم الحالي ان يقوم بالعمل على الـ Power Shell كـ Administrator
وكما ترى بعد تشغيل الجهاز كـ Administrator وعمل تنفيذ للـ Actions مرة أخرى ستكون النتيجة كما موضح بالصورة التالية، وأيضا ستري في الصورة التالية لها أن الخدمة Service قد تم تثبيتها.
حسنا مالذي استفدناه من هذا العمل؟
عندما تقوم بالتعديل على المشروع مرة أخرى في الشفر ة المصدرية وبعد أن تقوم بعمل Pull Request للجزء Task/Work item الذي قمت بعمله، سيقوم الـ GitHub Actions بعمل Publish و Deploy or Execute بصورة ديناميكية بدلا عنك.
تحياتي.
[…] post مفهوم الـ Automated من خلال GitHub Actions appeared first on […]
ش