android - 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
您有解决此问题的想法吗?存在类似的问题,但我得到了不同的错误。
解决方案
我们不应该在版本控制系统中存储密钥库文件和凭据。我们可以通过创建 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
推荐阅读
- google-cloud-pubsub - 如何将我的 Google 商家评论更新发布到我的主题
- reactjs - 我如何创建一个在反应中完全可编辑的多维数组?
- python - 如何在熊猫数据框中只取整数值
- elixir - Elixir:十进制转换并且不允许负数
- karate - 如何使空手道测试作为服务运行
- spring - Hibernate "CURRENT_TIMESTAMP" HQL 查询返回 UTC 时间戳,即使 DB 在 CST 中
- c++ - 如何显示动画 GIF?
- python - thepiratebay3.org xpath 不工作,为什么?
- php - PHP Laravel AWS S3 - 将图像结果上传到白色方形图像
- java - 无法将数据插入 android studio sqlite 数据库