在Travis CI上使用密钥库签署Android应用的发布版本的最佳做法是什么?

我一直在使用Travis CI来构build我的Android应用程序 。 我正在使用debug.keystore其推送到公共存储库的debugging版本中进行签名

但是我想要构build发布版本并使用这个gradle插件将它们上传到Google Play商店。

这个过程需要一个keystore和一个p12证书文件。

虽然我可以将encryption的环境variables添加到Travis CI,但我不知道存储这些文件的最佳方法。

问题1:这样做的最佳做法是什么? 有人可以提供一个开源的实现吗? (我找不到)

一种可能的实现:将用户名和密码安全地存储为环境variables。 将文件存储在启用SSL的环境中,并使用这些用户名和密码通过简单的HTTP身份validation进行保护。 在构build过程开始之前,使用它们使用curl进行下载。

问题2这个实现是否有意义? 它安全吗?

额外:这2个博客文章是伟大的来源与此有关,但他们都不幸的回答了这个问题。

http://stablekernel.com/blog/deploying-google-play-continuous-delivery-android-part-4/ https://www.bignerdranch.com/blog/continuous-delivery-for-android/

更新(5/28/15):

我已经开始在这里实现我的解决scheme(开源): https : //github.com/NonameDev/MathApp

  • 使用System.getenv("TRAVIS")来检测您的构build在Travis上运行。
  • storeFile rootProject.file('release.keystore') – 保留释放键在你自己的仓库中–travis将隐藏密码
  • storePassword System.getenv("KEYSTORE_PASS") – 在travis上存储环境variablesstorePassword System.getenv("KEYSTORE_PASS")会隐藏输出
  • keyAlias System.getenv("ALIAS_NAME") – 在travis – travis上存储环境variables将隐藏输出
  • keyPassword System.getenv("ALIAS_PASS") – 在travis上存储环境variables – travis将隐藏输出
  • System.getenv("SERVICE_EMAIL") – 在travis – travis上存储环境variables会隐藏输出
  • rootProject.file('play.p12') – 在本地存储证书rootProject.file('play.p12')将存储电子邮件服务帐户

顶级build.gradle

 buildscript { repositories { mavenCentral() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.2.3' classpath 'com.github.triplet.gradle:play-publisher:1.1.0' } } 

应用程序build.gradle

 apply plugin: 'com.android.application' apply plugin: 'com.github.triplet.play' android { compileSdkVersion 22 buildToolsVersion '22.0.1' defaultConfig { applicationId 'burrows.apps.mathapp' minSdkVersion 9 targetSdkVersion 22 versionCode 1 versionName '1.0' } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } signingConfigs { debug { storeFile rootProject.file('debug.keystore') storePassword 'android' keyAlias 'androiddebugkey' keyPassword 'android' } if (System.getenv("TRAVIS")) { release { storeFile rootProject.file('release.keystore') storePassword System.getenv("KEYSTORE_PASS") keyAlias System.getenv("ALIAS_NAME") keyPassword System.getenv("ALIAS_PASS") } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } lintOptions { abortOnError false } } if (System.getenv("TRAVIS")) { play { serviceAccountEmail = System.getenv("SERVICE_EMAIL") pk12File = rootProject.file('play.p12') track = 'production' // or 'alpha' or 'beta' or 'production' } } 

原始答案:

你见过这个答案吗? 他发布了一个链接到他的TravisCI构build“之前”和“之后”纠正他的构build。

这是他的答案:

比较构build#162和#163 。

基本上他必须运行sudo pip install google-api-python-client

据说,我在这里检查了github回购。

这是他的.travis.yml

 language: android android: components: - build-tools-21.1.2 - extra-android-m2repository env: global: - secure: <removed> - secure: <removed> before_install: - ci/decrypt_files - ci/start_emulator install: - ./gradlew build before_script: - ci/wait_for_emulator script: - ./gradlew connectedAndroidTestMockDebug after_success: - ci/deploy_all notifications: email: - <removed> 

来源: https //github.com/mg6maciej/VielenGamesAndroidClient/blob/develop/.travis.yml

构build之前:

这是使用密钥的过程的secure部分,并且密码来自TravisCI(安全地存储在TravisCI上)。

 before_install: - ci/decrypt_files - ci/start_emulator 

ci/decrypt_files来源:

 #!/bin/bash openssl aes-256-cbc -d -k "$file_password" -in app/gradle.properties.enc -out app/gradle.properties openssl aes-256-cbc -d -k "$file_password" -in app/crashlytics.properties.enc -out app/crashlytics.properties openssl aes-256-cbc -d -k "$file_password" -in ci/vielengames.keystore.enc -out ci/vielengames.keystore openssl aes-256-cbc -d -k "$file_password" -in ci/key.p12.enc -out key.p12 

来源: https //github.com/mg6maciej/VielenGamesAndroidClient/blob/develop/ci/decrypt_files

生成后:

这是python和其他Google库下载并用于将应用程序部署到Google Play

 after_success: - ci/deploy_all 

ci/deploy_all来源:

 #!/bin/bash test "$TRAVIS_BRANCH" == "master" && ci/deploy_google_play ci/deploy_testfairy ci/deploy_crashlytics_beta 

ci/deploy_google_play来源:

 #!/bin/bash DIR=$(dirname $0) sudo apt-get install python-openssl sudo pip install google-api-python-client python $DIR/basic_upload_apks.py com.vielengames $DIR/../app/build/outputs/apk/app-production-release.apk python $DIR/basic_upload_apks.py com.vielengames.staging $DIR/../app/build/outputs/apk/app-staging-release.apk 

安全:

你的问题1:

我相信你必须同时拥有应用程序的keystorep12 ,但是你可以安全的存储你的密码到TravisCI中(参见"$file_password" ),就像上面的例子一样。

你的问题2:

即使您拥有keystorep12证书,您仍然需要密码(请参阅"$file_password" )以使其可以工作并用于发布到商店。

为了提高安全性,您希望添加另一个权限比您主要login权限更less的login。 这里是回购的作者在这里做的:

 ... TRACK = 'beta' # Can be 'alpha', beta', 'production' or 'rollout' SERVICE_ACCOUNT_EMAIL = ( '148768954062-sp89pjb1blr7cu2f73f4fpd6dqloc047@developer.gserviceaccount.com') # Declare command-line flags. argparser = argparse.ArgumentParser(add_help=False) argparser.add_argument('package_name', help='The package name. Example: com.android.sample') argparser.add_argument('apk_file', nargs='?', default='test.apk', help='The path to the APK file to upload.') ... 

来源: https //github.com/mg6maciej/VielenGamesAndroidClient/blob/develop/ci/basic_upload_apks.py

  • 当您的应用程序完成后,然后导出。
  • 此时会自动生成在Play商店或公开使用的密钥存储区,SHA1和MD5密钥。
  • 现在创build您的最终APK文件的Play商店,并完全公开使用。