一天在GitHub上为Android提升CI

你好!

随着Github Actions的出现他主动采取了行动,并将简单(但非常有效)的CI / CD集成到了我们规模很小但已经有2年历史的Flowwow项目中

做什么的?



也许有些开发人员没有犯错误,但是在这里我不是其中的一个,因此偶尔会发生如此小的崩溃,因此您必须紧急发布一个新版本并进行编辑或回滚到以前的版本。但是,在用户偶然发现应用程序崩溃的那些小时中,客户之间以及负责任的开发人员的心情都不会消失。

我将在下面介绍如何最小化生产中的fakapy。

为什么我个人有这样的fakap?

  1. 不安全的代码段
  2. 他们带来了一些图书馆,图书馆偶尔崩溃
  3. 将某些库(通常是分析库)更新为不稳定版本

只需1分,代码审查,单元测试,静态代码分析,UI测试,手动测试将为我们提供帮助。

2-3分-仅UI测试和手动测试。

仍然仅是要使它自动化。在这个阶段,选择权落在了刚刚出现的Github Actions上,收益和项目代码都在Github上。我必须马上说,对于一个免费的github帐户,每月有2,000分钟的免费操作。

从哪儿开始?


充满了各种语言和框架的现成示例。这是通过位于项目存储库中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

描述:对于每次推送,使用ubuntu OS 的github虚拟机上的任何分支都会启动一个任务任务步骤:签出我们的代码,配置jdk,运行gradle任务进行汇编。

如果没有成功通过某个步骤,我们将



在您看到日志的地方看到这样的图片

方便的是,通过Pull Request,我们会立即看到我们的测试序列已失败。



而且,如果您将github与Slack集成在一起,那么它也会



现在一点一点


1.单元测试

您使用junit,mockito等编写了单元测试。

现在,通过添加适当的gradle任务,您的测试将包括在测试序列中。

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

2.静态代码分析

,您可以使用简单的棉短绒(detekt -为科特林,pmd的 -对Java)。
或者更复杂的选择是sonarqube

对于简单的lint(例如,我们同时拥有java和kotlin):

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

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

如果是声纳曲比 -有关调整的更多信息- 这里

- 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. UI测试

编写UI测试是您的想象力,我的方法是模拟应用程序中用户的标准操作的“冒烟”测试-登录,选择产品,下订单,跟踪订单。您可以使用UIAutomator,Espresso,Kaspresso。

还有两个可供选择的启动选项-github虚拟机上的仿真器或Firebase Test Lab等云服务
要在github中使用仿真器,有现成的实现:一个两个

对于Firebase测试实验室,您必须通过gcloud CLI使用Google Cloud Platform

- 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密钥上传到github机密中的 base64 以便在gcloud中进行授权

在我的情况下,常规配置如下所示。任务由主服务器中PR事件触发

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

看起来很简单。效率取决于书面测试和所选的代码分析规则。您可以编写几个独立的任务(作业)以并行运行它们。就我而言,一切都是按顺序进行的。在我们的项目(虚拟机github 2核CPU,7 GB RAM,14 GB SSD)上,验证过程大约需要15分钟,但这并不是很关键,只要您用眼睛对它进行“编码”,这些测试的结果也会到来。

UI测试最有帮助-碰巧,在更新库之后,分析会崩溃,而您只是知道不应该更新它。

通过gcloud,您还可以将构建版本交付给Firebase App Distribution,发布到Google Play等。在这里这里

可以看到许多有用的示例
我希望本文对某人有用。祝您好运,减少生产崩溃!

All Articles