如何在构建服务器和工作站之间同步 Gradle/Android 版本代码

Posted

技术标签:

【中文标题】如何在构建服务器和工作站之间同步 Gradle/Android 版本代码【英文标题】:How to sync Gradle/Android versionCode between build server and workstation 【发布时间】:2014-12-24 08:55:28 【问题描述】:

目前我们让 Bamboo 监听 Git 存储库的任何更改。当发生更改时,构建过程开始并将 (Bamboo) 构建号加一。

我认为为 android 项目 (versionCode) 使用相同的内部版本号会很好,这样应用程序的用户可以始终参考他/她收到的实际版本。这样,构建服务器上的内部版本号从 1 变为 2。只有工作站不知道这一点,仍然使用版本 1。

有没有办法同步这个版本号?

试过了: 我的一个朋友建议的一个可能的解决方案是使用 git 命令来获取提交号:git rev-list HEAD --count,这太棒了。唯一的缺点是您无法在 Bamboo 中正确更改内部版本号。所以 Bamboo 的内部版本号应该是领先的。

顺便说一句,我正在使用带有 Gradle 的 Android Studio

【问题讨论】:

【参考方案1】:

Bamboo 可以配置为在构建时将清单中的 versionCode 值设置为内部版本号,因此无需将此更改传播回进行开发的地方。要配置 Bamboo 来执行此操作,请在构建计划中添加一个脚本任务(在实际构建任务之前),其正文为:

sed -i 's/android:versionCode="[[:digit:]]*"/android:versionCode="$bamboo.buildNumber"/' AndroidManifest.xml

【讨论】:

【参考方案2】:

是的,使用 gradle 很容易。您必须在 gradle 脚本中检索最新的构建结果并将其放入 versionCode。

这就是你所需要的(记得更改变量以引用你的服务器):

def getBambooNumber()
    def url = "https://bambooServer:bambooPort/rest/api/latest/result/PROJECT-BAMBOO-ID/latest.json?os_authType=basic".toURL()
    def authValue = "USER:PASSWORD".bytes.encodeBase64().toString()
    def json = new JsonSlurper().parseText(url.getText(requestProperties : ["Authorization" : "Basic " + authValue]))
    return json.buildNumber + 1 // +1 to Get the new build number



def bambooBuild = bambooBuildNumber()

android 
    ...

    defaultConfig 
        ...
        versionCode bambooBuild
        //This allows you to access in BuildConfig to the bamboo build
        buildConfigField "Integer", "BAMBOO_BUILD", "$bambooBuild"
        ...
    

    ...

让我知道这是否适合你。

【讨论】:

以上是关于如何在构建服务器和工作站之间同步 Gradle/Android 版本代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 redis 和 PostgreSQL 表行之间同步值?

如何在mysql和sqlite之间同步数据?

如何在 Sencha Touch 中的商店之间同步

如何在多个 QT 图形视图小部件之间同步移动

使用 ZSync 和 CoreData 同步时如何调试“未指定实体”

如何在android上保持服务器和客户端之间的数据同步?