【问题标题】:Increment Android build number in Continuous Integration在持续集成中增加 Android 内部版本号
【发布时间】:2015-07-22 04:30:20
【问题描述】:

我正在使用 Android Studio、Gradle、git。

每次推送到主分支时,我都想构建一个新的应用版本,该版本已上传到 Google Play 商店的 Alpha 通道。为此,我需要为每个构建增加 App 的 versionCode。

对此我似乎有几种选择:

  1. 在 Jenkins 构建期间增加数量并将更改的文件推送回 repo。
    • 我不喜欢让构建服务器执行推送/提交的想法。
  2. 使用 git 挂钩增加数字。
    • 我更不喜欢使用 git 来修改文件的想法。如果我正在度假,谁(团队的其他成员)会发现这个并知道如何处理它?
  3. 在保存当前版本的另一台服务器(构建服务器可以直接访问)上有一个文件。 Gradle 将访问它,增加它并再次保存它。
    • 这看起来很“脆弱”,但至少我可以有一个简单的“increaseVersion”任务,它只在服务器上执行。如果它坏了(如果我们移动服务器或其他东西),修复起来相当容易。

目前,我最喜欢 3 个。

有人有明确的方法吗?

【问题讨论】:

  • 如果您想从标签重建或构建分支,将版本与代码一起放在源代码控制中会很有帮助。
  • 谢谢。我没想到。我认为这并不重要(因为我想标记每个版本),但在某些时候肯定会很烦人。

标签: android git jenkins continuous-integration


【解决方案1】:

我没有使用上述任何一种方法——和你一样,我不想改变每个构建的 repo,也不想改变任何文件。

Jenkins 对每个构建都有一个不断增加的值,通过 BUILD_NUMBER 环境变量公开。

在 Gradle 中,我在构建时以编程方式生成 versionCode 值,使用 BUILD_NUMBER 值来确保 versionCode 始终高于之前的构建。

我的build.gradlesn-p:

// Used to set the package version name and version code
ext.versionMajor = 1
ext.versionMinor = 2

android {
  defaultConfig {
    versionName computeVersionName()
    versionCode computeVersionCode()
  }
}

// Will return "1.2" in this example
def computeVersionName() {
    // Basic <major>.<minor> version name
    return String.format('%d.%d', versionMajor, versionMinor)
}

// Will return 120042 for Jenkins build #42
def computeVersionCode() {
    // Major + minor + Jenkins build number (where available)
    return (versionMajor * 100000)
             + (versionMinor * 10000)
             + Integer.valueOf(System.env.BUILD_NUMBER ?: 0)
}

所以我只需要在发布版本时更新顶部的两个值。对于所有其他构建类型,我可以让 Gradle/Jenkins 自动设置versionCode,然后设置upload to Google Play

这也意味着,对于 Play 商店中列出的任何 alpha 版本,或者通过检查 APK,我可以立即看到它来自哪个 Jenkins 构建,以及来自那里的 git 提交。

【讨论】:

  • 所以当你对你的 alpha 版本(源于 dev 分支)感到满意时,你合并到 master 分支,增加版本并推送 master 分支?如果可能的话,我想摆脱手动增加,即使是主要版本。但是您的“computeVersionCode”对于版本控制开发版本来说是一个非常好的主意。也许我会接受一个 git hook 告诉你,你没有增加版本......(至少你不必等待 jenkins / 上传失败)
  • 不,我只更改生产版本的主要/次要版本。对于 alphas/betas,版本名称/代码并不重要(尽管我在 versionNameSuffix 中包含了 BUILD_NUMBER(或 git SHA1),所以我最终得到了“1.2a42”)。我通过 git 标签控制 alpha/beta 版本,因此我可以随时创建构建,而无需合并到 master。
  • 当您使用旧的/已使用的版本代码上传内容时,Google Play 是否会出错?至少在 Beta 通道中,我遇到了这个错误。
  • 当然可以。但这个答案的重点是表明每个构建自动获得一个新的versionCode 值,该值高于任何以前的构建。对于上面的 Gradle 脚本,Jenkins 构建 #42 将生成一个带有 120042 的 APK,而构建 #43 将使用 120043 作为其 versionCode
  • @Christopher 我总是把 System.env.BUILD_NUMBER 设为 null
猜你喜欢
  • 2020-03-20
  • 2012-10-24
  • 2020-05-13
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多