在持续集成中增加Android版本号

23
我正在使用Android Studio、Gradle和git。
每次推送到主分支时,我都希望构建一个新的应用版本,并将其上传到Google Play商店的Alpha渠道。为此,我需要为每个构建增加应用程序的versionCode。
对此,我似乎有几种选择:
1.在Jenkins构建期间增加数字,并将更改的文件推回存储库。 我不喜欢我的构建服务器执行推送/提交的想法。
2.使用git钩子增加数字。 我更不喜欢使用git修改文件的想法。如果我度假,哪位(团队中的其他成员)会找到它并知道该怎么做?
3.在另一台服务器上拥有一个文件(构建服务器可以直接访问),其中保存了当前版本。Gradle将访问它,增加它并再次保存它。 这似乎很“脆弱”,但至少我可以有一个简单的“增加版本”任务,只在服务器上执行。如果它出现问题(如果我们移动服务器或其他原因),修复它相当容易。
目前,我最喜欢第三种方法。
是否有人有确定的方法来完成这件事?

1
如果您想要从标签重新构建或构建分支,将版本与代码一起保存在源代码控制中会很有帮助。 - Dave Bacher
谢谢。我没有想到那个。我不认为这会很关键(因为我想要标记每个发布版本),但在某些时候肯定会很烦人。 - fancy
1个回答

25

我不使用上述任何一种方式——就像您一样,我不想为每个构建更改存储库或任何文件。

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提交记录。


所以当你对alpha版本(源自dev分支)感到满意时,你会合并到master分支,增加版本并推送master分支?如果可能的话,我希望可以摆脱甚至主要版本的手动增加。但是您的“computeVersionCode”对于为开发版本提供版本号是一个非常好的想法。也许我会安顿下来,让git hook告诉您,您没有增加版本...(至少您不必等待jenkins /上传失败)。 - fancy
不,我只会为生产发布更改主/次版本。对于 alpha/beta 版本,版本名称/代码并不重要(尽管我在 versionNameSuffix 中包含 BUILD_NUMBER(或 git SHA1),因此最终得到的是“1.2a42”等)。我通过 git 标签控制 alpha/beta 发布,因此我可以在任何时候创建构建,而无需合并到主分支。 - Christopher Orr
当您上传具有旧/已使用版本代码的内容时,Google Play是否会出现错误?至少在Beta频道中,我遇到了这个错误。 - fancy
当然可以。但是这个答案的整个重点是展示每次构建都会自动获得一个新的versionCode值,该值高于任何先前的构建。对于上面的Gradle脚本,Jenkins第42次构建将生成一个APK,其versionCode120042,而第43次构建将具有120043作为其versionCode - Christopher Orr
抱歉,我误解了您之前的评论,谢谢。 - fancy
1
@Christopher 我总是得到 null 作为 System.env.BUILD_NUMBER - Sunny

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