مقدمة: لماذا CI/CD هو المعيار الحديث لتطوير .NET
التطوير الحديث بلغة C# ومنصة .NET لا يمكن تصوره بدون أتمتة. التشغيل اليدوي للبناء والاختبار والنشر هو طريق للأخطاء، وإهدار الوقت، وتأخير الإصدارات. CI/CD (التكامل المستمر / النشر المستمر) يحل هذه المشكلات، مما يجعل عملية تسليم الكود قابلة للتنبؤ وسريعة.
GitHub Actions هي أداة أتمتة مدمجة على GitHub، وهي مثالية لمشاريع C#. تتيح لك إعداد خط أنابيب (pipeline) مباشرة في المستودع باستخدام ملفات YAML. في هذه المقالة، سنشرح الدورة الكاملة: من البناء الأساسي إلى نشر حزمة NuGet ونشر تطبيق الويب.
1. أساسيات GitHub Actions لـ .NET
ما هو workflow و job؟
Workflow هو عملية آلية يتم تشغيلها بناءً على حدث (push، pull request، جدول زمني). يتكون workflow من job واحدة أو أكثر (مهام)، يتم تنفيذها على runners (جهاز افتراضي يعمل بنظام Ubuntu أو Windows أو macOS).
تتكون كل job من خطوات (steps)، يمكنها تنفيذ أوامر shell أو استخدام actions جاهزة من السوق (marketplace).
أول workflow: بناء مشروع .NET
أنشئ مجلد .github/workflows في جذر المستودع وملف build.yml:
name: Build .NET Project
on: push: branches: [ main ] pull_request: branches: [ main ]
jobs: build: runs-on: ubuntu-latest
steps: - uses: actions/checkout@v4 - name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: '8.0.x' - name: Restore dependencies run: dotnet restore - name: Build run: dotnet build --no-restore --configuration Release - name: Run tests run: dotnet test --no-build --configuration Release --verbosity normalيتم تشغيل هذا workflow مع كل push أو pull request إلى main. يقوم باستعادة التبعيات، وبناء المشروع في وضع Release، وتشغيل الاختبارات. إذا فشلت أي خطوة، سيتوقف workflow وسترى حالة حمراء في PR.
2. إعدادات متقدمة: مصفوفة البناء والتخزين المؤقت
مصفوفة إصدارات .NET
للتحقق من التوافق مع إصدارات .NET المختلفة، استخدم المصفوفة (matrix):
jobs: build: strategy: matrix: dotnet-version: ['6.0.x', '7.0.x', '8.0.x'] os: [ubuntu-latest, windows-latest] runs-on: ${{ matrix.os }}
steps: - uses: actions/checkout@v4 - name: Setup .NET ${{ matrix.dotnet-version }} uses: actions/setup-dotnet@v4 with: dotnet-version: ${{ matrix.dotnet-version }} - run: dotnet build --configuration Release - run: dotnet testسينفذ Runner عملية البناء لكل مجموعة من نظام التشغيل وإصدار .NET بالتوازي. هذا يوفر الوقت ويضمن التوافق عبر المنصات.
التخزين المؤقت للتبعيات
استعادة حزم NuGet في كل مرة تستغرق وقتًا. قم بتفعيل التخزين المؤقت:
- name: Cache NuGet packages uses: actions/cache@v4 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }} restore-keys: | ${{ runner.os }}-nuget-
- name: Restore dependencies run: dotnet restoreالآن، عند التشغيل المتكرر، ستتم استعادة الحزم من ذاكرة التخزين المؤقت إذا لم تتغير ملفات .csproj.
3. نشر حزمة NuGet في GitHub Packages
إذا كنت تطور مكتبة بلغة C#، يمكنك نشرها تلقائيًا في GitHub Packages عند إنشاء إصدار (release).
Workflow للنشر
name: Publish NuGet Package
on: release: types: [published]
jobs: publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup .NET uses: actions/setup-dotnet@v4