如何在Gitlab CI for Android中管理签名密钥库

Alm*_*und 9 android code-signing continuous-deployment gitlab flutter

亲爱的stackoverflow社区,我再次向您求助:)

最近,我遇到了Gitlab及其非常好的捆绑CI / CD解决方案的奇迹。它工作得很出色,但是我们所有人都需要对二进制文件进行签名,我们没有发现像我将密钥上传到Jenkins服务器那样的方法。

那么,在构建发行版时,如何在不检查密钥和秘密的情况下对我的android(实际上是颤抖的)应用程序进行签名?

据我所知,大多数人使用签名设置来定义构建作业,签名设置是指未提交的key.properties文件,该文件指定了本地keystore.jks。在本地构建APK时,这种方法可以正常工作,但是如果我想作为CI / CD工作的一部分来构建和存档它们,我该怎么办?

对于秘密密钥,例如密钥库本身的密码,我发现我可以将它们简单地存储为受保护的变量,但可以存储实际的密钥库文件本身。我该怎么办?

任何想法,建议都将受到欢迎。干杯

Von*_*onC 9

来自IvanP的回答:

通常我将密钥库文件(作为 base64 字符串)、别名和密码存储到 Gitlab 的 Secrets 变量中。

使用GitLab 15.0(2022 年 5 月)应该会更容易

项目级安全文件公开测试版

以前,很难在 CI/CD 管道中使用二进制文件,因为 CI/CD 变量只能包含文本值。这使得使用配置文件、证书、密钥库和其他安全信息变得困难,而这些信息对于构建移动应用程序的团队来说非常重要。

今天,我们发布了项目级安全文件的公开测试版。现在,您可以将二进制文件上传到 GitLab 中的项目,并将这些文件包含在 CI/CD 作业中,以便根据需要在构建和发布过程中使用。安全文件存储在版本控制之外,并且不是项目存储库的一部分。

请在反馈问题中向我们留下您对该功能的体验反馈。

请参阅文档和问题。


Iva*_*anP 8

通常,我将密钥库文件(作为base64字符串),别名和密码存储到Gitlab的secrets变量中。

在.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
Run Code Online (Sandbox Code Playgroud)

最后,在您的构建包中:

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'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 密钥库的 Base64 编码没有安全目的。因为密钥库是二进制格式,所以不能将其放入秘密变量中 (2认同)

Sat*_*ran 7

感谢 @IvanP 的回答,但我必须在 Gitlab 管道中进行一些更改才能使其正常工作。

将密钥库导出为 base64 字符串:

openssl base64 -A -in my.keystore > base64
Run Code Online (Sandbox Code Playgroud)

创建一个新变量并将值复制粘贴到文件 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
Run Code Online (Sandbox Code Playgroud)

请参阅 build.gradle 中的 myapp.properties,如上面 @IvanP 的答案中所述。