在哪里存储CirlceCi构建的Android KeyStore文件?

ble*_*eo 6 continuous-integration android keystore jks circleci

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

我的gradle签名配置:

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

我的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
Run Code Online (Sandbox Code Playgroud)

我试图将CircleC文件保存在CircleCi上作为环境变量,但它无法正常工作,我的构建失败,异常:

> Execution failed for task ':app:validateSigningDemoRelease'.
> > Keystore file /home/ubuntu/my-app/app/  HERE_IS_THE_KEYSTORE not found for signing config 'release'.
Run Code Online (Sandbox Code Playgroud)

无符号和调试版本成功完成.

如果你提出别的建议,我也愿意使用任何不同的ci平台.

提前感谢您的建议!

gre*_*epx 13

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

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

openssl base64 -A -in .signing/release.jks 
Run Code Online (Sandbox Code Playgroud)

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

echo $RELEASE_KEYSTORE_BASE64 | base64 -d > .signing/release.jks
Run Code Online (Sandbox Code Playgroud)

  • 这很聪明.我注意它可能会在CI日志中暴露出来.如果您有一个开源项目,例如有人可能打开PR,然后访问密钥库签名信息.我想解决这个问题的方法是让一些私有CI来发布应用程序. (2认同)
  • @DylanVann 为此,您可以使用 _here string_ 而不是 echo,如下所示: `base64 -d <<< $RELEASE_KEYSTORE_BASE64 > .signing/release.jks` (2认同)

far*_*aya 5

if 语句在签名配置中不起作用。如果你想使用不同的密钥库为不同风格的 apk 签名,你需要创建signingConfigs并将signingconfigs放入buildTypes部分。我做了一些关于在 CI/CD Cycle 中存储 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上发表了一篇关于这个主题的文章,您可以在 github 中找到完整的示例以更好地理解。


fil*_*lol 3

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

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

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

我的构建.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
        }
    }
Run Code Online (Sandbox Code Playgroud)