مقدمة: لماذا تحتاج مشاريع C++ إلى CI/CD؟
يرتبط التطوير بلغة C++ تقليديًا بالبناء اليدوي، وتشغيل الاختبارات، والتحكم الدقيق في الإصدارات. ومع ذلك، في التطوير الحديث، خاصة عند العمل ضمن فريق، يصبح هذا النهج عنق زجاجة. CI/CD (التكامل المستمر / النشر المستمر) هي ممارسة تعمل على أتمتة عمليات بناء الكود واختباره ونشره. بالنسبة لمشاريع C++، حيث قد تظهر أخطاء الترجمة أو الربط فقط على منصات معينة، فإن CI/CD أمر بالغ الأهمية.
GitHub Actions هي أداة قوية ومرنة مدمجة في GitHub، وتسمح بإنشاء خطوط أنابيب (pipelines) مباشرة في المستودع. في هذه المقالة، سنشرح كيفية إعداد CI/CD لمشروع C++ من الصفر باستخدام GitHub Actions. ستتعلم كيفية أتمتة البناء باستخدام CMake، وتشغيل اختبارات الوحدة، والتحقق من جودة الكود، وحتى نشر الإصدارات.
بحلول نهاية المقالة، ستكون قادرًا على إعداد خط أنابيب (pipeline) بنفسك، مما سيوفر ساعات من العمل اليدوي ويزيد من موثوقية مشروعك.
الجزء الرئيسي: دليل خطوة بخطوة لـ GitHub Actions للغة C++
1. أساسيات GitHub Actions: سير العمل (Workflow) والمهام (Jobs) والخطوات (Steps)
قبل كتابة الكود، دعنا نفهم المصطلحات. يعتمد GitHub Actions على سير العمل (workflow)، والتي يتم وصفها في ملفات YAML داخل الدليل .github/workflows/. يتكون كل سير عمل من مهمة (job) واحدة أو أكثر، يتم تنفيذها بالتوازي أو بالتسلسل. تتكون كل مهمة من خطوات (steps) — أوامر أو إجراءات منفصلة.
بالنسبة لمشروع C++، يتضمن سير العمل النموذجي ما يلي:
- البناء (Build): ترجمة المشروع باستخدام CMake و Make/Ninja.
- الاختبار (Test): تشغيل اختبارات الوحدة (على سبيل المثال، باستخدام Google Test أو Catch2).
- الفحص (Lint): التحقق من الكود باستخدام أدوات التحليل الثابتة (Clang-Tidy, Cppcheck).
- النشر (Deploy): نشر القطع الأثرية (artifacts) أو الإصدارات.
عادةً ما يتم إنشاء سير العمل الأول للبناء الأساسي على Ubuntu، ولكن C++ تتطلب الاختبار على أنظمة تشغيل مختلفة (Linux, macOS, Windows). يدعم GitHub Actions جميع المنصات الثلاث.
2. إنشاء أول سير عمل: البناء والاختبار
أنشئ ملفًا باسم .github/workflows/ci.yml في جذر مستودعك. فيما يلي مثال لمشروع يستخدم CMake و Google Test.
name: C++ CI/CD Pipeline
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: build: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] build_type: [Debug, Release] runs-on: ${{ matrix.os }} steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install dependencies (Linux) if: runner.os == 'Linux' run: sudo apt-get update && sudo apt-get install -y cmake g++ ninja-build - name: Install dependencies (macOS) if: runner.os == 'macOS' run: brew install cmake ninja - name: Install dependencies (Windows) if: runner.os == 'Windows' run: choco install cmake ninja -y - name: Configure CMake run: cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} - name: Build run: cmake --build build --config ${{ matrix.build_type }} - name: Run tests working-directory: build run: ctest --output-on-failure -C ${{ matrix.build_type }}يقوم سير العمل هذا بما يلي:
- يتم تشغيله عند الدفع (push) إلى
mainأوdevelop، وكذلك عند إنشاء طلب سحب (Pull Request). - يستخدم مصفوفة استراتيجيات (matrix strategy) للبناء على ثلاثة أنظمة تشغيل وفي تكوينين (Debug/Release).
- يقوم بتثبيت التبعيات (CMake, Ninja) اعتمادًا على نظام التشغيل.