Код версии с Xamarin через VSTS в Google Play

Возможно ли каким-либо образом или каков наилучший сценарий для программного обновления кода версии и названия версии в мобильном приложении Android?

Для мобильного приложения мы используем:

  • Xamarin для разработки под Android
  • Visual Studio Team Services для управления версиями (Git), сборки, тестирования и выпуска.
  • Гугл плей для раздачи.

наш непрерывный поток интеграции выглядит так:

Visual studio (xamarin) ->  
Git(Code) -> 
Build -> 
Test(Xamarin testcloud)  -> 
Release Google Play (Alpha/Beta/Production)

В настоящее время я должен обновить код/имя версии вручную перед фиксацией в Git, иначе на другом конце потока Google будет жаловаться, что номер версии недавно выпущенного apk меньше или равен apk, уже находящемуся в Play Store.

Однако, поскольку мы делаем много коммитов и автоматически собираем-выпускаем, мы хотим увеличить код/название версии только в успешном выпуске (на случай, если Google его отклонит). Это вызвало небольшую дилемму: потому что тогда AndroidManifest, в котором находится версия, уже упакован в подписанный и заархивированный APK.

Другое дело: мы работаем над проектом с несколькими разработчиками, поэтому ручное обновление может привести к гонкам, поэтому лучший способ (как мы думаем) — обновить номера версий непосредственно перед выпуском.

Вещи, о которых я думал:

  • сохранение номера версии где-то в VSTS
  • используя номер сборки в качестве номера версии
  • получение номера текущей версии через API разработчика из Google Play

Но все еще немного застрял и ищет общую/лучшую практику


person Caspar Kleijne    schedule 12.12.2016    source источник
comment
Возможно, ответ Энди на это может помочь: stackoverflow.com/questions/27058172/, в частности github.com/soltechinc/soltechxf/blob/master/UpdateVersionInfo/   -  person Jon Douglas    schedule 12.12.2016


Ответы (1)


Каспар,

Я выбрал подход к изменению манифеста перед сборкой/упаковкой приложения, потому что, как только вы начнете собирать, упаковывать, подписывать, выравнивать zip, процесс будет слишком поздним.

В определении сборки в качестве первой задачи перед задачей сборки добавьте задачу, которая будет обновлять манифест:

  • В каталог задач/утилита добавьте сценарий PowerShell.
  • Установите его как встроенный

Аргументы:

-filePath '$(FilePath)' -oldValue '$(OldValue)' -newValue '$(NewValue)'

Скрипт:

param ([string] $filePath, [string] $oldValue, [string] $newValue)

Write-Host "---Replacing value $oldValue with new value $newValue in file $filePath---"

$content = [System.IO.File]::ReadAllText($filePath).Replace("$oldValue",  $newValue)

[System.IO.File]::WriteAllText($filePath, $content)

Параметр $filePath — это путь к вашему манифесту, например:

$(Build.SourcesDirectory)\MyAndroidApp\Properties\AndroidManifest.xml

Параметр $oldValue будет свойством кода версии:

android:versionCode="1"

Параметр $newValue будет новым свойством кода версии:

android:versionCode="$(AndroidVersionCode)"

«$(AndroidVersionCode)» может быть переменной в вашем определении сборки, разрешенной во время очереди или номером сборки.


Я дал вам простой путь, но для удобства сопровождения и удобства я воспользовался преимуществами VSTS Группы задач. В конце концов, мой скрипт для замены текста в файле представляет собой группу задач, и я могу использовать его в любом определении сборки.

В итоге вы получите что-то вроде этого: Определение сборки

person Vivien Chevallier    schedule 12.12.2016
comment
Привет, Вивьен, это похоже на то, на что я вчера потратил весь день со сценариями powershell. AndroidVersionCode является ключевой частью здесь. Google play, кажется, требует, чтобы это было следующее последовательное целое число из последнего успешного выпуска. Вы установили это в гневе и успешно использовали? - person Davros Spignot; 28.09.2017
comment
Хм. нашел эту ссылку An internal version number. This number is used only to determine whether one version is more recent than another, with higher numbers indicating more recent versions. This is not the version number shown to users; that number is set by the versionName attribute. The value must be set as an integer, such as "100". You can define it however you want, as long as each successive version has a higher number - person Davros Spignot; 28.09.2017