حول المحتوى:
إنشاء تدفقات عمل لأتمتة الاختبارات، البنية، النشر، والمهام المتكررة. أمثلة عملية لتكامل CI/CD للمشاريع الصغيرة والمتوسطة.
GitHub Actions أتمتة أصبحت من أهم الأدوات في حياة أي مطوّر يعتمد على GitHub لإدارة مشاريعه. بدلًا من تكرار نفس خطوات الاختبار، البناء، النشر، أو تنظيف المشروع يدويًا بعد كل تحديث، يمكنك إنشاء تدفقات عمل Workflows تعمل تلقائيًا عند كل دفع كود (push)، أو إنشاء طلب دمج (pull request)، أو حتى في أوقات مجدولة.
في هذا الشرح من افهم صح سنبني فهمًا عمليًا لـ GitHub Actions أتمتة، مع أمثلة حقيقية تناسب المشاريع الصغيرة والمتوسطة، ونربطها بمفاهيم CI/CD التي شرحناها في مقال نشر مشروع Django على AWS باستخدام CI/CD عملي.
GitHub Actions هي منصة أتمتة مبنية داخل GitHub تسمح لك بكتابة ملفات إعداد (YAML) تصف المهام التي تريد تنفيذها، ومتى يتم تنفيذها، وعلى أي بيئة.
باختصار، GitHub Actions تسمح لك بـ:
إذا كنت جديدًا على GitHub واستخدامه في المشاريع، يمكنك الرجوع لمقال استخدامات GitHub في البرمجة والمشاريع كمدخل أساسي.
لفهم GitHub Actions أتمتة، نحتاج لاستيعاب أربع مفاهيم رئيسية:
هو ملف YAML داخل مجلد .github/workflows/ يحتوي على تعريف متى وماذا سينفذ. يمكن أن يحتوي المستودع على أكثر من Workflow لأغراض مختلفة (اختبارات، نشر، تنظيف...).
هو ما يحدد متى يتم تشغيل الـ Workflow، مثل:
push: عند دفع كود جديد إلى الفرع.pull_request: عند إنشاء أو تحديث Pull Request.schedule: مواعيد مجدولة (كرون).workflow_dispatch: تشغيل يدوي من واجهة GitHub. الـ Workflow يتكون من واحد أو أكثر من Jobs. كل Job يعمل في بيئة (Virtual Machine أو Container) مثل ubuntu-latest. يمكن تشغيل الـ Jobs بالتوازي أو بالتتابع.
لنبدأ بمثال بسيط لمشروع بايثون صغير نريد أن نضمن أن اختباراته تعمل مع كل Push و Pull Request.
داخل جذر المستودع على GitHub (أو محليًا ثم Push)، أنشئ المسار:
.github/workflows/python-tests.yml
ضع في الملف المحتوى التالي:
name: Python Tests
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Run tests
run: |
pytest
ما الذي يحدث هنا؟
push أو pull_request على فرع main.test يعمل على ubuntu-latest.actions/checkout لسحب الكود.actions/setup-python لتجهيز بيئة بايثون.requirements.txt إن وجدت.pytest لتشغيل الاختبارات.بهذه البساطة تحوّل خطوة تشغيل الاختبارات المملة إلى عملية أوتوماتيكية ومضمونة في كل تعديل.
الخطوة التالية في GitHub Actions أتمتة هي بناء المشروع وإخراج نسخة جاهزة للنشر. لنفترض أن لديك مشروع بايثون يصدر حزمة (Package) أو ملف Wheel.
name: Build Package
on:
push:
tags:
- 'v*.*.*'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install build tools
run: |
python -m pip install --upgrade pip
pip install build
- name: Build package
run: python -m build
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: dist-files
path: dist/*
في هذا السيناريو:
vX.Y.Z (إصدارات).python -m build.هذه الطريقة مناسبة للمكتبات والأدوات التي تحتاج بناء عند كل إصدار.
عند دمج GitHub Actions أتمتة مع عملية النشر، نحصل على خط CI/CD متكامل: اختبار → بناء → نشر. في مقال نشر مشروع Django على AWS باستخدام CI/CD عملي شرحنا مثال عملي، لكن هنا سنأخذ نموذجًا مبسطًا يناسب مشروع ويب متوسط.
إذا كنت تستخدم Docker – وقد شرحنا أساسياته في مقال تعلم الدوكر: شرح أساسيات التعامل مع الحاويات – يمكنك بناء الصورة (Image) تلقائيًا وإرسالها إلى Registry عند كل تحديث للفرع الرئيسي.
name: Build and Push Docker Image
on:
push:
branches: [ main ]
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: your-username/your-app:latest
ملاحظات مهمة:
GitHub Secrets ولا توضع أبدًا في الملف نفسه.ليست GitHub Actions أتمتة مقتصرة على اختبار/بناء/نشر فقط. يمكنك أتمتة عدد كبير من المهام الروتينية التي كانت تأخذ وقتًا من يومك كمطور.
مثال: توليد تقرير يومي عن حالة الاختبارات أو تحديث Dependencies.
name: Daily Maintenance
on:
schedule:
- cron: '0 3 * * *' # يوميًا الساعة 03:00 UTC
jobs:
maintenance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run maintenance script
run: |
python scripts/daily_maintenance.py
يمكنك كتابة سكربت بايثون داخل مجلد scripts/ للتنظيف أو إرسال تقرير بالبريد أو تحديث ملف معين.
لجعل الكود موحّد الأسلوب، يمكن تفعيل أداة مثل black أو prettier على Pull Requests:
name: Lint and Format
on:
pull_request:
branches: [ main ]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install tools
run: |
pip install black flake8
- name: Run flake8
run: flake8 .
- name: Check formatting with black
run: black --check .
بهذه الطريقة تمنع دمج كود غير منسّق أو مليء بالأخطاء النمطية في الفرع الرئيسي.
في مشاريع متوسطة بها عدد كبير من الـ Feature Branches، يمكن استخدام GitHub Actions لحذف الفروع التي تم دمجها بعد مدة معينة. هناك Actions جاهزة في Marketplace لهذا الغرض، أو يمكنك كتابة سكربت يستخدم GitHub API لتنفيذ ذلك.
للمشاريع الصغيرة والمتوسطة، يفضّل عدم تضخيم ملف واحد بـ Workflow شامل لكل شيء، بل تقسيم الأتمتة إلى Workflows مستقلة واضحة:
هذا التنظيم يوفر:
أي مفاتيح API، Tokens، Passwords يجب أن توضع في Settings → Secrets and variables → Actions، ثم تستخدم في الـ Workflow هكذا:
env:
API_TOKEN: ${{ secrets.MY_API_TOKEN }}
ولا توضع أبدًا داخل الكود الصريح أو ملفات YAML.
paths داخل on.push لتشغيل الـ Workflow فقط عند تغيير ملفات معينة.on:
push:
branches: [ main ]
paths:
- 'backend/**'
- '.github/workflows/tests.yml'
لتسريع البناء والاختبارات، يمكن تخزين حزم بايثون أو Node في Cache:
- name: Cache pip
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
بهذا تختصر وقت تثبيت الحزم في كل تشغيل.
في مقال GitOps باختصار: كيف تجعل Git مدير البنية التحتية شرحنا كيف يصبح Git هو “المصدر الوحيد للحقيقة” للبنية التحتية والتطبيق. GitHub Actions يكمل هذه الصورة:
بهذا يتحول كل تغيير سواء في الكود أو البنية التحتية إلى عملية مراجَعة ثم تنفيذ أوتوماتيكي، ما يقلل الأخطاء اليدوية ويرفع موثوقية المشروع.
environments وrequired reviewers.GitHub Actions أتمتة ليست مجرد أداة إضافية، بل أصبحت جزءًا أساسيًا من دورة حياة التطوير الحديثة. من خلال بضعة ملفات YAML منظمة، يمكنك:
ابدأ من مشروعك الحالي، حتى لو كان صغيرًا: أضف Workflow بسيط للاختبارات، جرّب بناء صورة Docker تلقائيًا، ثم توسع تدريجيًا إلى خط CI/CD كامل. هذه الخطوات الصغيرة ستصنع فارقًا كبيرًا في سرعة التطوير وجودة الكود على المدى البعيد.
إنشاء تدفقات عمل لأتمتة الاختبارات، البنية، النشر، والمهام المتكررة. أمثلة عملية لتكامل CI/CD للمشاريع الصغيرة والمتوسطة.
مساحة اعلانية