如何在 Gitlab CI for android 中管理签名密钥库
Posted
技术标签:
【中文标题】如何在 Gitlab CI for android 中管理签名密钥库【英文标题】:How to manage signing keystore in Gitlab CI for android 【发布时间】:2019-01-14 11:00:37 【问题描述】:亲爱的 *** 社区,我再次求助于你 :)
我最近遇到了 Gitlab 及其非常好的捆绑 CI/CD 解决方案的奇迹。它运行得很好,但是,我们都需要对我们的二进制文件进行签名,不是吗,而且我发现没有办法像我那样将密钥上传到 Jenkins 服务器来执行此操作。
那么,在构建版本时,我如何在不签入我的密钥和秘密的情况下签署我的 android(实际上是颤振)应用程序?
据我所知,大多数人使用签名设置来定义构建作业,该签名设置是指指定本地 keystore.jks 的未提交 key.properties 文件。这在本地构建 APK 时效果很好,但如果我想将它们构建并归档为 CI/CD 工作的一部分,我该怎么做?
对于密钥,例如密钥库本身的密码,我发现我可以将它们简单地存储为受保护的变量,而不是实际的密钥库文件本身。我该怎么办?
非常欢迎任何想法和建议。 干杯
【问题讨论】:
您应该在 google play 控制台中查看 App Signing。 我见过那个,但我没发现你可以不用钥匙建造。我希望您无论如何都需要一个上传密钥。我会重新阅读它,看看我是否能得到它。谢谢! 是的,您仍然需要密钥库。但是如果它被泄露,你可以在游戏控制台中使这个密钥库失效,因为这不是你的“真正的”密钥库。 【参考方案1】:通常我将密钥库文件(作为 base64 字符串)、别名和密码存储到 Gitlab 的秘密变量中。
在 .gitlab-ci.yml 中执行如下操作:
create_property_files:
stage: prepare
only:
- master
script:
- echo $KEYSTORE | base64 -d > my.keystore
- echo "keystorePath=my.keystore" > signing.properties
- echo "keystorePassword=$KEYSTORE_PASSWORD" >> signing.properties
- echo "keyAlias=$ALIAS" >> signing.properties
- echo "keyPassword=$KEY_PASSWORD" >> signing.properties
artifacts:
paths:
- my.keystore
- signing.properties
expire_in: 10 mins
最后,在您的构建 gradle 中:
signingConfigs
release
file("../signing.properties").with propFile ->
if (propFile.canRead())
def properties = new Properties()
properties.load(new FileInputStream(propFile))
storeFile file(properties['keystorePath'])
storePassword properties['keystorePassword']
keyAlias properties['keyAlias']
keyPassword properties['keyPassword']
else
println 'Unable to read signing.properties'
【讨论】:
在这种情况下,您的所有敏感数据都存在于工件中,不是吗? 是的,持续 10 分钟。为了防止这种情况,您可以直接在构建阶段编写signing.properties 如何创建正确的 base64 版本的密钥库? 密钥库的 base64 编码没有安全目的。因为keystore是二进制格式,所以不能放到secret变量中 这是否意味着您首先将my.keystore
文件转换为base64?【参考方案2】:
我过去曾使用git-secret 签入受密码保护的机密文件。然后通过secret/protected environmental variable(如您所知)传递密码并修改 .gitlab-ci.yml 以使用密码打开文件并使用它们。
【讨论】:
听起来很合理,我在其他地方读过关于使用不同的存储库等来存储秘密文件。我会试一试,一旦完成就回来。谢谢! 当然.. 还有一个 fastlane 插件可以加密密钥库github.com/hjanuschka/fastlane-plugin-cryptex(没试过)。另外,这是一篇(过时的)文章,关于如何不在 Google Play 商店中管理证书researchcenter.paloaltonetworks.com/2014/08/…【参考方案3】:感谢@IvanP 的回答,但我必须在 Gitlab 管道中进行一些更改才能使其正常工作。
将 Keystore 导出为 base64 字符串:
openssl base64 -A -in my.keystore > base64
创建一个新变量并将值复制粘贴到文件 base64 中。这样做时要小心,我搞砸了格式,管道无法解码密钥库。变量必须用 $ 来引用,而不仅仅是 $。
- echo -n $ANDROID_KEYSTORE | base64 -d > my.keystore
- echo "keystorePath=../my.keystore" > myapp.properties
- echo "keystorePassword=$KEYSTORE_PASSWORD" >> myapp.properties
- echo "keyAlias=$ALIAS_NAME" >> myapp.properties
- echo "keyPassword=$KEY_PASSWORD" >> myapp.properties
请参阅您的 build.gradle 中的 myapp.properties,如上面@IvanP 的回答中所述。
【讨论】:
以上是关于如何在 Gitlab CI for android 中管理签名密钥库的主要内容,如果未能解决你的问题,请参考以下文章