DevOps and Infrastructure

إتقان خطوط أنابيب CI/CD باستخدام GitHub Actions: دليل شامل

في دورة حياة تطوير البرمجيات الحديثة، لم تعد التكامل المستمر والنشر المستمر (CI/CD) مجرد رفاهية؛ بل أصبحت ضرورية للحفاظ على جودة الكود، وتسريع التسليم، وتقليل احتكاك النشر. بينما هيمنت أدوات مثل Jenkins وGitLab CI وCircleCI على هذا المجال لفترة طويلة، برز GitHub Actions كمنافس قوي، ومتكامل بعمق مباشرة داخل نظام GitHub البيئي. يتيح هذا التكامل للمطورين تعريف وتشغيل وإدارة سير عملهم بالكامل داخل مستودعهم، مما يلغي الحاجة إلى خوادم بناء خارجية والتبديل بين السياقات.

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

قبل الغوص في التكوين، من الضروري فهم كتل البناء المعمارية لـ GitHub Actions. تعمل المنصة على تسلسل هرمي من المكونات:
  • سير العمل (Workflow): عملية مؤتمتة تحددها في ملف YAML داخل دليل .github/workflows في مستودعك. يحتوي سير العمل على مهمة واحدة أو أكثر.
  • المهمة (Job): مجموعة من الخطوات التي تُنفذ على نفس المشغل (Runner). كل خطوة إما نص برمجي (shell script) أو إجراء (action).
  • المشغل (Runner): خادم يشغل سير العمل الخاص بك عند تشغيله. يوفر GitHub مشغلات مستضافة (ubuntu-latest, windows-latest, macos-latest) مجاناً للمستودعات العامة.
  • الحدث (Event): نشاط محدد يؤدي إلى تشغيل سير العمل، مثل دفع (push) أو طلب سحب (pull request) أو جدول زمني.
  • الإجراء (Action): أصغر كتلة بناء لسير عمل GitHub Actions. الإجراءات هي تطبيقات مخصصة تؤدي مهمة معقدة ولكن متكررة بشكل متكرر، مثل فحص الكود أو إعداد بيئة التشغيل.

إعداد أول سير عمل لك

أكثر جوانب GitHub Actions إقناعاً هو بساطتها. لإنشاء خط أنابيب، تقوم بإنشاء ملف YAML. دعنا نبني مثالاً عملياً: خط أنابيب لمشروع Node.js قياسي يقوم بتثبيت التبعيات، وتشغيل الاختبارات، وبناء التطبيق عند كل دفع (push) إلى الفرع الرئيسي. قم بإنشاء ملف باسم .github/workflows/nodejs-ci.yml في جذر مستودعك. يبدأ الهيكل بتعريف اسم سير العمل والمُشغلات (الأحداث).
name: Node.js CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [14.x, 16.x, 18.x]

    steps:
    - uses: actions/checkout@v3

    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'

    - name: Install dependencies
      run: npm ci

    - name: Run tests
      run: npm test

    - name: Build
      run: npm run build
في هذا التكوين، نستخدم استراتيجية matrix لاختبار التطبيق ضد إصدارات متعددة من Node.js في وقت واحد. يضمن ذلك التوافق عبر البيئات المختلفة. خطوة actions/checkout هي إجراء عام توفره GitHub لجلب الكود الخاص بك إلى مساحة عمل المشغل. يقوم إجراء actions/setup-node بأتمتة تثبيت بيئة تشغيل Node.js، مما يوفر علينا كتابة نصوص برمجية معقدة لإعداد البيئة.

استخدام الأسرار للنشر الآمن

مع نمو خطوط الأنابيب، غالباً ما تتطلب الوصول إلى معلومات حساسة، مثل بيانات اعتماد Docker Hub، أو مفاتيح الوصول إلى AWS، أو رموز النشر. يُعد تخزين هذه القيم بشكل ثابت (hardcoding) خطراً أمنياً حرجاً. يوفر GitHub Actions طريقة آمنة للتعامل مع ذلك عبر أسرار الإجراءات (Actions Secrets). انتقل إلى الإعدادات > الأسرار والمتغيرات > Actions في مستودعك لتخزين هذه القيم. يمكنك بعد ذلك الرجوع إليها في ملفات YAML الخاصة بك باستخدام سياق secrets.
    - name: Deploy to AWS S3
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: us-east-1

    - name: Upload to S3
      run: aws s3 sync ./dist s3://my-production-bucket
من خلال استخدام صيغة ${{ secrets.MY_SECRET }}، تضمن GitHub أن القيم تكون مقنعة في السجلات (logs)، مما يمنع التعرض العرضي للبيانات الحساسة مع السماح لسير العمل بالمصادقة بأمان مع الخدمات الخارجية.

تحسين خطوط الأنابيب وتصحيح الأخطاء

مع توسع البنية التحتية الخاصة بك، تصبح كفاءة خط الأنابيب أمراً بالغ الأهمية. للتحسين، فكر في استخدام actions/cache لتخزين التبعيات مثل node_modules أو طبقات Docker في ذاكرة التخزين المؤقت. يقلل هذا بشكل كبير من وقت التنفيذ واستهلاك الطاقة. بالإضافة إلى ذلك، يتيح لك استخدام needs في مهامك إنشاء رسوم بيانية معقدة للتبعيات. على سبيل المثال، قد ترغب في تخطي خطوة النشر إذا فشلت مهمة الاختبار.
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - run: echo "Running tests"

  deploy:
    needs: test
    runs-on: ubuntu-latest
    if: success()
    steps:
      - run: echo "Deploying only if tests passed"

الخاتمة

قام GitHub Actions بإتاحة خدمات CI/CD للجميع من خلال جلبها بشكل أصلي إلى المنصة حيث يوجد معظم الكود. إن تكوينها القائم على YAML بديهي، وسوقها الضخم للإجراءات القابلة لإعادة الاستخدام يسرع التطوير، وتكاملها مع واجهة GitHub UI يوفر رؤية فورية لصحة خط الأنابيب. بالنسبة للمطورين من المستوى المتوسط والمتقدم، فإن إتقان Actions يعني الانتقال إلى ما هو أبعد من البناء البسيط لإنشاء خطوط أنابيب DevOps قوية وآمنة وفعالة تمكّن فريق التطوير الخاص بك حقاً. ابدأ بشكل صغير، وكرر بشكل متكرر، واستفد من مساهمات المجتمع لبناء البنية التحتية المثالية الخاصة بك.
Share: