一種用環境變量配置android build的方案

目標

  • 能方便地在CI服務器配置每一個build的版本和簽名信息linux

  • 不須要在commit中包含keystore, key密碼等東西android

  • 每一個release build有一致且單調遞增的版本號git

  • 以上設定都是可選的,其餘人仍然能夠clone代碼後馬上在IDE運行bash

設計

  • 用CI服務器的build script生成版本號服務器

  • 簽名信息只寫在build scriptgradle

  • 用環境變量傳遞版本號和簽名信息ui

  • 沒有環境變量時使用默認設置設計

代碼

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
相關文章
相關標籤/搜索