问题 在持续集成中增加Android内部版本号


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

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

为此,我似乎有几个选择:

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

目前,我最喜欢3。

有人有明确的方法吗?


8456
2018-05-11 15:20


起源

如果您想要从标记重建或构建分支,那么将源代码控制中的版本与代码一起使用会很有帮助。 - Dave Bacher
谢谢。我没有想到这一点。我不认为这会很关键(因为我想标记每个版本),但它肯定会在某些时候令人讨厌。 - fancy


答案:


我没有使用上述任何一个 - 就像你一样,我不想改变每个构建的repo,也不想改变任何文件。

Jenkins每个版本都有一个不断增加的价值,通过 BUILD_NUMBER 环境变量。

在Gradle中,我生成了 versionCode 在编译时以编程方式使用 BUILD_NUMBER 确保价值 versionCode 始终高于上一个版本。

我的一个片段 build.gradle

// 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 接着 上传到Google Play

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


16
2018-05-11 17:10



因此,当您对您的alpha版本(源自dev分支)感到满意时,您将合并到主分支,增加版本并推送主分支?如果可能的话,我想摆脱手册增加甚至主要版本。但是你的'computeVersionCode'对于dev版本的版本是一个非常好的主意。也许我会满足于有一个git hook告诉你,你没有增加版本......(至少你不必等待jenkins /上传失败) - fancy
不,我只更改了生产版本的主要/次要版本。对于alphas / beta,版本名称/代码并不重要(尽管我包括 BUILD_NUMBER(或git SHA1)中 versionNameSuffix,所以我最终得到“1.2a42”,例如)。我通过git标签控制alpha / beta版本,所以我可以在任何时候创建一个构建,而不必合并到master。 - Christopher Orr
使用旧/已使用的版本代码上传内容时,Google Play是否会出错?至少在Beta频道中,我收到了这个错误。 - fancy
当然可以。但这个答案的重点是展示每一个构建 自动 得到一个新的 versionCode 高于任何先前构建的值。对于上面的Gradle脚本,Jenkins build#42将生成一个APK 120042和构建#43会有 120043 就像它一样 versionCode。 - Christopher Orr
@Christopher我总是将System.env.BUILD_NUMBER视为null - Sunny