1

目标

  • 能方便地在CI服务器配置每个build的版本和签名信息

  • 不需要在commit中包含keystore, key密码等东西

  • 每个release build有一致且单调递增的版本号

  • 以上设定都是可选的,其他人仍然可以clone代码后立刻在IDE运行

设计

  • 用CI服务器的build script生成版本号

  • 签名信息只写在build script

  • 用环境变量传递版本号和签名信息

  • 没有环境变量时使用默认设置

代码

build.gradle

// 从环境变量中读取字符串或整数
def env = { System.getenv it }
def envInt = { Integer.parseInt(env(it)) }

android {
    defaultConfig {
        if (env("ANDROID_VERSION_CODE")) {
            versionCode envInt("ANDROID_VERSION_CODE")
            versionName env("ANDROID_VERSION_NAME")
        } else {
            // 没有环境变量时的默认设置
            versionCode 1
            versionName "1.0"
        }
    }
}

if (env("ANDROID_SIGN_APK"))
// 有环境变量时 才设置apk签名信息
android {
    signingConfigs {
        releaseSigning {
            storeFile file(env("ANDROID_KEYSTORE_PATH"))
            storePassword env("ANDROID_KEYSTORE_PASS")
            keyAlias env("ANDROID_KEY_ALIAS")
            keyPassword env("ANDROID_KEY_PASS")
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.releaseSigning
        }
    }
}

Jenkins的build script

#!/bin/bash

# JDK/SDK路径
export ANDROID_HOME=/somewhere/android-sdk-linux
export JAVA_HOME=/somewhere/jdk1.8.0_65

# 签名信息
export ANDROID_KEYSTORE_PATH=/somewhere/keys.jks
export ANDROID_SIGN_APK=yes
export ANDROID_KEYSTORE_PASS=secret
export ANDROID_KEY_ALIAS=secret
export ANDROID_KEY_PASS=secret

# versionCode: 从当前commit可到达的commit数量 === 祖先commit数量+1
# 如果release build都在一个固定分支, versionCode会单调增加 (但是未必是连续整数)
export ANDROID_VERSION_CODE="$(git rev-list HEAD --count)"
# versionName: 当前commit的sha1的开头8字符
export ANDROID_VERSION_NAME="${GIT_COMMIT:0:8}"

exec sh gradlew clean aR

jokester
6.7k 声望378 粉丝

此用户已被停用