Meningkatkan CI di github untuk Android dalam sehari

Halo!

Dengan munculnya Tindakan Github, ia mengambil inisiatif dan mengintegrasikan CI / CD sederhana (tapi cukup efektif) ke dalam proyek Flowwow live kami yang kecil, tetapi sudah berusia 2 tahun .

Untuk apa?



Mungkin ada beberapa pengembang yang tidak membuat kesalahan, tapi di sini saya bukan salah satu dari mereka, jadi kadang-kadang, tetapi ledakan kecil seperti itu terjadi dan Anda harus segera merilis versi baru dengan pengeditan atau kembalikan ke versi sebelumnya. Tapi jam-jam di mana pengguna menemukan crash aplikasi tidak tetap tanpa jejak di antara pelanggan dan dalam mood pengembang yang bertanggung jawab.

Bagaimana meminimalkan pemalsuan pada produksi, saya akan katakan di bawah ini.

Mengapa saya secara pribadi memiliki fakap seperti itu?

  1. Cuplikan kode tidak aman
  2. Mereka membawa beberapa perpustakaan dan crash secara situasional
  3. Diperbarui beberapa perpustakaan (biasanya analitik) ke versi yang tidak stabil

Dengan 1 poin, tinjauan kode, Tes unit, analisis kode statis, tes UI, pengujian manual akan membantu kami.

Dengan 2-3 poin - hanya tes UI dan pengujian manual.

Tetap hanya untuk mengotomatisasi ini. Pada tahap ini, pilihan jatuh pada Tindakan Github yang baru saja muncul , manfaat dan kode proyek ada di Github. Saya harus mengatakan segera, untuk akun github gratis, ada 2.000 menit aksi gratis per bulan.

Mulai dari mana?


Itu penuh dengan contoh-contoh siap pakai untuk berbagai bahasa dan kerangka kerja. Hal ini dikonfigurasi melalui file konfigurasi YAML , yang terletak di repositori proyek.



Contoh minimal untuk 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

Deskripsi: untuk setiap dorongan, tugas diluncurkan pada cabang apa pun di mesin virtual github dengan OS ubuntu. Langkah-langkah tugas: checkout kode kami, konfigurasikan jdk, jalankan tugas gradle untuk perakitan.

Dalam hal bagian langkah yang tidak berhasil, kita akan melihat gambar seperti itu di



sana Anda dapat melihat log.

Sangat nyaman bahwa dengan Permintaan Tarik kami akan segera ditampilkan bahwa urutan pengujian kami telah gagal.



Dan jika Anda memiliki integrasi github dengan Slack, maka itu juga



Sekarang poin demi poin


1. Tes unit

Anda menulis Tes unit menggunakan junit, mockito, dll.

Sekarang tes Anda termasuk dalam urutan tes dengan menambahkan tugas gradle yang sesuai.

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

2. Analisis kode statis

Anda dapat menggunakan linter sederhana ( detekt - untuk kotlin, pmd - untuk java).
Atau opsi yang lebih rumit adalah sonarqube .

Dalam kasus linter sederhana (misalnya, kami memiliki java dan kotlin):

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

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

dalam kasus sonarqube - lebih lanjut tentang tuning - di sini

- 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. Tes UI

Menulis tes UI adalah bagian dari imajinasi Anda, pendekatan saya adalah tes "Asap" yang mensimulasikan tindakan standar pengguna dalam aplikasi - masuk, pilih produk, pesan, lacak pesanan. Anda dapat menggunakan UIAutomator, Espresso, Kaspresso.

Ada juga 2 opsi untuk diluncurkan di sini - sebuah emulator pada mesin virtual github atau layanan cloud seperti Firebase Test Lab.
Untuk menggunakan emulator di dalam github, ada implementasi yang sudah jadi: satu dan dua .

Dalam kasus Firebase Test Lab, Anda harus bekerja dengan Google Cloud Platform melalui CLI gcloud

- 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

Agar ini berfungsi, Anda perlu membuat proyek di Firebase, membuat akun layanan dengan hak admin di Google Cloud Console, dan mengunggah kunci json yang diterima ke base64 di rahasia github untuk otorisasi di gcloud .

Konfigurasi umum dalam kasus saya terlihat seperti ini. Tugas dipicu oleh acara PR di master

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

Tampaknya sederhana. Efisiensi tergantung pada tes tertulis dan aturan analisis kode yang dipilih. Anda dapat menulis beberapa tugas independen (pekerjaan) untuk menjalankannya secara paralel. Dalam kasus saya, semuanya berjalan berurutan. Proses verifikasi memakan waktu sekitar 15 menit pada proyek kami (mesin virtual github 2-core CPU, 7 GB RAM, 14 GB SSD), tetapi itu tidak terlalu penting, selama Anda "kode" dengan mata Anda, hasil tes ini juga tiba.

Tes UI paling membantu - itu terjadi selama bagian mereka analitik lumpuh setelah memperbarui perpustakaan dan Anda hanya mengerti bahwa Anda tidak harus memperbaruinya.

Melalui gcloud, Anda juga dapat mengirimkan build ke Firebase App Distribution, rilis ke Google Play, dll.

Banyak contoh berguna dapat dilihat di sini dan di sini .
Semoga artikel ini bermanfaat bagi seseorang. Semoga berhasil dan lebih sedikit crash pada produksi!

All Articles