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

时间:2017-07-04 17:35:23

标签: android continuous-integration keystore circleci jks

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

我的gradle签名配置:

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

我的圈子。:

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

我试图将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'.

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

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

提前感谢您的建议!

3 个答案:

答案 0 :(得分:9)

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

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

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

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

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

答案 1 :(得分:1)

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

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

  • 我首选的解决方案是创建另一个您调用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
        }
    }

答案 2 :(得分:0)

if语句在signingConfigs中不起作用。如果要使用不同的密钥库针对不同的口味对apk进行签名,则需要创建signingConfigs并将signingconfigs放入 buildTypes 部分。我做了一些关于在CI / CD Cycle中存储android keystore文件的研究,并提出了三种方法:

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

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

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

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

    plugins { id 'java' id 'war' } group = 'com.springtest' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 targetCompatibility = 1.8 project.ext.tomcatHome = 'H:/Tomcat' project.ext.tomcatWebapps = "$tomcatHome/webapps" repositories { mavenCentral() } dependencies { implementation 'org.springframework:spring-webmvc:5.1.2.RELEASE' implementation 'org.apache.commons:commons-math3:3.6.1' implementation 'javax.servlet:jstl:1.2' compileOnly "javax.servlet:javax.servlet-api:4.0.1" testImplementation 'junit:junit:4.12' } war { archiveName = 'springtest1.war' } task deployToTomcat(type: Copy) { from war.archivePath into "$tomcatWebapps" }

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

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

    SECRET_KEY 使用以下密钥作为环境变量存储在CI中: $ ENCRYPT_SECRET_KEY

  3. 从外部源(例如AWS S3,Google云端硬盘)下载密钥库

我已经在medium上发表了有关该主题的文章,您可以联系complete example in github来更好地理解。