مقدمة: لماذا CI/CD مهم لمطور C#
في تطوير البرمجيات الحديثة، الاختبار اليدوي والنشر اليدوي غير فعالين ومحفوفين بالمخاطر. في كل مرة يدفع فيها المطور كودًا إلى المستودع، تنشأ الحاجة للتأكد من أن البناء لم ينكسر، وأن الاختبارات تمر، وأن التطبيق جاهز للنشر. هنا يأتي دور CI/CD (التكامل المستمر / النشر المستمر).
GitHub Actions هي أداة أتمتة مدمجة في GitHub تتيح لك إنشاء سير عمل (workflows) مباشرة داخل مستودعك. وهي مثالية لمشاريع C# (.NET) لأنها تدعم كل من مشغلات Windows و Linux، ولديها نظام بيئي غني بالإجراءات الجاهزة (actions).
في هذه المقالة، سنشرح كيفية إعداد خط أنابيب CI/CD كامل لمشروع C# باستخدام GitHub Actions: بدءًا من البناء والاختبار وصولاً إلى نشر حزمة NuGet أو نشر تطبيق ويب.
أساسيات GitHub Actions: YAML وهيكل سير العمل
يتم وصف كل سير عمل في GitHub Actions في ملف YAML، يتم تخزينه في دليل .github/workflows/ في مستودعك. دعنا نلقي نظرة على الهيكل الأساسي:
name: .NET CI/CD
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: build: runs-on: ubuntu-latest
steps: - name: Checkout code uses: actions/checkout@v4
- name: Setup .NET uses: actions/setup-dotnet@v4 with: dotnet-version: '8.x'
- name: Restore dependencies run: dotnet restore
- name: Build run: dotnet build --configuration Release --no-restore
- name: Run tests run: dotnet test --configuration Release --no-build --verbosity normalالعناصر الأساسية:
- on — مشغلات التشغيل (push, pull_request, schedule، إلخ)
- jobs — مجموعة من المهام التي يتم تنفيذها بالتوازي أو بالتسلسل
- runs-on — نظام التشغيل للتنفيذ (ubuntu-latest, windows-latest, macos-latest)
- steps — سلسلة من الأوامر أو الإجراءات الجاهزة (actions)
هام: بالنسبة لمشاريع .NET، استخدم الإجراء actions/setup-dotnet مع تحديد إصدار SDK. هذا يضمن أن البيئة ستحتوي على الإصدار المطلوب من .NET.
إعداد الاختبار والتحليل البرمجي لكود C#
لا يمكن لـ CI/CD عالي الجودة الاستغناء عن الاختبارات الآلية والتحقق من نمط الكود. سنضيف إلى سير العمل لدينا مراحل اختبار الوحدات والتحليل الثابت.
اختبارات الوحدات مع xUnit وتغطية الكود
لنفترض أن لديك مشروعًا مع اختبارات باستخدام xUnit. سنضيف خطوة لإنشاء تقرير عن التغطية باستخدام Coverlet:
- name: Run tests with coverage run: | dotnet test --configuration Release \ --no-build \ --verbosity normal \ /p:CollectCoverage=true \ /p:CoverletOutputFormat=opencover \ /p:CoverletOutput=./coverage.xml
- name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: files: ./coverage.xml flags: unittests fail_ci_if_error: falseللقيام بذلك، يجب إضافة حزمة coverlet.collector إلى مشروع الاختبارات. مثال على الأمر:
dotnet add package coverlet.collectorالتحليل الثابت مع Roslyn Analyzers
سنضيف فحص الكود باستخدام المحللات المدمجة في .NET:
- name: Run Roslyn analyzers run: dotnet build --configuration Release --warnaserror -p:RunAnalyzersDuringBuild=trueيمكنك أيضًا استخدام أدوات خارجية، مثل SonarCloud:
- name: SonarCloud Scan uses: SonarSource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SON