DevOps

CI/CD بالطريقة الصحيحة: خطوط أنابيب Azure DevOps وGitHub Actions لـ .NET وFlutter

مخطط خط الأنابيب الذي نستخدمه في كل مشروع — بناء، اختبار، فحص، نشر إلى بيئة التجريب، ترقية إلى الإنتاج — مع ملفات YAML حقيقية لواجهة .NET وتطبيق Flutter.

خط الأنابيب الجيد غير مرئي: يدفع المهندسون الكود، وتعمل الاختبارات، وتتحدث بيئة التجريب خلال دقائق، ويصبح إصدار الإنتاج ضغطة زر مع مسار تراجع. أما خط الأنابيب السيئ فطقس ليلة الجمعة. إليك المخطط الذي نركّبه في كل مشروع — على Azure DevOps أو GitHub Actions، أيهما تستخدم مؤسستك.

المراحل الخمس

  1. البناء — استعادة الحزم، الترجمة، وإنتاج أداة بإصدار محدد مرة واحدة. لا تُعِد البناء لمرحلة لاحقة أبدًا.
  2. الاختبار — اختبارات الوحدات والتكامل مع التغطية؛ فشل سريع.
  3. الفحص — تحليل ساكن (SonarQube)، فحص ثغرات التبعيات، وكشف الأسرار.
  4. النشر إلى التجريب — تلقائي على main، مع اختبارات دخان وترحيلات قاعدة البيانات.
  5. الترقية إلى الإنتاج — موافقة يدوية، نشر أزرق/أخضر أو تبديل فتحات، وتراجع تلقائي عند فشل فحوص الصحة.

واجهة .NET على GitHub Actions

YAML · GitHub Actions
# .github/workflows/api.yml — build, test, deploy a .NET API to Azure
name: api
on: { push: { branches: [main] } }
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-dotnet@v4
        with: { dotnet-version: '9.0.x' }
      - run: dotnet restore
      - run: dotnet build --no-restore -c Release
      - run: dotnet test --no-build -c Release --collect:"XPlat Code Coverage"
      - run: dotnet publish src/Api -c Release -o out
      - uses: azure/webapps-deploy@v3
        with:
          app-name: ishtar-api-prod
          slot-name: staging
          publish-profile: ${{ secrets.AZURE_PUBLISH_PROFILE }}
          package: out

النشر إلى فتحة تجريب ثم التبديل هو التفصيل الجوهري: تُسخَّن النسخة الجديدة، وتنجح فحوص الصحة، ويكون التبديل لحظيًا وقابلًا للتراجع.

تطبيق Flutter على Azure DevOps

تضيف خطوط أنابيب الهاتف التوقيع والتسليم إلى المتاجر. نحتفظ بالأسرار (مخازن المفاتيح، الشهادات، مفاتيح API) في الملفات الآمنة ومجموعات المتغيرات لخط الأنابيب — لا في المستودع أبدًا — ونحقن إعدادات البيئة عبر --dart-define.

YAML · Azure Pipelines
# azure-pipelines.yml — Flutter app build stage
stages:
- stage: Build
  jobs:
  - job: Android
    pool: { vmImage: 'ubuntu-latest' }
    steps:
    - task: FlutterInstall@0
    - script: flutter pub get && flutter test
    - script: flutter build appbundle --release --dart-define=ENV=prod
    - publish: build/app/outputs/bundle/release/app-release.aab
      artifact: android

مرحلة ثانية ترفع الحزمة إلى المسار الداخلي في Google Play وملف IPA إلى TestFlight، فيتلقى المختبرون كل تغيير مدمج تلقائيًا.

البنية التحتية ككود

تُعرَّف البيئات في Terraform (أو Bicep على Azure) وتُطبَّق بخطوط الأنابيب نفسها. بيئة جديدة — عرض توضيحي لعميل محتمل، أو منطقة لسوق جديد — طلب دمج، لا أسبوع من النقر.

ممارسات تصنع الفرق

  • التطوير على الفرع الرئيسي مع فروع قصيرة العمر ومراجعات إلزامية.
  • الإصدار الدلالي مختوم في الأداة ومعروض في شاشة «حول» في التطبيق.
  • ترحيلات قاعدة البيانات في خط الأنابيب، تُنفَّذ قبل تبديل التطبيق، ومتوافقة عكسيًا لإصدار واحد.
  • أعلام الميزات ليكون النشر والإطلاق قرارين منفصلين.
  • بوابات المراقبة — لا يُعد النشر «مكتملًا» حتى تستقر معدلات الأخطاء وزمن الاستجابة عشر دقائق.
Azure DevOps أم GitHub Actions؟ متكافئان وظيفيًا لأغراضنا. يناسب Azure DevOps المؤسسات التي تريد اللوحات والمستودعات وخطوط الأنابيب في مكان واحد بصلاحيات مؤسسية دقيقة؛ ويناسب GitHub Actions الفرق الموجودة أصلًا على GitHub وتقدّر السوق الملحقة. نشغّل كليهما ونستطيع الانتقال بينهما.

النتيجة

الفرق التي نجهّزها بهذه الطريقة تشحن إلى الإنتاج عدة مرات في الأسبوع بحوادث أقل من الفرق التي تشحن شهريًا. خط الأنابيب ليس عبئًا — إنه أسرع ميزة ستبنيها في حياتك.

IG
كتبه فريق الهندسة في بوابة عشتار

يكتب مهندسونا عمّا يبنونه كل يوم — الأنظمة الفورية، تطبيقات الهواتف، المنصات السحابية، والمفاضلات التي تقف خلفها. هل لديك سؤال عن مشروعك؟ يسعدنا الحديث معك.

جميع المقالات

لديك فكرة؟ لنبنِها معًا.

أخبرنا عن منتجك وجدولك الزمني وأهدافك. خلال يومي عمل سنعود إليك بعرض واضح، ومخطط معماري أولي، ونصيحة صادقة.

راسلناinfo@ishtar-gate.com مانشستر، المملكة المتحدة+44 7503 321169 بغداد، العراق+964 770 677 1307