مقدمة: عندما يكون "اشتغل على جهازي" كارثة
كل مطور C++ سمع مرة على الأقل عبارة: "كل شيء يعمل لدي، غريب أنه يتعطل عندك". أو ربما قالها بنفسه. ترجمة القوالب، الربط، خصائص المعايير المختلفة (C++17, C++20)، وحدات الماكرو المعتمدة على المنصة - C++ مليء بالمفاجآت التي تظهر عند تغيير البيئة.
خط أنابيب CI/CD (التكامل المستمر / النشر المستمر) لـ C++ ليس ترفاً، بل ضرورة. فهو يقوم تلقائياً ببناء المشروع، وتشغيل الاختبارات، والتحقق من جودة الكود، وعند النجاح، ينشر التطبيق على الخادم (أو ينشر المكتبة). في هذه المقالة، سنقوم بإعداد خط أنابيب كامل من الصفر باستخدام GitHub Actions و CMake و C++. ستحصل على تكوين جاهز يمكنك تكييفه مع مشروعك.
1. تحضير المشروع: الهيكل ونظام البناء
قبل كتابة خط الأنابيب، يجب ترتيب المشروع. سنستخدم CMake - المعيار الفعلي لمشاريع C++ الحديثة. سيكون مثالنا أداة بسيطة لمعالجة النصوص مع اختبارات وحدوية باستخدام Google Test.
هيكل المستودع
my_cpp_project/├── .github/│ └── workflows/│ └── ci.yml # ملف خط الأنابيب├── src/│ ├── main.cpp│ └── string_utils.cpp├── include/│ └── string_utils.hpp├── tests/│ ├── CMakeLists.txt│ └── test_string_utils.cpp├── CMakeLists.txt # CMake الجذر├── Dockerfile # للنشر النهائي└── README.mdملف CMakeLists.txt الجذر
نبني المكتبة والملف التنفيذي. لاحظ تصدير الاختبارات:
cmake_minimum_required(VERSION 3.20)project(MyStringUtils VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)set(CMAKE_CXX_STANDARD_REQUIRED ON)
# المكتبة الرئيسيةadd_library(string_utils STATIC src/string_utils.cpp include/string_utils.hpp)target_include_directories(string_utils PUBLIC include)
# الملف التنفيذيadd_executable(my_app src/main.cpp)target_link_libraries(my_app PRIVATE string_utils)
# الاختبارات (اختياري، يتم تضمينها عبر خيار)option(BUILD_TESTS "Build unit tests" ON)if(BUILD_TESTS) enable_testing() add_subdirectory(tests)endif()مثال اختبار (tests/test_string_utils.cpp)
#include <gtest/gtest.h>#include "string_utils.hpp"
TEST(StringUtilsTest, ToUpper) { EXPECT_EQ(to_upper("hello"), "HELLO"); EXPECT_EQ(to_upper("C++20"), "C++20");}
TEST(StringUtilsTest, Trim) { EXPECT_EQ(trim(" spaced "), "spaced"); EXPECT_EQ(trim("\\t\\r"), "");}الآن بعد أن أصبح المشروع جاهزاً، ننتقل إلى الجزء الرئيسي - إعداد خط أنابيب CI/CD لـ C++.
2. GitHub Actions: كتابة أول خط أنابيب
GitHub Actions هي الأداة الأكثر شيوعاً لـ CI/CD في المصادر المفتوحة. يتم كتابة تكوينها بصيغة YAML ويوضع في مجلد .github/workflows. لننشئ ملف ci.yml.
الهيكل الأساسي: التشغيل عند الدفع وطلبات السحب
name: C++ CI/CD Pipeline
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: build-and-test: runs-on: ubuntu-latest
steps: - name: Checkout code uses: actions/checkout@v4
- name: Install dependencies run: | sudo apt-get update sudo apt-get install -y cmake g++ libgtest-dev
- name: Configure CMake run: cmake -B build -DCMAKE_BUILD_TYPE=Release
- name: Build run: cmake --build build --parallel $(nproc)
- name: Run tests run: cd build && ctest --output-on-failureهذا هو الحد الأدنى من خط أنابيب CI/CD لـ C++ ولكنه يعمل بالفعل. إذا فشلت الاختبارات، سينتهي خط الأنابيب بخطأ، وستتلقى إشعاراً. لكننا سنذهب أ