在 CI 產生 Signed APK

簡述一下我自己的做法

  1. 將產生的 keystore 放在 Runner 的電腦
  2. 將打包要用的資訊寫道 repo 的 Variables
  3. 在 build.gradle 使用這些資訊進行打包

這樣的做法,keystore 的密碼就不會被 git 記錄到

1. 設置 keytore

以我的例子,是放在測試電腦的 ~/Workspace/Android/keystore/my_keystore.jks

2. 設定 Variable

進入設定 > Variable

新增 Variable

新增的變數有四個

- KEYSTORE_FILE: the path of keysotre file
- KEYSTORE_PASSWORD
- KEYSTORE_ALIAS
- KEYSTORE_ALIAS_PASSWORD


3. 修改 app build.gradle

首先可以先參考這個文章:善用 GRADLE 建立安全的 KEYSTORE 設定

延續這個文章,因為 Runner 無法抓到 local 端的 local.properties,所以加了一些設定,從 Gitlab CI 的 Variable 獲得參數來打包:

android {

    # NEW
    signingConfigs {
        sign
    }

    ...

    buildTypes {
        release {
            signingConfig signingConfigs.sign # NEW
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

...

# NEW
def ksFile = rootProject.file('local.properties')
def props = new Properties();

if (ksFile.canRead()) {
    # using local.properties
    props.load(new FileInputStream(ksFile))

    if (props != null) {
        android.signingConfigs.sign.storeFile file(props['KEYSTORE_FILE'])
        android.signingConfigs.sign.storePassword props['KEYSTORE_PASSWORD']
        android.signingConfigs.sign.keyAlias props['KEYSTORE_ALIAS']
        android.signingConfigs.sign.keyPassword props['KEYSTORE_ALIAS_PASSWORD']
    } else {
        println 'some entries in \'local.properties\' not found!'
    }
} else {
    # using Gitlab CI Variable
    println 'Use Gitlab CI Variables'
    android.signingConfigs.sign.storeFile file(System.getenv('KEYSTORE_FILE'))
    android.signingConfigs.sign.storePassword System.getenv('KEYSTORE_PASSWORD')
    android.signingConfigs.sign.keyAlias System.getenv('KEYSTORE_ALIAS')
    android.signingConfigs.sign.keyPassword System.getenv('KEYSTORE_ALIAS_PASSWORD')
}

4. 新增 job:

# .gitlab-ci.yml

buildSignedApk:
  tags:
    - android_ci_sample
  stage: buildApk
  script:
    - ./gradlew assembleRelease
  artifacts:
    paths:
    - app/build/outputs/

如此就可以在 CI 中打包 signed apk

results matching ""

    No results matching ""