رفع CI على جيثب للأندرويد في يوم واحد

مرحبا!

مع ظهور Github Actions ، أخذ زمام المبادرة ودمج CI / CD بسيط (ولكنه فعال للغاية) في مشروع Flowwow الصغير الذي يبلغ من العمر عامين بالفعل .

لماذا؟



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

كيفية تقليل fakapy عند الإنتاج ، سأقول أدناه.

لماذا أنا شخصيا لدي مثل هذا fakap؟

  1. مقتطف رمز غير آمن
  2. لقد أحضروا بعض المكتبات وتعطل الموقع
  3. تحديث بعض المكتبات (التحليلات عادة) إلى إصدار غير مستقر

من خلال نقطة واحدة ، ستساعدنا مراجعة الرمز ، واختبارات الوحدة ، وتحليل الشفرة الثابتة ، واختبارات واجهة المستخدم ، والاختبار اليدوي.

مع 2-3 نقاط - فقط اختبارات واجهة المستخدم والاختبار اليدوي.

يبقى فقط لأتمتة هذا. في هذه المرحلة ، وقع الاختيار على إجراءات Github التي ظهرت للتو ، وكانت الفائدة ورمز المشروع على Github. يجب أن أقول على الفور ، لحساب github المجاني ، هناك 2000 دقيقة عمل مجانية في الشهر.

من أين أبدا؟


وهي مليئة بأمثلة جاهزة للعديد من اللغات والأطر. يتم تكوين هذا الشيء من خلال ملف تكوين YAML ، الموجود في مستودع المشروع.



الحد الأدنى من المثال لنظام Android:

name: Android CI

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Build with Gradle
        run: ./gradlew assembleDebug

الوصف: لكل دفعة ، يتم إطلاق مهمة على أي فرع على الجهاز الظاهري github مع نظام تشغيل أوبونتو. خطوات المهمة: تحقق من الكود الخاص بنا ، قم بتكوين jdk ، قم بتشغيل مهام gradle للتجميع.

في حالة عدم نجاح الخطوة ، سنرى مثل هذه الصورة



هناك يمكنك رؤية السجلات.

من المريح أنه مع طلب السحب ، سنظهر لك على الفور أن تسلسل الاختبار قد فشل.



وإذا كان لديك تكامل مع github مع Slack ، فإنه أيضًا



الآن نقطة بنقطة


1. اختبارات الوحدة

لقد كتبت اختبارات الوحدة باستخدام junit ، mockito ، إلخ.

الآن يتم تضمين اختباراتك في تسلسل الاختبار عن طريق إضافة مهمة التدرج المناسبة.

- name: Run some unit tests
  run: ./gradlew testStageDebugUnitTest

2. تحليل ثابت للكود

يمكنك استخدام نسالة بسيطة ( detekt - for kotlin، pmd - for java).
أو الخيار الأكثر تعقيدًا هو sonarqube .

في حالة الوبر البسيط (على سبيل المثال ، لدينا جافا و kotlin):

task("checkAll") {
    group "Verify"
    description "Runs all static checks on the build"
    dependsOn "pmd", "detekt"
}

- name: Run some unit tests
  run: ./gradlew checkAll

في حالة sonarqube - المزيد عن الضبط - هنا

- uses: actions/checkout@v1
- name: SonarCloud Scan
   run: ./gradlew jacocoUnitTestReport sonarqube -Dsonar.login=${{ secrets.SONAR_TOKEN }} --stacktrace
   env:
     GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Link to SonarCloud Report
   run: echo "https://sonarcloud.io/dashboard?id=.."

3. اختبارات واجهة المستخدم

كتابة اختبار واجهة المستخدم هو جزء من خيالك ، نهجي هو اختبار "دخان" واحد يحاكي الإجراءات القياسية للمستخدم في التطبيق - قم بتسجيل الدخول ، حدد منتجًا ، ضع طلبًا ، تتبع الطلب. يمكنك استخدام UIAutomator و Espresso و Kaspresso.

هناك أيضا 2 خيارات لإطلاق هنا - مقلدا على جيثب آلة أو سحابة الخدمات الافتراضية مثل . Firebase اختبار مختبر
لاستخدام محاكي داخل جيثب، هناك الجاهزة تطبيقات: واحد و اثنين .

في حالة Firebase Test Lab ، يجب أن تعمل مع Google Cloud Platform عبر gcloud CLI

- name: prepare gcloud
  uses: GoogleCloudPlatform/github-actions/setup-gcloud@master
  with:
    version: latest
    service_account_email:  ${{ secrets.SA_EMAIL }}
    service_account_key: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}
- name: gcloud Set up project
  run: |
    gcloud config set project ${{ secrets.PROJECT_ID }}
- name: Assemble apks for smoke test
  run: ./gradlew Smoke
- name: Run tests in test lab
  run: |
     gcloud firebase test android run \
       --app app/build/outputs/apk/production/debug/app.apk \
       --test app/build/outputs/apk/androidTest/production/debug/appTest.apk \
       --device model=Nexus6P,version=25,orientation=portrait,locale=en_US \
       --device model=athene,version=23,orientation=portrait,locale=en_US \
       --device model=sailfish,version=26,orientation=portrait,locale=en_US

لكي يعمل هذا ، تحتاج إلى إنشاء مشروع في Firebase ، وإنشاء حساب خدمة بحقوق المشرف في Google Cloud Console ، وتحميل مفتاح json المستلم إلى base64 في أسرار github للحصول على تفويض في gcloud .

يبدو التكوين العام في حالتي مثل هذا. يتم تشغيل المهمة بواسطة حدث العلاقات العامة الرئيسي

name: Android CI

on:
  pull_request:
    branches:
      - 'master'

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v1
      - name: set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8
      - name: Run static checks
        run: ./gradlew checkAll
      - name: Run some unit tests
        run: ./gradlew testStageDebugUnitTest

      - name: prepare gcloud
        uses: GoogleCloudPlatform/github-actions/setup-gcloud@master
        with:
          version: latest
          service_account_email:  ${{ secrets.SA_EMAIL }}
          service_account_key: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}
      - name: gcloud Set up project
        run: |
          gcloud config set project ${{ secrets.PROJECT_ID }}
      - name: Assemble apks for smoke test
        run: ./gradlew Smoke
      - name: Run tests in test lab
        run: |
          gcloud firebase test android run \
            --app app/build/outputs/apk/production/debug/app.apk \
            --test app/build/outputs/apk/androidTest/production/debug/appTest.apk \
            --device model=Nexus6P,version=25,orientation=portrait,locale=en_US \
            --device model=athene,version=23,orientation=portrait,locale=en_US \
            --device model=sailfish,version=26,orientation=portrait,locale=en_US

يبدو بسيطا. تعتمد الكفاءة على الاختبارات المكتوبة وقواعد تحليل الكود المحددة. يمكنك كتابة عدة مهام مستقلة (مهمة) لتشغيلها بالتوازي. في حالتي ، كل شيء يسير بالتتابع. تستغرق عملية التحقق حوالي 15 دقيقة في مشروعنا (وحدة المعالجة المركزية github للجهاز الظاهري ثنائية النواة ، و 7 غيغابايت من ذاكرة الوصول العشوائي ، و 14 غيغابايت من SSD) ، ولكنها ليست حاسمة حقًا ، طالما أنك "ترميزها" بعينيك ، فإن نتائج هذه الاختبارات تصل أيضًا.

تساعد اختبارات واجهة المستخدم إلى أقصى حد - يحدث أثناء مرور التحطم أن تعطل التحليلات بعد تحديث المكتبة وأنت تفهم فقط أنه لا يجب عليك تحديثها.

من خلال gcloud ، يمكنك أيضًا توصيل الإصدارات إلى Firebase App Distribution ، والإصدار إلى Google Play ، إلخ.

ويمكن رؤية العديد من الأمثلة المفيدة هنا و هنا .
آمل أن تكون هذه المقالة مفيدة لشخص ما. حظا سعيدا وأعطال أقل على الإنتاج!

All Articles