CI/CD لمشاريع C++: إعداد GitHub Actions

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

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


في هذا المثال

المدونات

توصيات الكتب