【问题标题】:Where to store Android KeyStore file for CirlceCi build?在哪里存储 CirclceCi 构建的 Android KeyStore 文件?
【发布时间】:2018-11-20 02:32:14
【问题描述】:

我正在尝试为我的 Android 应用程序配置持续集成构建。 我使用 CircleCi 平台。 现在我将我的应用程序 Keystore.jks 文件存储在本地,但 CircleCi 需要它来签署我的应用程序。 如果不将文件存储在我的 git 存储库中,如何实现这一点?或者也许我不应该担心存储库是私有的?

我的 gradle 签名配置:

signingConfigs {
    if (System.getenv("CIRCLECI")) {
        release {
            keyAlias '****'
            keyPassword '****'
            storeFile file(System.getenv("******"))
            storePassword '****'
        }
    }else{
        release {
             ...
        }
    }
}

我的circle.yml:

general:
    artifacts:
        - /home/ubuntu/my-app/app/build/outputs/apk/
machine:
  environment:
    ANDROID_HOME: /usr/local/android-sdk-linux
dependencies:
  override:
     - chmod +x gradlew
test:
  override:
    - ./gradlew assemble

我尝试将 CircleCi 上的密钥库文件保存为环境变量,但它不起作用,我的构建失败并出现异常:

> Execution failed for task ':app:validateSigningDemoRelease'.
> > Keystore file /home/ubuntu/my-app/app/  HERE_IS_THE_KEYSTORE not found for signing config 'release'.

未签名和调试构建成功完成。

如果您提出其他建议,我也愿意使用任何不同的 ci 平台。

提前感谢您的每一个建议!

【问题讨论】:

  • 您的问题的最终解决方案是什么?

标签: android continuous-integration keystore circleci jks


【解决方案1】:

我最近遇到了这个问题,并决定最简单的解决方案是将密钥库文件编码为 base64 并将其放入 CircleCI 的环境变量中。

这将对文件进行编码,您可以复制并粘贴该值:

openssl base64 -A -in .signing/release.jks 

然后,在 CircleCI 的 config.yml 文件中,将其解码:

echo $RELEASE_KEYSTORE_BASE64 | base64 -d > .signing/release.jks

【讨论】:

  • 这很聪明。不过,我会提防它可能会暴露在 CI 日志中。例如,如果您有一个开源项目,那么某人可能会打开 PR,然后访问密钥库签名信息。我想解决这个问题的方法是让一些私人 CI 来发布应用程序。
  • @DylanVann 你可以使用 here 字符串 代替 echo,如下所示:base64 -d <<< $RELEASE_KEYSTORE_BASE64 > .signing/release.jks
  • @grepx 我应该把这个回声放在 config.yaml 的什么地方?在命令内部?
  • 在读取解码后的密钥库Failed to read key prophet-alias from store "/home/circleci/project/android/app/file.keystore": Short read of DER length时,我在circleci上遇到了这个问题,我在本地尝试过,成功了,不知道为什么
【解决方案2】:

if 语句在签名配置中不起作用。如果你想用不同的密钥库为不同的风格签名 apk,你需要创建签名配置并将签名配置放入 buildTypes 部分。我做了一些关于在 CI/CD 周期中存储 android keystore 文件的位置的研究,我提出了三种方法:

  1. 将密钥库文件编码为环境变量

    作为@grepx 的回答,将密钥库文件转换为base-64 编码字符串并将其保存为CI 工具中的环境变量。

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

    加密密钥库文件并将其存储在版本控制系统中。您可以使用以下方式加密文件:

    openssl aes-256-cbc -e -in keystore.jks -out keystore.jks.encrypted -k SECRET_KEY

    您需要在 CI 工具的构建步骤中解密该加密的密钥库文件:

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

    SECRET_KEY 作为环境变量存储在 CI 中,带有以下密钥:$ENCRYPT_SECRET_KEY

  3. 从 AWS S3、Google Drive 等外部源下载密钥库

我已在medium 发表了一篇关于此主题的文章,您可以联系complete example in github 以更好地了解。

【讨论】:

    【解决方案3】:

    对我来说,你有两个解决方案:

    • 这是一个私人仓库,你是唯一使用它的人,所以你可以按下你的钥匙。

    • 我首选的解决方案是创建另一个您称为 circleCI(例如)并推送的密钥。我个人使用这个解决方案

    我的 build.gradle

    signingConfigs {
            Keys {
                keyAlias 'mykey'
                storeFile file('../private_key/upload_key.jks')
                keyPassword ''
                storePassword ''
            }
    
            Circleci {
                keyAlias 'key'
                storeFile file('../private_key/debug_key.jks')
                keyPassword ''
                storePassword ''
            }
        }
    buildTypes {
            release {
                shrinkResources true
                minifyEnabled true
                proguardFiles getDefaultProguardFile('proguard-android.txt'),
                        'proguard-rules.pro'
                signingConfig signingConfigs.Keys
            }
            debug {
                signingConfig signingConfigs.Keys
            }
            circleci{
                signingConfig signingConfigs.Circleci
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-01
      • 2012-01-20
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 2010-10-24
      • 2017-05-06
      相关资源
      最近更新 更多