CI/CD والنشر على متاجر التطبيقات

التحديثات اللاسلكية باستخدام Shorebird Code Push

16 دقيقة الدرس 12 من 12

التحديثات اللاسلكية باستخدام Shorebird Code Push

قد يستغرق إطلاق إصلاح عبر App Store أو Google Play ساعاتٍ أو أياماً. يحلّ Shorebird Code Push هذه المشكلة بتمكينك من دفع تصحيحات Dart مباشرةً إلى أجهزة المستخدمين دون المرور بدورة مراجعة المتجر. يشرح هذا الدرس آلية عمل Shorebird من الداخل، وكيفية دمجه في خط أنابيب CI، وما يجب معرفته عن الامتثال لإرشادات المتجر قبل الإطلاق.

كيف يعمل Shorebird

يعتمد Shorebird على Dart VM معدّل يُحزَّم داخل إصدار الإنتاج من تطبيقك. عند تشغيل التطبيق، تتحقق بيئة تشغيل Shorebird من وجود تصحيح متاح على خوادمها. إن وُجد التصحيح، يُنزَّل ويُطبَّق في الخلفية، ويشغّل الإطلاق التالي الكود المُصحَّح. هذه الآلية مشابهة لـ CodePush في React Native، لكنها تعمل على مستوى بايت‌كود Dart المُجمَّع — دون أي JavaScript.

  • تصحيح Dart VM: لا يمكن توصيل سوى تغييرات كود Dart. يستلزم كود الطبقة الأصيلة (Kotlin وSwift وقنوات المنصة) دائماً تقديماً كاملاً للمتجر.
  • لا إعادة تنزيل كاملة للبرنامج الثنائي: التصحيحات تفاضلية — يُنقل فقط لقطات Dart المتغيرة، مما يُبقي أحجام التصحيحات صغيرة (في الغالب عشرات الكيلوبايت).
  • إطلاق ذري: تُدرَّج التصحيحات بنسبة مئوية، فيمكنك طرحها لـ 5 % من المستخدمين قبل التوسع.
ملاحظة: لا يُعدّل Shorebird البيانيات الأصيلة. إن تطرّق إصلاحك إلى كود خاص بالمنصة أو طبقة أصيلة لإضافة ما أو صلاحيات التطبيق، يتعيّن عليك إصدار نسخة كاملة للمتجر بدلاً من ذلك.

تثبيت Shorebird CLI

يُغلّف shorebird CLI أدوات Flutter. ثبّته مرةً واحدة لكل جهاز:

تثبيت Shorebird CLI

# macOS / Linux — أمر واحد عبر curl
curl --proto '=https' --tlsv1.2 https://raw.githubusercontent.com/shorebirdtech/install/main/install.sh -sSf | bash

# التحقق من التثبيت
shorebird --version

# المصادقة بحسابك في Shorebird
shorebird login

بعد التثبيت، هيّئ Shorebird داخل مشروع Flutter الخاص بك. يُضيف هذا ملف shorebird.yaml ويحقن تجاوز محرك Shorebird في مشروعك:

تهيئة تطبيق Flutter مع Shorebird

# نفّذ من جذر مشروعك
shorebird init

# يُنشأ shorebird.yaml — أضف هذا الملف إلى git
# يحتوي على app_id الذي يربط الإصدارات بلوحة تحكم Shorebird

# بناء APK للإنتاج مُمكَّن Shorebird (Android)
shorebird release android

# بناء IPA للإنتاج مُمكَّن Shorebird (iOS)
shorebird release ios

# إنشاء تصحيح بعد تغيير كود Dart (لا يلزم تقديم للمتجر)
shorebird patch android
shorebird patch ios

دمج Shorebird في خط أنابيب CI

يفصل سير عمل GitHub Actions النموذجي بين الإصدار الكامل للمتجر وعمليات النشر التي تقتصر على التصحيح لاحقاً. فيما يلي مثال بسيط لكنه تمثيلي للإنتاج:

GitHub Actions — سير عمل التصحيح (shorebird_patch.yml)

name: Shorebird Patch

on:
  push:
    branches: [patch/**]   # الدفع إلى patch/fix-login يُطلق تصحيحاً

jobs:
  patch:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: subosito/flutter-action@v2
        with:
          flutter-version: '3.22.0'
          channel: stable

      - uses: shorebirdtech/setup-shorebird@v1
        with:
          shorebird-version: latest

      - name: مصادقة Shorebird
        run: echo "$SHOREBIRD_TOKEN" | shorebird login --ci
        env:
          SHOREBIRD_TOKEN: ${{ secrets.SHOREBIRD_TOKEN }}

      - name: تطبيق تصحيح Android
        run: shorebird patch android --release-version=1.2.3+45

      - name: تطبيق تصحيح iOS
        run: shorebird patch ios --release-version=1.2.3+45
نصيحة: خزّن SHOREBIRD_TOKEN كسرّ مشفّر في GitHub Actions. أنشئ الرمز المميز من لوحة تحكم Shorebird ضمن الحساب ← مفاتيح API. لا تُضمّنه أبداً في ملف YAML الخاص بسير العمل.

سياسات التحديث والتراجعات

يكشف حزمة Flutter shorebird_code_push عن تعداد UpdateTrack وأساليب فحص التحديث التي يمكنك استدعاؤها من كود التطبيق للتحكم في وقت التحديثات وكيفيتها:

التحقق من التحديثات في وقت التشغيل

import 'package:shorebird_code_push/shorebird_code_push.dart';

final _updater = ShorebirdUpdater();

Future<void> checkForUpdate() async {
  final status = await _updater.checkForUpdate();

  if (status == UpdateStatus.outdated) {
    // تنزيل التصحيح في الخلفية؛ يُطبَّق عند التشغيل البارد التالي
    await _updater.update();
    debugPrint('تم تنزيل التصحيح — أعد التشغيل للتطبيق.');
  }
}

// تحديث فوري (قسري) — يُجبر إعادة تشغيل التطبيق بعد التنزيل
Future<void> forceUpdate() async {
  final result = await _updater.update(
    track: UpdateTrack.stable,
  );
  if (result == UpdateResult.upToDate) return;
  // اطلب من المستخدم إعادة التشغيل أو استدع SystemNavigator.pop()
}

التراجع عن تصحيح معيب هو عملية بأمر واحد من CLI أو نقرة واحدة في لوحة تحكم Shorebird على الويب:

التراجع عن تصحيح

# سرد التصحيحات لإصدار معين
shorebird patch list --release-version=1.2.3+45

# التراجع عن التصحيح رقم 3
shorebird patch rollback --patch-number=3 --release-version=1.2.3+45

# بعد التراجع، تعود الأجهزة المتأثرة عند الإطلاق التالي
# لا يلزم أي إجراء من المستخدمين
تحذير: لا يصل التراجع فوراً إلى كل جهاز. يجب على المستخدمين فتح التطبيق أثناء الاتصال بالإنترنت لاستقبال إشارة التراجع. صمّم استراتيجية الإصلاح العاجل بحيث تكون التراجعات شبكة أمان وليست آلية نشر أساسية.

الامتثال لإرشادات المتجر

يسمح كل من Apple وGoogle بتحديثات الكود عبر الهواء، لكن مع قيود. قد يؤدي انتهاك هذه القواعد إلى إزالة التطبيق:

  • Apple App Store: تحظر المادة 3.3.2 من اتفاقية ترخيص برنامج المطورين تنزيل الكود الأصيل وتنفيذه. ولأن Shorebird لا يُصحّح سوى بايت‌كود Dart الذي يفسّره Dart VM المُدمَج، فإنه يمتثل لهذه القاعدة — لا يُدخَل أي كود أصيل جديد.
  • Google Play: تقيّد سياسة إساءة استخدام الأجهزة والشبكات تشغيل الكود المُنزَّل الذي يُغيّر سلوك التطبيق بطريقة مضللة. يُستخدم Shorebird لتوصيل إصلاحات الأخطاء والتحسينات الطفيفة، لا لاستبدال الوظائف الأساسية أو تجاوز مراجعة الإضافات الكبرى.
  • حالات الاستخدام الآمنة: تغييرات النصوص، وإصلاحات الأخطاء، وتحسينات الأداء، والتعديلات الطفيفة على واجهة المستخدم.
  • حالات الاستخدام المحظورة: إضافة صلاحيات منصة جديدة، وتغيير الغرض الأساسي للتطبيق، وتجاوز مراجعة المحتوى للميزات الكبرى.
أفضل ممارسة: احتفظ بسجل تغييرات في لوحة تحكم Shorebird يصف كل تصحيح. هذا يُنشئ سجلاً تدقيقياً يُثبت أن تصحيحاتك إصلاحات ممتثلة وليست إضافات ميزات تتحايل على المراجعة.

الملخص

يمنح Shorebird Code Push فِرَق Flutter القدرة على شحن إصلاحات أخطاء Dart وتحديثات طفيفة مباشرةً إلى المستخدمين، متجاوزةً دورة مراجعة المتجر. يتكامل CLI بسلاسة مع GitHub Actions وأنظمة CI الأخرى. تسليم التصحيحات تفاضلي ومُدرَّج، والتراجعات فورية من لوحة التحكم. القيد الرئيسي هو أن كود Dart فقط قابل للتصحيح — تغييرات الطبقة الأصيلة تستلزم دائماً إصداراً كاملاً للمتجر. عند الاستخدام المسؤول ضمن إرشادات Apple وGoogle، يُعدّ Shorebird إضافةً قوية لخط أنابيب نشر Flutter الناضج.