Как я могу разместить файл APK для Android для каждого запроса pull-запроса, поэтому QA может протестировать их перед слиянием?

Чтобы улучшить рабочий процесс QA, мы хотим автоматически создать файл APK для каждого запроса на загрузку в Github, чтобы мы могли протестировать его до того, как ветка будет объединена. Мы уже выяснили, как создать файл, но теперь мы задаемся вопросом, как интегрировать это в наш рабочий процесс.

Похоже, что большинство доступных бета-программ (например, Crashlytics Beta, Google Play) в основном сосредоточены на создании одной бета-версии незадолго до релиза, но не позволяют параллельно размещать несколько APK.

Вот пример нашего идеального рабочего процесса:

  1. Разработчик заканчивает кодирование и создает запрос pull
  2. Проводятся тесты
  3. Если тесты успешны, APK создается автоматически и загружается где-то (часть, которую мы пытаемся выяснить)
  4. QA рассматривает запрос pull-запроса и должен иметь возможность легко загрузить правильный APK на своем тестовом устройстве
  5. Если во время QA нет проблем, запрос на извлечение объединяется
  6. Файл APK автоматически удаляется

Мы специально не хотим тестировать APK после того, как запрос pull был объединен, но вместо этого протестируйте, чтобы в нашей ветке разработки появилось меньше ошибок.

Ответ 1

На самом деле Crashlytics позволяют иметь несколько версий APK. Версия Ech может иметь собственную строку Version и, конечно же, примечания к выпуску, чтобы помочь QA найти правильный APK.

Точка 3 из вопроса может быть описана следующим образом: CI настроен на загрузку сборки в Crashlytics. Это может быть достигнуто с помощью задачи градиента:

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

Ответ 2

Сделайте свою систему сервером.

После этого во время создания APK укажите путь к серверу. Если вы это сделаете, то каждый раз, когда ваш апк будет обновляться, вам нужно использовать одну переменную? Который решит ваше развертывание apk на вашем локальном сервере или нет.

После завершения разработки, сделайте это правдой, а затем ваш apk скопирует на ваш локальный сервер. Тогда он легко доступен команде QA.

Следуйте этому вопросу.

Некоторые демо-коды.

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);
       }
   }
}

Ответ 3

Есть много способов достичь этого. Но, на мой взгляд, лучший способ - это создать следующий этап, который будет представлять apk как артефакт, и позже ваша команда QA сможет загрузить apk на устройство и протестировать его. Как пишет anaxad, вы также можете отправить файл apk, используя почту и список рассылки. Но такое решение будет более сложным, потому что вам нужно создать задачу (например, с помощью docker), которая будет отправлять почту с помощью apk.