مقدمة: لماذا تحتاج مشاريع C# إلى CI/CD؟
\nتطوير التطبيقات الحديثة بلغة C# ومنصة .NET لا يتطلب فقط كودًا عالي الجودة، بل أيضًا عملية موثوقة لتوصيله إلى المستخدم. البناء اليدوي والاختبار والنشر ليست بطيئة فحسب، بل محفوفة بالأخطاء أيضًا. هنا يأتي دور CI/CD (التكامل المستمر / النشر المستمر) - وهي ممارسة تعمل على أتمتة جميع مراحل دورة حياة البرنامج.
\nGitHub Actions هي أداة مدمجة في GitHub تتيح لك إنشاء خطوط أنابيب قوية مباشرة داخل المستودع. في هذه المقالة، سنشرح كيفية إعداد CI/CD كامل لمشاريع C# باستخدام GitHub Actions: من البناء البسيط إلى النشر التلقائي. ستتعلم كيفية كتابة تكوينات YAML، وتحسين الاختبار، وتجنب الأخطاء الشائعة.
\n\nأساسيات GitHub Actions لـ .NET
\nما هو workflow و job؟
\nWorkflow (سير العمل) هو عملية آلية يتم تشغيلها بناءً على حدث معين (push، pull request، إنشاء إصدار). يتم وصفه في ملف .github/workflows/*.yml. يتكون سير العمل من job واحدة أو أكثر (مهام) يتم تنفيذها على runners (أجهزة افتراضية). يمكن أن تحتوي كل job على سلسلة من steps (الخطوات).
بالنسبة لمشاريع C#، الخطوات الرئيسية هي استعادة التبعيات (dotnet restore)، البناء (dotnet build)، تشغيل الاختبارات (dotnet test) والنشر (dotnet publish).
قالب سير عمل أساسي لـ .NET
\nفيما يلي سير عمل أدنى لبناء واختبار مشروع C#. احفظ هذا الكود في ملف .github/workflows/dotnet-ci.yml.
name: .NET CI\n\non:\n push:\n branches: [ main, develop ]\n pull_request:\n branches: [ main ]\n\njobs:\n build-and-test:\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout repository\n uses: actions/checkout@v4\n\n - name: Setup .NET\n uses: actions/setup-dotnet@v4\n with:\n dotnet-version: '8.0.x'\n\n - name: Restore dependencies\n run: dotnet restore\n\n - name: Build\n run: dotnet build --no-restore --configuration Release\n\n - name: Run tests\n run: dotnet test --no-build --configuration Release --verbosity normal\nشرح الأسطر الرئيسية:
\n- \n
actions/checkout@v4— يستنسخ المستودع إلى بيئة التنفيذ. \n actions/setup-dotnet@v4— يقوم بتثبيت الإصدار المحدد من .NET SDK. \n dotnet restore— يقوم بتنزيل حزم NuGet. \n dotnet build --configuration Release— يقوم ببناء المشروع في وضع Release. \n dotnet test— يقوم بتشغيل جميع الاختبارات من الحل. \n
إعداد متقدم: التخزين المؤقت ومصفوفة البناء
\nالتخزين المؤقت لحزم NuGet
\nيبدأ كل تشغيل لسير العمل ببيئة نظيفة. لتسريع العملية، يمكنك تخزين مجلد ~/.nuget/packages مؤقتًا. هذا مفيد بشكل خاص للمشاريع الكبيرة التي تحتوي على عشرات التبعيات.
steps:\n - uses: actions/cache@v4\n with:\n path: ~/.nuget/packages\n key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}\n restore-keys: |\n ${{ runner.os }}-nuget-\n - run: dotnet restore\nيتم إنشاء مفتاح التخزين المؤقت بناءً على تجزئة ملفات المشروع (.csproj). إذا لم تتغير التبعيات، فسيتم استعادة التخزين المؤقت في ثوانٍ.
مصفوفة البناء (Matrix Strategy)
\nإذا كان تطبيقك يجب أن يعمل تحت إصدارات مختلفة من .NET أو أنظمة تشغيل مختلفة، فاستخدم المصفوفة. سيقوم GitHub Actions تلقائيًا بإنشاء job منفصلة لكل مجموعة.
\njobs:\n build:\n strategy:\n matrix:\n os: [ubuntu-latest, windows-latest]\n dotnet: ['6.0.x', '8.0.x']\n runs-on: ${{ matrix.os }}\n steps:\n - uses: actions/checkout@v4\n - name: Setup .NET\n