مقدمة في CI/CD لـ C++ مع GitHub Actions
\nالتطوير الحديث بلغة C++ لا يمكن تصوره بدون أتمتة عمليات البناء والاختبار. يسمح CI/CD (التكامل المستمر / النشر المستمر) للفرق باكتشاف الأخطاء بسرعة، وبناء الملفات الثنائية تلقائيًا، ونشر التطبيقات. GitHub Actions هي أداة قوية مدمجة في GitHub، وهي مثالية لمشاريع C++. في هذه المقالة، سنشرح كيفية إعداد خط أنابيب CI/CD كامل لـ C++: من التجميع باستخدام CMake إلى نشر القطع الأثرية الجاهزة.
\nسنستعرض أمثلة حقيقية للكود، والأخطاء الشائعة، وأفضل الممارسات. بعد القراءة، ستتمكن من تنفيذ CI/CD في مشروع C++ الخاص بك بنفسك.
\n\nأساسيات GitHub Actions لـ C++
\nهيكل ملف سير العمل
\nيتم تعريف سير العمل في GitHub Actions بواسطة ملف YAML في الدليل .github/workflows/. لنلقِ نظرة على مثال أساسي لمشروع C++:
name: C++ CI/CD Pipeline\n\non:\n push:\n branches: [ main, develop ]\n pull_request:\n branches: [ main ]\n\njobs:\n build:\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout repository\n uses: actions/checkout@v4\n\n - name: Install dependencies\n run: |\n sudo apt-get update\n sudo apt-get install -y cmake g++ libboost-all-dev\n\n - name: Configure with CMake\n run: mkdir build && cd build && cmake ..\n\n - name: Build project\n run: cd build && make -j$(nproc)\n\n - name: Run tests\n run: cd build && ctest --output-on-failure\nيتم تشغيل سير العمل هذا عند الدفع إلى main و develop، وكذلك عند إنشاء طلب سحب. يقوم بتثبيت التبعيات، وتكوين البناء عبر CMake، وتجميع المشروع، وتشغيل الاختبارات.
اختيار نظام التشغيل والمترجم
\nيدعم GitHub Actions أنظمة Linux (ubuntu) و macOS و Windows. للمشاريع متعددة المنصات، يمكن استخدام مصفوفة البناء:
\njobs:\n build:\n strategy:\n matrix:\n os: [ubuntu-latest, macos-latest, windows-latest]\n compiler: [g++, clang++]\n runs-on: ${{ matrix.os }}\n\n steps:\n - name: Set compiler\n run: |\n if [ "${{ matrix.os }}" == "windows-latest" ]; then\n echo "CXX=cl.exe" >> $GITHUB_ENV\n else\n echo "CXX=${{ matrix.compiler }}" >> $GITHUB_ENV\n fi\n shell: bash\nيتيح ذلك التحقق من توافق الكود مع المترجمات وأنظمة التشغيل المختلفة.
\n\nإعداد متقدم: الاختبار، التخزين المؤقت، والقطع الأثرية
\nالتخزين المؤقت للتبعيات
\nكل بناء في GitHub Actions يبدأ ببيئة نظيفة. لتسريع العملية، قم بتخزين الحزم والمكتبات التي تم تنزيلها مؤقتًا:
\n- name: Cache CMake build directory\n uses: actions/cache@v3\n with:\n path: build\n key: ${{ runner.os }}-cmake-${{ hashFiles('**/CMakeLists.txt') }}\n restore-keys: |\n ${{ runner.os }}-cmake-\n\n- name: Configure CMake\n run: cmake -B build -S . -DCMAKE_BUILD_TYPE=Release\nيتم استعادة التخزين المؤقت إذا لم تتغير ملفات CMakeLists.txt، مما يوفر الوقت في عمليات البناء المتكررة.
\n\nتشغيل اختبارات الوحدة باستخدام Google Test
\nغالبًا ما يُستخدم Google Test مع C++. دعنا نضيف مرحلة اختبار مع إنشاء تقرير بتنسيق JUnit:
\n- name: Build and run tests\n run: |\n cmake --build build --target all_tests\n cd build && ctest --output-junit test-results.xml\n\n- name: Upload test results\n if: always()\n uses: actions/upload-artifact@v4\n with:\n name: test-results-${{ runner.os }}\n path: build/test-results.xml\nيضمن العلم if: always() تحميل التقرير حتى في حالة فشل الاختبارات.
إنشاء ونشر القطع الأثرية
\nبعد البناء الناجح، يمكن حفظ الملفات الثنائية:
\n- name: Build release binary\n run: cmake --build build --config Release\n\n- name: Upload build artifacts\n uses: ac