كيفية استخدام GitHub Actions لأتمتة تطوير تطبيقات أندرويد

دقائق القراءة: 6

مقدمة: لماذا نحتاج إلى أتمتة تطوير تطبيقات أندرويد؟

في مشاريع Android الحديثة، تتكرر مجموعة من المهام بشكل شبه يومي: تشغيل الاختبارات، التأكد من أن التطبيق يُبنى بنجاح بعد دمج التعديلات، وتجهيز النسخ الجاهزة للنشر. هذه الأعمال مهمة للغاية، لكنها قد تستهلك وقت الفريق وتشتت تركيزه عن تطوير الميزات وتحسين تجربة المستخدم.

هنا يظهر دور GitHub Actions كحل عملي وفعّال. فمن خلاله يمكنك إنشاء سير عمل آلي ينفذ المهام المتكررة بمجرد حدوث أحداث محددة داخل المستودع، مثل فتح Pull Request أو طلب تشغيل يدوي أو إرسال تغييرات إلى الفرع الرئيسي.

أتمتة تطوير تطبيقات أندرويد باستخدام GitHub Actions ضمن بيئة تطوير حديثة

من أبرز المهام التي يمكن أتمتتها في مشاريع أندرويد:

  • تشغيل اختبارات المشروع تلقائياً.
  • التحقق من نجاح عملية البناء قبل دمج التعديلات.
  • إنشاء ملفات النشر مثل APK أو AAB.
  • توقيع التطبيق ونشره إلى Google Play.

والنتيجة هي دورة تطوير أكثر استقراراً، وأخطاء أقل، ووقت أكبر للتركيز على العمل الفعلي بدلاً من العمليات اليدوية المرهقة.

ما هي GitHub Actions؟

GitHub Actions هي ميزة داخل منصة GitHub تتيح لك تشغيل أوامر وإجراءات آلية استجابةً لأحداث معينة تقع داخل المستودع. عملياً، أنت تكتب ملف إعداد بصيغة YAML يوضح:

  • ما الذي يجب تنفيذه.
  • ومتى يجب تنفيذه.

غالباً ما يكون هذا الملف بامتداد .yml، وقد يبدو بالشكل التالي:

name: My GitHub Action
on: pull_request
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1

شرح مكونات الملف السابق

  • name: اسم سير العمل الذي سيظهر داخل واجهة GitHub.
  • on: الحدث الذي سيؤدي إلى تشغيل الإجراء، مثل فتح Pull Request.
  • jobs: قائمة بالمهام الرئيسية التي سيتم تنفيذها.
  • runs-on: يحدد نوع البيئة الافتراضية المستخدمة، مثل Ubuntu أو Windows أو macOS.
  • steps: المراحل أو الخطوات المتسلسلة داخل كل مهمة.
  • uses: استدعاء إجراء جاهز من إجراءات GitHub أو من المجتمع.

ورغم أن المثال السابق بسيط، فإنه يوضح البنية الأساسية لأي ملف عمل في GitHub Actions. ومن المهم أيضاً معرفة أن جميع ملفات سير العمل يجب أن توضع داخل المسار التالي في المشروع:

.github/workflows

مكان حفظ ملفات GitHub Actions داخل مجلد workflows في المشروع

إنشاء GitHub Action للتحقق من طلبات السحب

سواء كنت تعمل منفرداً أو ضمن فريق، فمن الضروري التأكد من أن التطبيق مستقر قبل دمج أي تعديل جديد. لذلك من الأفضل تشغيل البناء والاختبارات تلقائياً مع كل Pull Request.

في هذا السيناريو، سننفذ الخطوات التالية:

  1. إعداد نسخة JDK.
  2. تعديل صلاحيات ملف Gradle Wrapper.
  3. تشغيل الاختبارات.
  4. بناء المشروع.
name: Android Build
on: pull_request
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Set Up JDK
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Change wrapper permissions
        run: chmod +x ./gradlew
      - name: Run Tests
        run: ./gradlew test
      - name: Build Project
        run: ./gradlew assemble

ماذا يفعل هذا الإجراء؟

  • الخطوة actions/checkout@v1 تسحب كود المشروع إلى البيئة الافتراضية.
  • الخطوة actions/setup-java@v1 تجهز إصدار Java المطلوب.
  • الأمر chmod +x ./gradlew يمنح ملف gradlew صلاحية التنفيذ داخل بيئة Linux.
  • الأمر ./gradlew test يشغل الاختبارات.
  • الأمر ./gradlew assemble يبني التطبيق للتأكد من سلامة الشيفرة.

تجدر الإشارة إلى أن خطوة تعديل الصلاحيات مهمة جداً، لأن البيئة الافتراضية قد لا تتمكن من تنفيذ أوامر Gradle من دونها.

أتمتة نشر التطبيق باستخدام GitHub Actions

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

لكن هذا السيناريو أكثر تقدماً، لأنه يعتمد على GitHub Secrets لتخزين البيانات الحساسة بأمان.

ما هي GitHub Secrets؟

هي وسيلة لحفظ القيم الحساسة داخل المستودع على هيئة متغيرات سرية، مثل كلمات المرور، مفاتيح التوقيع، وبيانات حسابات الخدمة. نحتاجها هنا لسببين رئيسيين:

  • توقيع التطبيق قبل النشر.
  • منح الإجراء صلاحية رفع النسخة إلى Google Play Store.

كيفية إنشاء GitHub Secret

  1. ادخل إلى الصفحة الرئيسية للمستودع.
  2. افتح تبويب Settings.
  3. من القائمة الجانبية اختر Secrets.
  4. اضغط على زر New repository secret.

الدخول إلى إعدادات المستودع في GitHub لإنشاء القيم السريةخيار Secrets في مستودع GitHub لإدارة القيم السريةزر إنشاء Secret جديد داخل مستودع GitHub

ملف النشر الآلي لتطبيق أندرويد

name: Android Publish
on:
  workflow_dispatch:
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Set Up JDK
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Change wrapper permissions
        run: chmod +x ./gradlew
      - name: Run Tests
        run: ./gradlew test
      - name: Build Project
        run: ./gradlew build
      - name: Build Release AAB
        run: ./gradlew bundleRelease
      - name: Sign AAB
        uses: r0adkll/sign-android-release@v1
        with:
          releaseDirectory: app/build/outputs/bundle/release
          signingKeyBase64: ${{ secrets.SIGN_KEY }}
          alias: ${{ secrets.ALIAS }}
          keyStorePassword: ${{ secrets.STORE_KEY_PASSWORD }}
          keyPassword: ${{ secrets.KEY_PASSWORD }}
      - name: Deploy to Play Store
        uses: r0adkll/upload-google-play@v1
        with:
          serviceAccountJsonPlainText: ${{secrets.SERVICE_ACCOUNT}}
          packageName: com.tomerpacific.laundry
          releaseFiles: app/build/outputs/bundle/release/app-release.aab
          track: production

ما المقصود بـ workflow_dispatch؟

هذا الحدث يعني أن سير العمل يمكن تشغيله يدوياً من داخل GitHub. وهو خيار مفيد عندما تريد التحكم في وقت النشر بدقة. وبالطبع يمكنك استبداله بأحداث أخرى، مثل تنفيذ النشر عند وصول push إلى الفرع الرئيسي.

شرح خطوات النشر

  • ./gradlew bundleRelease: ينشئ ملف .aab المخصص للنشر.
  • الخطوة Sign AAB: توقّع الملف باستخدام بيانات التوقيع المخزنة في Secrets.
  • الخطوة Deploy to Play Store: ترفع ملف التطبيق إلى متجر Google Play.

ولكي تعمل هذه العملية بنجاح، يجب إنشاء القيم السرية التالية:

  • secrets.SIGN_KEY: مفتاح التوقيع بصيغة Base64.
  • secrets.ALIAS: الاسم المختصر للمفتاح.
  • secrets.STORE_KEY_PASSWORD: كلمة مرور ملف التخزين.
  • secrets.KEY_PASSWORD: كلمة مرور المفتاح نفسه.
  • secrets.SERVICE_ACCOUNT: محتوى ملف حساب الخدمة بصيغة JSON.

إنشاء Service Account لرفع التطبيق إلى Google Play

لكي يتمكن GitHub Action من رفع التطبيق نيابةً عنك، يحتاج إلى هوية موثوقة لدى خدمات Google. وهنا يأتي دور Service Account.

Service Account هو كيان برمجي يُستخدم لتمثيل خدمة أو تطبيق يتفاعل مع أنظمة Google بالنيابة عنك. في حالتنا، سيُستخدم للسماح لسير العمل برفع نسخ التطبيق إلى Google Play Store.

خطوات إنشاء حساب خدمة

  1. انتقل إلى Google Cloud Console.
  2. من القائمة الجانبية اختر Service Accounts.
  3. أنشئ حساب خدمة جديداً.
  4. أدخل الاسم والوصف المناسبين.
  5. اختر الدور Basic → Editor.
  6. أضف بريدك الإلكتروني في خطوة منح الوصول.

صفحة Service Accounts في Google Cloud Consoleإنشاء حساب خدمة جديد في Google Cloudإدخال اسم ووصف Service Account في Google Cloudاختيار صلاحية Editor لحساب الخدمة في Google Cloudمنح المستخدمين حق الوصول إلى حساب الخدمة في Google Cloud

إنشاء مفتاح لحساب الخدمة

بعد إنشاء الحساب، ستحتاج إلى إنشاء مفتاح تعريف يستخدمه GitHub Action عند الاتصال بـ Google Play.

  1. من شاشة حسابات الخدمة، اضغط على قائمة الإجراءات ذات النقاط الثلاث.
  2. اختر Manage keys.
  3. اضغط New Key ثم Create new key.
  4. اترك التنسيق على JSON.
  5. اضغط Create لتنزيل الملف.

إدارة مفاتيح حساب الخدمة في Google Cloudإنشاء مفتاح جديد لحساب الخدمة في Google Cloudاختيار تنسيق JSON عند إنشاء مفتاح حساب الخدمة

بعد تنزيل الملف، احتفظ به جيداً، لأنك لن تتمكن غالباً من تنزيل المحتوى نفسه مرة أخرى. بعد ذلك، انسخ محتواه وأضفه إلى GitHub Secret باسم secrets.SERVICE_ACCOUNT.

ربط Service Account مع Google Play Console

إنشاء حساب الخدمة وحده لا يكفي. يجب أيضاً منح هذا الحساب الصلاحيات المناسبة داخل Google Play Console.

  1. سجّل الدخول إلى Google Play Console.
  2. انتقل إلى Setup → API Access.
  3. مرر إلى قسم Service Accounts.
  4. ستجد الحساب الذي أنشأته مسبقاً، ثم اضغط Grant Access.

منح حساب الخدمة صلاحية الوصول داخل Google Play Console

بعدها، من إعدادات الصلاحيات:

  • افتح قسم App permissions وحدد التطبيق المطلوب.
  • في قسم Account permissions، فعّل الصلاحيات المتعلقة بالإصدارات.
  • راجع بقية الأذونات بعناية قبل منحها.
  • اضغط Invite user لإتمام الربط.

تحديد أذونات التطبيق والإصدارات لحساب الخدمة في Google Play Console

بعد إرسال الدعوة وتفعيل الصلاحيات، يصبح بإمكانك تشغيل سير العمل المسؤول عن النشر إلى المتجر.

مراقبة سير العمل داخل GitHub

لمتابعة جميع الإجراءات المعرّفة في المستودع، انتقل إلى تبويب Actions. هناك ستشاهد جميع ملفات workflow بالإضافة إلى جميع مرات التشغيل السابقة.

واجهة GitHub Actions لعرض جميع workflows في المستودع

في هذه الصفحة يمكنك:

  • عرض كل إجراءات الأتمتة المتوفرة.
  • معرفة الحالات السابقة لكل تشغيل.
  • فتح تشغيل محدد لمراجعة السجلات logs.
  • تشغيل الإجراء يدوياً إذا كان يعتمد على workflow_dispatch.

صفحة تفاصيل workflow داخل GitHub Actions مع خيار التشغيل اليدوي

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

وعندما يكون إجراء التحقق من Pull Request مضبوطاً بشكل صحيح، فستظهر حالة النجاح مباشرة ضمن صفحة الطلب نفسه.

نجاح GitHub Action المرتبط بطلب السحب Pull Request

أفضل ممارسات عند استخدام GitHub Actions لمشاريع أندرويد

  • احفظ جميع البيانات الحساسة داخل GitHub Secrets ولا تضعها في المستودع مباشرة.
  • افصل بين سير عمل التحقق وسير عمل النشر لتسهيل الصيانة.
  • اجعل تشغيل النشر يدوياً في البداية إلى أن تتأكد من استقرار العملية.
  • راجع الصلاحيات الممنوحة لحساب الخدمة بشكل دوري.
  • راقب سجلات التنفيذ بعد كل تعديل على ملفات workflow.

الخلاصة التقنية

استخدام GitHub Actions في مشاريع Android ليس مجرد تحسين شكلي لبيئة العمل، بل هو خطوة عملية نحو بناء خط أنابيب احترافي لـ CI/CD. فعند أتمتة الاختبارات والبناء والتوقيع والنشر، تقل الأخطاء البشرية وتزداد موثوقية الإصدارات بشكل واضح. وإذا أُعدت الصلاحيات وملفات الإعداد بصورة صحيحة، فستتحول عملية النشر من مهمة يدوية مرهقة إلى إجراء ثابت يمكن الاعتماد عليه بثقة.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *