CI/CD لمشاريع C++: إعداد GitHub Actions
تتطلب التطوير الحديث في C++ ليس فقط كتابة كود عالي الجودة، بل أيضًا إعداد عمليات البناء والاختبار والنشر. CI/CD (التكامل المستمر / النشر المستمر) هي ممارسة تسمح بأتمتة هذه العمليات، مما يقلل الوقت بين كتابة الكود وتسليمه للمستخدمين. في هذه المقالة، سننظر في كيفية إعداد CI/CD لمشاريع C++ باستخدام GitHub Actions — أداة قوية ومجانية مدمجة في GitHub.
يتيح GitHub Actions إنشاء سير عمل تلقائية (workflows) يتم تشغيلها عند أحداث معينة: push إلى المستودع، إنشاء pull request، إصدار، وغيرها. بالنسبة لمشاريع C++، هذا مفيد بشكل خاص لأنه يضمن أن الكود يتم بناؤه على منصات مختلفة ولا يحتوي على تراجعات.
أساسيات GitHub Actions لـ C++
يستخدم GitHub Actions ملفات YAML لوصف سير العمل (workflows). يتكون كل سير عمل من وظيفة واحدة أو أكثر (jobs) يتم تنفيذها على أجهزة افتراضية (runners). بالنسبة لمشاريع C++، عادةً ما يتم استخدام أجهزة Ubuntu وWindows وmacOS runners. دعنا نلقي نظرة على الهيكل الأساسي لملف سير العمل.
name: C++ CI
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: build: runs-on: ubuntu-latest
steps: - uses: actions/checkout@v4
- name: Install dependencies run: | sudo apt-get update sudo apt-get install -y cmake g++ libboost-all-dev
- name: Configure CMake run: cmake -B build -DCMAKE_BUILD_TYPE=Release
- name: Build run: cmake --build build --config Release
- name: Test run: cd build && ctest --output-on-failureيتم تشغيل سير العمل هذا عند push إلى فرعي main وdevelop، وكذلك عند إنشاء pull request إلى main. يقوم بتثبيت التبعيات (CMake, g++, Boost)، وتكوين المشروع، وبناؤه، وتشغيل الاختبارات.
البناء متعدد المنصات لمشاريع C++
إحدى المزايا الرئيسية لـ CI/CD لـ C++ هي القدرة على التحقق تلقائيًا من البناء على منصات متعددة. هذا أمر بالغ الأهمية، حيث أن كود C++ قد يتصرف بشكل مختلف على أنظمة تشغيل ومترجمات مختلفة. يتيح GitHub Actions تنظيم مصفوفة بناء بسهولة.
jobs: build: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] compiler: [g++, clang++] include: - os: ubuntu-latest compiler: g++ cmake_flags: -DCMAKE_CXX_COMPILER=g++-11 - os: ubuntu-latest compiler: clang++ cmake_flags: -DCMAKE_CXX_COMPILER=clang++-14 - os: windows-latest compiler: msvc cmake_flags: -DCMAKE_CXX_COMPILER=cl - os: macos-latest compiler: clang++ cmake_flags: -DCMAKE_CXX_COMPILER=clang++
runs-on: ${{ matrix.os }}
steps: - uses: actions/checkout@v4
- name: Install dependencies (Ubuntu) if: matrix.os == 'ubuntu-latest' run: | sudo apt-get update sudo apt-get install -y cmake g++-11 clang-14 libboost-all-dev
- name: Install dependencies (macOS) if: matrix.os == 'macos-latest' run: | brew update brew install cmake boost
- name: Install dependencies (Windows) if: matrix.os == 'windows-latest' run: | choco install cmake boost-msvc-14.3
- name: Configure CMake run: cmake -B build ${{ matrix.cmake_flags }} -DCMAKE_BUILD_TYPE=Release
- name: Build run: cmake --build build --config Release
- name: Test run: | if [ "${{ runner.os }}" == "Windows" ]; then cd build && ctest -C Release --output-on-failure else cd build && ctest --output-on-failure fiفي هذا المثال