CI/CD لمشاريع C++: GitHub Actions مستوى متقدم

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

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

ابدأ الدورة

CI/CD متقدم لمشاريع C++ على GitHub Actions



عندما يتوقف خط الأنابيب البسيط "بناء - تشغيل اختبارات - نشر" عن العمل، يحين وقت التقنيات المتقدمة. في هذه المقالة، سننظر في كيفية إعداد GitHub Actions لمشاريع C++ على المستوى الاحترافي: التخزين المؤقت للتبعيات، مصفوفة البناء لمترجمات مختلفة، التحليل الثابت للكود، القطع الأثرية والمحفزات الذكية. جميع الأمثلة مقدمة بلغة C++ باستخدام CMake.



1. التخزين المؤقت للتبعيات وتسريع البناء



يبدأ كل تشغيل لسير العمل بجهاز افتراضي نظيف. بدون التخزين المؤقت، ستقوم في كل مرة بتنزيل وبناء نفس المكتبة (مثل Boost أو Google Test). الحل هو استخدام التخزين المؤقت المدمج في GitHub Actions.



name: CI لـ C++ (متقدم)on: [push, pull_request]

jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4

- name: التخزين المؤقت للتبعيات uses: actions/cache@v3 with: path: | ~/.cache build/_deps key: ${{ runner.os }}-c++-${{ hashFiles('CMakeLists.txt', '**/*.cmake') }} restore-keys: | ${{ runner.os }}-c++-

- name: تثبيت التبعيات النظامية run: sudo apt-get update && sudo apt-get install -y libboost-all-dev

- name: البناء run: | cmake -B build -DCMAKE_BUILD_TYPE=Release cmake --build build -j$(nproc)


يتم تشكيل المفتاح key بناءً على تجزئة CMakeLists.txt - عند تغيير قائمة التبعيات، يتم إبطال التخزين المؤقت تلقائيًا. تسمح المعلمة restore-keys باستعادة جزئية للتخزين المؤقت إذا لم يتم العثور على المفتاح الدقيق.



2. مصفوفة البناء: مترجمات ومنصات متعددة



عند تطوير تطبيق C++ عبر المنصات، من المهم التحقق من البناء تحت مترجمات مختلفة. يدعم GitHub Actions استراتيجية المصفوفة (matrix strategy).



jobs:  build:    strategy:      matrix:        os: [ubuntu-latest, windows-latest, macos-latest]        compiler: [gcc, clang, msvc]        exclude:          - os: ubuntu-latest            compiler: msvc          - os: windows-latest            compiler: clang          - os: macos-latest            compiler: msvc

runs-on: ${{ matrix.os }}

steps: - uses: actions/checkout@v4

- name: إعداد المترجم (Linux) if: runner.os == 'Linux' run: | if [ "${{ matrix.compiler }}" == "gcc" ]; then echo "CC=gcc" >> $GITHUB_ENV echo "CXX=g++" >> $GITHUB_ENV elif [ "${{ matrix.compiler }}" == "clang" ]; then echo "CC=clang" >> $GITHUB_ENV echo "CXX=clang++" >> $GITHUB_ENV fi

- name: البناء باستخدام CMake run: | cmake -B build -DCMAKE_BUILD_TYPE=Debug cmake --build build


تولد المصفوفة تلقائيًا 6 مهام (3 أنظمة تشغيل × 2 مترجم بعد استبعاد المجموعات غير الصالحة). هذا يسمح باكتشاف المشكلات الخاصة بمترجم أو منصة معينة بسرعة.



3. التحليل الثابت وأدوات الفحص



جودة كود C++ أمر بالغ الأهمية. قم بتضمين التحليل الثابت في خط الأنابيب باستخدام Clang-Tidy أو Cppcheck أو SonarCloud. لنلق نظرة على مثال باستخدام Clang-Tidy.



jobs:  static-analysis:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4

- name: تثبيت الأدوات run: | sudo apt-get install -y clang-tidy cppcheck pip install compiledb

- name: إنشاء compile_commands.json run: | cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON compiledb -o build/compile_commands.json make -C build

- name: تشغيل Clang-Tidy run: | find . -name '*.cpp' -o -name '*.hpp' | xargs clang-tidy -p build --checks='*,-modernize-use

المدونات

توصيات الكتب