في الشهر الماضي، كنت أسابق الزمن للوفاء بموعد نهائي لمشروع Greeny Corner—وهو تطبيق للعناية بالنباتات قمت ببنائه باستخدام React Native و Expo SDK 54. أراد العميل إضافة ميزة اللغة العربية الجديدة إلى متجر تطبيقات الإمارات العربية المتحدة في غضون 48 ساعة. كانت عمليات البناء المحلية الخاصة بي تعمل بشكل جيد، ولكن عندما بدأت أول سير عمل لـ EAS Build في GitHub Actions، انفجرت خطوة iOS بخطأ ترميز غامض. بعد ثلاثة فناجين من القهوة العربية وست ساعات، اكتشفت المشكلة. لم أخطط لقضاء ليلتي بهذه الطريقة. لكن تلك المعركة مع EAS Build علمتني كيف أبني خطوط أنابيب CI/CD محصنة لتطبيقات React Native—دون أن أفقد صوابي.
لماذا توقفت عن استخدام عمليات البناء اليدوية
اعتدت أن أفعل كل شيء محليًا: أوامر eas build، ثم الانتظار 15 دقيقة لكل نظام أساسي بينما تصرخ مروحة الكمبيوتر المحمول الخاص بي. لقد نجح الأمر في المشاريع الصغيرة مثل إثبات المفهوم لشركة لوجستية في دبي. ولكن مع العملاء الحقيقيين—مثل وكالة العقارات في أبو ظبي التي احتاجت إلى إصلاحات عاجلة للأخطاء في تطبيق القوائم ثنائي اللغة الخاص بهم—أصبح هذا غير مستدام.
قدم Expo’s EAS Build شيئًا أفضل: وحدات معالجة مركزية (workers) ذات توسع تلقائي، وبيئات بناء متسقة، ولا مزيد من مشكلات "يعمل على جهازي". ما هي المشكلة؟ الانتقال من "من المفترض أن يعمل" إلى "إنه يعمل بالفعل" يتطلب التعامل مع ملفات التكوين مثل eas.json وسير عمل GitHub Actions التي لا تتصرف بالطريقة التي تتوقعها.
إعداد EAS Build للتكامل المستمر/التسليم المستمر: الخطوات الحقيقية
- قم بتثبيت وتكوين EAS على جهازك أولاً
بدأت بتشغيل npm install -g eas-cli && eas login. إذا كان مشروعك يستخدم Expo SDK 54 (مثل Greeny Corner)، فقم بتشغيل eas build:configure لإنشاء ملفات التكوين الصحيحة.
- إنشاء ملفات تعريف بناء منفصلة
إليك كيف يبدو ملف eas.json الخاص بي لمعظم المشاريع:
`json
{
"build": {
"preview": {
"android": { "buildType": "apk" },
"ios": { "enterpriseProvisioning": "universal" }
},
"production": {
"ios": {
"distribution": "app-store",
"provisioningProfilePath": "credentials/ios_production.mobileprovision"
}
}
}
}
`
ما هو المفتاح هنا؟ لا تستخدم نفس ملف التعريف لعمليات البناء الخاصة بالتطوير والإنتاج. في المرة الأخيرة التي حاولت فيها ذلك لمشروع Laravel + React Native، انتهى بي الأمر بتحميل نسخة تصحيح أخطاء إلى متجر التطبيقات. لم يكن عميلي سعيدًا.
- ربط GitHub Actions بـ EAS
لقد جربت أدوات CI متعددة، لكن GitHub Actions يعمل بشكل أفضل مع Expo. ابدأ بإعداد رمز وصول شخصي في إعدادات المستودع الخاص بك. ثم قم بإنشاء .github/workflows/main.yml:
`yaml
name: Run EAS Build
on:
workflow_dispatch:
push:
branches:
- ci-cd
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: touch .easignore
- run: eas build --platform all
`
السطر touch .easignore هو خطوة ملتوية ولكنها ضرورية—تظهر أخطاء CLI إذا لم يكن موجودًا، حتى إذا لم تكن بحاجة إلى قواعد مخصصة.
كيف أتعامل مع متغيرات البيئة والأسرار
إذا كنت تعتقد أن إدارة ملفات .env في React Native كانت سيئة من قبل EAS، فحاول أتمتتها دون الكشف عن الأسرار. بالنسبة لتطبيق مالي قمت ببنائه في الدوحة العام الماضي، اضطررت إلى القيام بذلك بالطريقة الصحيحة:
- •الخطوة 1: قم بتخزين القيم الحساسة (مفاتيح API والشهادات) في GitHub Secrets.
- •الخطوة 2: قم بإضافة متغيرات البيئة غير الحساسة إلى
app.json:
`json
{
"expo": {
"name": "Project Name",
"plugins": [
[
"expo-build-properties",
{
"ios": {
"resourceClass": "m2"
}
}
]
]
}
}
`
- •الخطوة 3: قم بإدخال الأسرار في وقت الإنشاء باستخدام GitHub Actions:
`yaml
- run: eas build --platform ios --non-interactive
env:
API_KEY: ${{ secrets.API_KEY }}
`
كن حذرًا: يقوم EAS بتخزين عمليات البناء مؤقتًا بشكل مكثف. لقد أمضيت ذات مرة أربع ساعات لتتبع خطأ ناتج عن متغير قديم مخزن مؤقتًا. استخدم eas build:clear عندما تكون في شك.
المشكلات الشائعة التي أضاعت ساعاتي
ملفات تعريف تزويد iOS مفقودة
لقد لدغتني هذه المشكلة خلال أزمة Greeny Corner. بالنسبة لعمليات نشر iOS في الإمارات العربية المتحدة، أقوم الآن بذلك في كل مرة قبل البناء:
eas build:configure --platform ios
eas credentials --platform iosتعمل إدارة بيانات الاعتماد الآلية من Expo بنسبة 60٪ من الوقت. يتطلب الـ 40٪ الأخرى تحميل ملفات .mobileprovision يدويًا من بوابة Apple Developer.
عدم تطابق Android Keystore
لا تفقد الوصول إلى مفتاح التوقيع الخاص بك أبدًا. قمت ذات مرة بتحميل نسخة إصدار بمخزن مفاتيح اختبار لعميل في الرياض. اضطررنا إلى إزالة التطبيق من متجر Play وإعادة إطلاقه باسم حزمة جديد. إليك كيفية نسخ مفتاحك احتياطيًا:
eas build:submit --platform android --skip-confirmation
keytool -list -v -keystore ./release-key.keystoreالأسئلة الشائعة
### هل يمكنني استخدام EAS Build مع تطبيقات Expo Router؟
نعم. طالما أنك تستخدم SDK 47 أو أعلى (كما هو الحال في قائمة التحقق الخاصة بي لتحسين محركات البحث في الإمارات العربية المتحدة)، يدعم EAS مشاريع هيكل دليل التطبيقات خارج الصندوق. فقط تأكد من أن مسارات التنقل الخاصة بك تعمل عبر حدود الأنظمة الأساسية.
### هل أحتاج إلى GitHub Actions أم يمكنني استخدام أدوات CI أخرى؟
GitHub Actions هو مجرد ما أستخدمه يوميًا. بالنسبة لتطبيق رعاية صحية في الكويت، قمت بتكوين EAS Build على GitLab CI بدلاً من ذلك. تنطبق نفس المبادئ: تتحكم إدارة الإصدار في عمليات البناء، ويتم إدخال الأسرار من خلال خط الأنابيب.
### كيف يمكنني اختبار EAS Build قبل الأتمتة؟
قم بتشغيل eas build --local لاختبار عمليات بناء Android على جهازك. لا تزال بحاجة إلى جهاز macOS لعمليات بناء iOS. بالنسبة للعملاء الذين لا يفهمون سبب استغراق iOS وقتًا أطول: أخبرهم أن Apple قررت جعل الأمور "أكثر تميزًا".
### يستمر انهيار EAS Dev Build الخاص بي بعد الإعداد—لماذا؟
تحقق مما إذا قمت باستيراد وحدة خارجية تتطلب ربطًا أصليًا. حدث ذلك لي مع react-native-google-maps على تطبيق نقل في الرياض. لا يمكن لـ EAS DevClient ربط الوحدات الأصلية تلقائيًا بنفس طريقة Expo Go—ستحتاج إلى إنشاء عميل تطوير مخصص.
هل تريد مساعدة في إعداد EAS Build؟
يمكن أن تكون خطوط أنابيب CI/CD مؤلمة عندما تكون بصدد التعامل مع ثلاثة مواعيد نهائية للعملاء ورحلة طيران إلى جدة. إذا كنت ترغب في تخطي الصداع والحصول على هذا الإصدار الذي يعمل في المرة الأولى، احجز استشارة مجانية لمناقشة مشروعك. لقد فعلت ذلك لأكثر من 40 تطبيقًا في جميع أنحاء الخليج، وأنا أعرف بالضبط أين تختبئ الفخاخ.