assembleRelease无法在gitlab ci中生成签名的apk

时间:2020-04-28 08:47:46

标签: android gitlab gitlab-ci

我正在尝试使用gitlab ci构建签名的APK,但出现此错误:

/bin/bash: line 109: -Pandroid.injected.signing.store.file=/builds/MyGitlab/myapp/release.jks: 
No such file or directory

我在gitlab ci / cd变量中添加了值KEYSTORE_FILE,KEYSTORE_PASSWORD,KEY_ALIAS,KEY_PASSWORD变量。我使用了密钥库文件的base64编码。 我的.gitlab-ci.yml文件如下:

image: jangrewe/gitlab-ci-android

before_script:
  - export GRADLE_USER_HOME=$(pwd)/.gradle
  - chmod +x ./gradlew

cache:
  key: ${CI_PROJECT_ID}
  paths:
    - .gradle/

stages:
  - release

assembleRelease:
  stage: release
  script:
    - echo -n %KEYSTORE_FILE% | base64 -di > release.jks
    - >
      ./gradlew assembleRelease --stacktrace
        -Pandroid.injected.signing.store.file=$(pwd)/release.jks
        -Pandroid.injected.signing.store.password=$KEYSTORE_PASSWORD
        -Pandroid.injected.signing.key.alias=$KEY_ALIAS
        -Pandroid.injected.signing.key.password=$KEY_PASSWORD
  artifacts:
    paths:
      - app/build/outputs/apk/dev/release
      - app/build/outputs/apk/prod/release

您有解决此问题的想法吗? 存在类似的question,但我得到了不同的错误。

1 个答案:

答案 0 :(得分:0)

我们不应将密钥库文件和凭据存储在版本控制系统中。我们可以通过创建keystore.properties文件并在签名配置部分中使用该文件中的凭据来隐藏凭据,如下所示:

def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
    ...

    signingConfigs {
        release {
            keyAlias keystoreProperties['releaseKeyAlias']
            keyPassword keystoreProperties['releaseKeyPassword']
            storeFile file(rootDir.getCanonicalPath() + '/' + keystoreProperties['releaseKeyStore'])
            storePassword keystoreProperties['releaseStorePassword']
        }
    }

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

    ...
}

keystore.properties包含密钥库凭据:

releaseKeyAlias=Prod
releaseKeyPassword=12345678
releaseKeyStore=release.keystore.jks
releaseStorePassword=12345678

在同级配置中,使用了release.keystore.jks密钥库文件,但我们不会将其存储在vcs中。因此,我们需要先生成密钥库文件,然后才能以持续集成的方式构建Android应用程序。

Developer具有在build.gradle中可见的密钥库文件和应用程序签名密钥。我使用此解决方案来保护我们的密钥库文件:

在版本控制系统中存储加密的密钥库文件:

首先,为您自己创建一个秘密密钥:

openssl enc -aes-256-cbc -k ciappsigningexample-secret -P -md sha1

它生成盐,键和iv。我们将使用256位密钥。 然后,使用256位密钥对密钥库文件进行加密:

openssl aes-256-cbc -e -in debug.keystore.jks -out debug.keystore.jks.encrypted -k 99924EB44...

它将生成debug.keystore.jks.encrypted文件,您可以将该文件推送到git。要在CI中解密加密的密钥库,您需要将256位密钥添加到CI作为环境。然后,您可以在预构建步骤中通过以下命令使用此秘密密钥来解密密钥存储文件:

openssl aes-256-cbc -d -in debug.keystore.jks.encrypted -k $DEBUG_ENCRYPT_SECRET_KEY >> debug.keystore.jks