Git و GitHub

أساسيات GitHub Actions

13 دقيقة الدرس 23 من 35

أساسيات GitHub Actions

GitHub Actions هي منصة أتمتة قوية تسمح لك ببناء واختبار ونشر الكود الخاص بك مباشرة من GitHub. تمكّن سير عمل التكامل المستمر والنشر المستمر (CI/CD) دون مغادرة مستودعك.

ما هي GitHub Actions؟

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

الفائدة الرئيسية: GitHub Actions مجاني للمستودعات العامة مع دقائق غير محدودة. تحصل المستودعات الخاصة على 2000 دقيقة مجانية شهرياً في الخطة المجانية.

المفاهيم الأساسية

فهم هذه المكونات أمر ضروري:

سير العمل (Workflow): - عملية آلية محددة في ملف YAML - مخزنة في دليل .github/workflows/ - تحتوي على واحدة أو أكثر من الوظائف الحدث (Event/Trigger): - نشاط محدد يبدأ سير العمل - أمثلة: push، pull_request، schedule، يدوي الوظيفة (Job): - مجموعة من الخطوات تعمل على نفس المشغل - الوظائف تعمل بالتوازي افتراضياً - يمكن تكوينها للعمل بشكل متسلسل الخطوة (Step): - مهمة فردية داخل وظيفة - تشغل أمراً أو إجراءً - الخطوات تعمل بشكل متسلسل داخل الوظيفة الإجراء (Action): - وحدة كود قابلة لإعادة الاستخدام - يمكن أن تكون من GitHub Marketplace أو مخصصة - لبنات بناء الخطوات المشغل (Runner): - خادم يشغل سير العمل الخاص بك - مستضاف من GitHub أو مستضاف ذاتياً - متاح لـ Linux و Windows و macOS

سير العمل الأول الخاص بك

دعنا ننشئ سير عمل بسيط يعمل في كل دفع:

# إنشاء دليل سير العمل mkdir -p .github/workflows # إنشاء ملف سير العمل cat > .github/workflows/hello-world.yml <<'EOF' name: Hello World # متى يتم تشغيل سير العمل هذا on: push: branches: [ main ] # الوظائف للتشغيل jobs: greet: runs-on: ubuntu-latest steps: - name: طباعة التحية run: echo "مرحباً، GitHub Actions!" - name: طباعة التاريخ run: date EOF # الالتزام والدفع git add .github/workflows/hello-world.yml git commit -m "Add Hello World workflow" git push

بعد الدفع، تحقق من علامة التبويب Actions على GitHub لرؤية سير العمل الخاص بك يعمل!

نصيحة احترافية: يجب أن تكون ملفات سير العمل في دليل .github/workflows/ ولها امتداد .yml أو .yaml.

مشغلات سير العمل الشائعة

تكوين متى يجب تشغيل سير العمل الخاص بك:

# التشغيل عند الدفع إلى فرع main on: push: branches: [ main ] # التشغيل على طلب السحب on: pull_request: branches: [ main ] # التشغيل على أحداث متعددة on: push: branches: [ main, develop ] pull_request: branches: [ main ] # التشغيل على جدول زمني (cron) on: schedule: - cron: '0 0 * * *' # يومياً في منتصف الليل # التشغيل يدوياً on: workflow_dispatch: # التشغيل على مسارات محددة on: push: paths: - 'src/**' - 'tests/**'

سير عمل CI الأساسي (الاختبار)

سير عمل عملي يشغل الاختبارات في كل دفع:

name: CI - Run Tests on: push: branches: [ main, develop ] pull_request: branches: [ main ] jobs: test: runs-on: ubuntu-latest steps: # الخروج من كود المستودع - name: Checkout code uses: actions/checkout@v4 # إعداد بيئة Node.js - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' # تثبيت التبعيات - name: Install dependencies run: npm ci # تشغيل الاختبارات - name: Run tests run: npm test # تشغيل Linter - name: Run linter run: npm run lint
فهم uses: الكلمة الرئيسية uses تشغل إجراءً من GitHub Marketplace أو مستودع. الكلمة الرئيسية run تنفذ أوامر shell.

وظائف متعددة بالتوازي

قم بتشغيل وظائف مختلفة في وقت واحد:

name: Build and Test on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: بناء التطبيق run: npm run build test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: تشغيل الاختبارات run: npm test lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: تشغيل linter run: npm run lint

وظائف متسلسلة مع التبعيات

اجعل الوظائف تعمل بترتيب محدد:

name: Build, Test, Deploy on: push: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci - run: npm run build test: needs: build # انتظر حتى يكتمل البناء runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci - run: npm test deploy: needs: [build, test] # انتظر كليهما runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm run deploy
مهم: الوظائف تعمل بالتوازي افتراضياً. استخدم needs لإنشاء تبعيات وضمان التنفيذ المتسلسل.

استخدام استراتيجية المصفوفة

اختبار عبر إصدارات أو منصات متعددة:

name: Test Matrix on: [push] jobs: test: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] node-version: [18, 20, 22] steps: - uses: actions/checkout@v4 - name: Setup Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: npm ci - run: npm test

هذا ينشئ 9 وظائف (3 نظام تشغيل × 3 إصدارات Node) تعمل بالتوازي!

متغيرات البيئة والأسرار

استخدم متغيرات البيئة والأسرار بشكل آمن:

name: Deploy with Secrets on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest env: NODE_ENV: production API_URL: https://api.example.com steps: - uses: actions/checkout@v4 - name: النشر إلى الخادم env: DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }} API_TOKEN: ${{ secrets.API_TOKEN }} run: | echo "النشر إلى الإنتاج..." # استخدم $DEPLOY_KEY و $API_TOKEN بشكل آمن
إضافة الأسرار: انتقل إلى إعدادات المستودع → الأسرار والمتغيرات → الإجراءات → سر مستودع جديد. يتم تشفير الأسرار ولا يتم عرضها أبداً في السجلات.

خطوات مشروطة

قم بتشغيل الخطوات فقط عند استيفاء الشروط:

name: Conditional Workflow on: [push, pull_request] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: التشغيل على main فقط if: github.ref == 'refs/heads/main' run: echo "هذا هو فرع main" - name: التشغيل على PR فقط if: github.event_name == 'pull_request' run: echo "هذا طلب سحب" - name: التشغيل عند النجاح if: success() run: echo "نجحت الخطوات السابقة" - name: التشغيل عند الفشل if: failure() run: echo "فشلت الخطوات السابقة"

التخزين المؤقت للتبعيات

قم بتسريع سير العمل عن طريق التخزين المؤقت للتبعيات:

name: Build with Cache on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' # التخزين المؤقت لـ node_modules - name: Cache dependencies uses: actions/cache@v4 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - run: npm ci - run: npm run build
فوائد التخزين المؤقت: يمكن أن يقلل التخزين المؤقت من وقت تنفيذ سير العمل بنسبة 40-60% عن طريق تجنب إعادة تنزيل التبعيات في كل تشغيل.

شارات الحالة

أضف شارات حالة سير العمل إلى README الخاص بك:

# تنسيق عنوان URL للشارة: https://github.com/{owner}/{repo}/actions/workflows/{workflow-file}/badge.svg # مثال في README.md: ![CI](https://github.com/username/repo/actions/workflows/ci.yml/badge.svg) # مع تحديد الفرع: ![CI](https://github.com/username/repo/actions/workflows/ci.yml/badge.svg?branch=main)

إجراءات GitHub Marketplace

إجراءات شائعة يمكنك استخدامها في سير العمل الخاص بك:

الإجراءات الأساسية: # الخروج من الكود - uses: actions/checkout@v4 # إعداد لغات البرمجة - uses: actions/setup-node@v4 - uses: actions/setup-python@v5 - uses: actions/setup-java@v4 - uses: actions/setup-go@v5 # تحميل/تنزيل القطع الأثرية - uses: actions/upload-artifact@v4 - uses: actions/download-artifact@v4 # النشر إلى GitHub Pages - uses: peaceiris/actions-gh-pages@v4 # إرسال إخطار Slack - uses: slackapi/slack-github-action@v1 # بناء Docker ودفعه - uses: docker/build-push-action@v5

تصفح المزيد من الإجراءات على: https://github.com/marketplace?type=actions

مثال على سير العمل: النشر إلى GitHub Pages

سير عمل كامل لنشر موقع ثابت:

name: Deploy to GitHub Pages on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest permissions: contents: write steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' - name: تثبيت التبعيات run: npm ci - name: بناء الموقع run: npm run build - name: النشر إلى GitHub Pages uses: peaceiris/actions-gh-pages@v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./dist

عرض نتائج سير العمل

تحقق من حالة سير العمل الخاص بك على GitHub:

# على GitHub: 1. انتقل إلى مستودعك 2. انقر على علامة التبويب "Actions" 3. شاهد جميع تشغيلات سير العمل 4. انقر على أي تشغيل لعرض التفاصيل 5. قم بتوسيع الخطوات لرؤية السجلات # حالات سير العمل: ✓ النجاح (علامة اختيار خضراء) ✗ الفشل (X أحمر) ⊙ قيد التقدم (دائرة صفراء) ○ ملغى (دائرة رمادية) − تم التخطي

تمرين عملي:

المهمة: إنشاء سير عمل CI لمشروعك

  1. أنشئ .github/workflows/ci.yml في مستودعك
  2. قم بتكوينه للتشغيل على push و pull_request إلى main
  3. أضف خطوات إلى:
    • الخروج من الكود
    • إعداد بيئة لغتك (Node، Python، إلخ.)
    • تثبيت التبعيات
    • تشغيل الاختبارات
    • تشغيل linter (إن وجد)
  4. الالتزام ودفع ملف سير العمل
  5. عرض تشغيل سير العمل في علامة التبويب Actions
  6. أضف شارة حالة إلى README الخاص بك

النتيجة المتوقعة: سيكون لديك اختبار آلي يعمل في كل دفع وطلب سحب، مع شارة حالة مرئية.

أفضل الممارسات

✓ استخدم إصدارات إجراءات محددة (@v4، ليس @main) ✓ قم بالتخزين المؤقت للتبعيات لتسريع سير العمل ✓ استخدم الأسرار للبيانات الحساسة ✓ قم بتعيين الأذونات المناسبة (أقل امتياز) ✓ استخدم استراتيجية المصفوفة للاختبار عبر المنصات ✓ احتفظ بسير العمل مركزاً ومعيارياً ✓ أضف أسماء ذات معنى للوظائف والخطوات ✓ استخدم التنفيذ المشروط لتوفير الموارد ✓ راقب استخدام وتكاليف سير العمل ✓ ثبت إصدارات الإجراءات لإعادة الإنتاج

استكشاف أخطاء سير العمل وإصلاحها

المشكلات الشائعة والحلول:

المشكلة: لا يتم تشغيل سير العمل - تحقق من أن الملف في .github/workflows/ - تحقق من صحة بناء جملة YAML - تأكد من استيفاء شروط التشغيل المشكلة: تم رفض الإذن - أضف الأذونات المطلوبة إلى سير العمل - تحقق من تعيين أسرار المستودع - تحقق من أن الرمز لديه نطاقات صحيحة المشكلة: سير عمل بطيء - استخدم التخزين المؤقت للتبعيات - قم بتشغيل الوظائف بالتوازي - استخدم استراتيجية المصفوفة بكفاءة المشكلة: فشل الاختبارات في CI ولكنها تمر محلياً - تحقق من اختلافات البيئة - تحقق من تثبيت التبعيات - تحقق من متغيرات البيئة - راجع سجلات سير العمل بعناية

الملخص

في هذا الدرس، تعلمت:

  • GitHub Actions تؤتمت سير عمل CI/CD مباشرة في GitHub
  • سير العمل هي ملفات YAML في .github/workflows/
  • المكونات الرئيسية: الأحداث، الوظائف، الخطوات، الإجراءات، المشغلات
  • المشغلات الشائعة: push، pull_request، schedule، workflow_dispatch
  • الوظائف تعمل بالتوازي افتراضياً؛ استخدم needs للتبعيات
  • استراتيجية المصفوفة تختبر عبر تكوينات متعددة
  • الأسرار تحافظ على البيانات الحساسة آمنة
  • GitHub Marketplace يوفر آلاف الإجراءات القابلة لإعادة الاستخدام
  • شارات الحالة تظهر حالة سير العمل في README الخاص بك
التالي: في الدرس التالي، سنستكشف Git Flow، وهو سير عمل تفريع شائع لإدارة الإصدارات!