أساسيات 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:

# مع تحديد الفرع:

إجراءات 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 لمشروعك
- أنشئ
.github/workflows/ci.yml في مستودعك
- قم بتكوينه للتشغيل على push و pull_request إلى main
- أضف خطوات إلى:
- الخروج من الكود
- إعداد بيئة لغتك (Node، Python، إلخ.)
- تثبيت التبعيات
- تشغيل الاختبارات
- تشغيل linter (إن وجد)
- الالتزام ودفع ملف سير العمل
- عرض تشغيل سير العمل في علامة التبويب Actions
- أضف شارة حالة إلى 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، وهو سير عمل تفريع شائع لإدارة الإصدارات!