目标
能方便地在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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。