首页 > 解决方案 > assembleRelease 无法在 gitlab ci 中生成签名的 apk

问题描述

我正在尝试使用 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

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

标签: androidgitlabgitlab-ci

解决方案


我们不应该在版本控制系统中存储密钥库文件和凭据。我们可以通过创建 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

在 siging 配置中,使用了 release.keystore.jks 密钥库文件,但我们不会将它存储在 vcs 中。因此,我们需要在构建持续集成的android应用程序之前生成keystore文件。

开发人员拥有在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

推荐阅读