【问题标题】:How can I host an Android APK file for every pull-request, so QA can test them before merging?如何为每个拉取请求托管一个 Android APK 文件,以便 QA 可以在合并之前对其进行测试?
【发布时间】:2019-03-02 10:12:34
【问题描述】:

为了改进我们的 QA 工作流程,我们希望在 Github 上为每个 pull-request 自动构建一个 APK 文件,以便我们可以在分支合并之前对其进行测试。我们已经想出了如何构建文件,但我们现在想知道如何将它集成到我们的工作流程中。

似乎大多数可用的 Beta 程序(例如 Crashlytics Beta、Google Play)主要集中在发布前不久创建一个 Beta 版本,但不允许并行托管多个 APK。

以下是我们理想工作流程的示例:

  1. 开发人员完成编码并创建拉取请求
  2. 测试运行
  3. 如果测试成功,则会自动构建一个 APK 并上传到某处(这是我们正在尝试解决的部分)
  4. QA 会查看拉取请求,应该能够在他们的测试设备上轻松下载正确的 APK
  5. 如果在 QA 期间没有问题,则合并拉取请求
  6. APK 文件被自动删除

我们特别不想在合并拉取请求后测试 APK,而是在我们的开发分支中弹出更少的错误之前进行测试。

【问题讨论】:

标签: android github continuous-integration qa


【解决方案1】:

实际上 Crashlytics 允许拥有多个版本的 APK。 每个版本都可以有各自的版本字符串,当然还有release notes,以帮助QA 找到正确的APK。

问题的第 3 点可以这样描述: CI 配置为将构建上传到 Crashlytics。 可以通过gradle task来实现:

gradle assembleRelease crashlyticsUploadDistributionRelease

对于这种情况,使用特殊的构建类型 (pullrequest) 非常有用。您可以通过分发组、构建通知和发行说明指定特殊分发规则。

build.gradle:

//example function for change log 
def getLastGitCommitMessage() {
  try {
    "git log -1 --pretty=%B".execute().text.trim()
  } catch (e) {
    'Undefined message.'
  }
}

android {
  buildTypes {
    ...
    pullrequest { 
      //invitation
      ext.betaDistributionGroupAliases = "QA, devs"
      // notification
      ext.betaDistributionNotifications = true
      // last commit message as release notes
      ext.betaDistributionReleaseNotes = getLastGitCommitMessage()
    }
  }
}

在这种情况下,构建和上传命令将是这样的:

gradle assemblePullrequest crashlyticsUploadDistributionPullrequest

【讨论】:

  • 如果您可以添加 how,这对 OP 来说似乎是一个有用的答案
  • 那个链接很有帮助,我想我们首先尝试这个建议。您会考虑从博文中提取相关信息到您的答案中吗?如果博客文章失败,那么我们将不再有答案。不管怎样,我把赏金给了你,因为它对我们的案子最有帮助。谢谢
【解决方案2】:

有很多方法可以实现它。但在我看来,最好的方法是创建将生成 apk 为artefact 的下一个阶段,然后您的 QA 团队将能够在设备上下载 apk 并对其进行测试。作为 anaxad wrote,您还可以使用邮件和分发列表发送 apk 文件。但是这样的解决方案会更加困难,因为您需要创建将使用 apk 发送邮件的任务(例如使用 docker)。

【讨论】:

    【解决方案3】:

    让您的系统成为服务器。

    然后在生成 APK 时,提供您的服务器路径。 如果您这样做,那么每次您的 apk 都会更新, 所以你需要使用一个变量吗?这将决定您的 apk 是否部署在本地服务器上。

    完成您的开发后,将其设为 true,然后您的 apk 将复制到您的本地服务器上。然后 QA 团队可以轻松访问它。

    Follow this question.

    一些演示代码。

    debug {
       applicationVariants.all { variant ->
           variant.outputs.each { output ->
               def apk = output.outputFile;
               def newName;
               newName = apk.name.replace("-" + variant.buildType.name, "")
                       .replace(project.name, name);
               newName = newName.replace("-", "-" + version + "-" + milestone +
                       "-" + build + "-");
               output.outputFile = new File(apk.parentFile, newName);
           }
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多