如何使用Azure Pipelines自动递增Android应用程序的构建ID和版本号

6

这是我的build.gradle文件

defaultConfig {
        applicationId "com.xyz.abc.na"
        minSdkVersion 16
        targetSdkVersion 29
        versionCode 36
        versionName "5.0.2"
        multiDexEnabled true
    }

在我的YML文件中,我有:
 - task: android-manifest-version@1
  displayName: 'Version Update'
  inputs:
  sourcePath: '$(manifestDirectory)'
  versionCodeOption: 'buildid'
  versionCode: '$(Build.BuildId)'
  versionCodeOffset: '1'
  printFile: true

  - task: Gradle@2
    displayName: 'Building Gradle'
    inputs:
      workingDirectory: ''
      gradleWrapperFile: 'gradlew'
      gradleOptions: '-Xmx3072m'
      publishJUnitResults: false
      testResultsFiles: '**/TEST-*.xml'
      tasks: $(gradleTask)
      codeCoverageToolOption: 'None'
      javaHomeOption: 'JDKVersion'
      jdkVersionOption: 'default'
      jdkArchitectureOption: 'x64'
      checkStyleRunAnalysis: false
      findBugsRunAnalysis: false

除非我在build.gradle中手动更改versionCodeversionName,否则这些值永远不会自动更新。

如何获取最新的值,将其增加1并更新build.gradle,然后从新版本代码和版本名称生成构建?

以下是我尝试过但未成功的现有参考文献。

Ref1

Ref2

Ref3

3个回答

8

如果要本地完成这个操作,可以按照以下步骤进行:

  1. gradle.properties 中添加以下两个属性
appVersionCode=1
appVersionName="1.0"
  1. 构建build.gradle文件的App

替换

versionCode 36
versionName "5.0.2"

使用

versionCode appVersionCode.toInteger()
versionName appVersionName.toString()
  1. 在你的YAML文件中添加Gradle的options,并通过变量传递$(MyAppBuildNumber)$(MyAppVersionNumber)
- task: Gradle@2
      inputs:
        ...
        options: '-PappVersionCode=$(MyAppBuildNumber) -PappVersionName=$(MyAppVersionNumber)'
        ...

我按照相同的步骤进行操作,但是应用程序的版本仍然是1.0。我不确定我错过了什么。 - Nagaraj Alagusundaram
你已经用你的数字替换了$(MyAppBuildNumber)$(MyAppVersionNumber)吗? - Yahia
是的,我已经更改了那些值。为了测试目的,我只是将值硬编码为-PappVersionCode=8 -PappVersionName=8.0.1。 - Nagaraj Alagusundaram
我已经编辑了我的答案,请确保在第二步中将其替换为versionCode appVersionCode.toInteger() versionName appVersionName.toString() - Yahia
1
例如,您可以使用Build.BuildId作为versionCode: 选项:'-PappVersionCode=$(Build.BuildId)' - Igor
非常感谢。我也能够使用您的方法获得结果。 - Nagaraj Alagusundaram

2

对于那些无法安装扩展的人,这是我的PowerShell解决方案:

$BasePath = "$(Build.SourcesDirectory)\"
$BuildGradlePath = "${BasePath}[YourAppFolderStructure]\app\build.gradle"
$BuildGradleUpdatedPath = "${BasePath}[YourAppFolderStructure]\app\build.gradle.updated"
Get-Content $BuildGradlePath | ForEach-Object {
    if($_ -match "versionCode \d"){
        $versionCode = $_ -replace "versionCode", "" -as [int]
        $newVersionCode = $versionCode + 1
        
        Write-Host "Found versionCode ${versionCode}. Updated to ${newVersionCode}"
        
        $_ = "        versionCode " + $newVersionCode   
    }
    elseif($_ -match "versionName"){
        Write-Host "Updating versionName to $(Build.BuildNumber)"
        $_ = "        versionName '$(Build.BuildNumber)'"
    }
    $_
} | Set-Content $BuildGradleUpdatedPath;
Get-Content $BuildGradleUpdatedPath | Set-Content $BuildGradlePath

非常感谢。我也能够使用您的方法达到结果。 - Nagaraj Alagusundaram
我不确定版本代码的+1增量如何与后续构建配合工作,因为新的构建号没有提交。 - Manos
我知道这很老,但被卡在这里了。也许有一种方法可以更新管道中的变量以保留上一个构建版本的代码? - techker

1

您可以查看扩展移动版本控制, 它提供了一个任务来更新Android版本Gradle:

- task: UpdateAndroidVersionGradle@1
  inputs:
    buildGradlePath: 'your_project/app/build.gradle'
    versionName: '$(MAJOR).$(MINOR).$(PATCH)' # Optional. Default is: $(MAJOR).$(MINOR).$(PATCH)
    versionCode: '$(NUMBER_OF_COMMITS)' # Optional. Default is: $(NUMBER_OF_COMMITS)

详细的文档可以查看以下链接:链接

https://damienaicheh.github.io/azure/devops/2019/12/19/manage-your-application-version-automatically-using-git-and-azure-devops-en


谢谢您提供这个。不幸的是,我不能使用它,因为我需要原生地完成它,没有任何库支持。 - Nagaraj Alagusundaram
它是一个DevOps扩展,安装在DevOps侧。 - Cece Dong - MSFT
知道了。谢谢。 :) - Nagaraj Alagusundaram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接