簡體   English   中英

使用密鑰庫在Travis CI上簽署Android應用程序的發布版本的最佳做法是什么?

[英]What is the best practice to use keystores to sign release version of an Android app on Travis CI?

我一直在使用Travis CI來構建我的Android應用程序 我在調試版本中使用debug.keystore對其進行簽名,我將其推送到公共存儲庫

但我想構建發布版本並使用此gradle插件將其上傳到Google Play商店。

此過程需要keystorep12證書文件。

雖然我可以將加密的環境變量添加到Travis CI,但我不知道存儲這些文件的最佳方法。

問題1:這樣做的最佳做法是什么? 有人可以提供開源實現嗎? (我找不到一個)

一種可能的實現:安全地存儲用戶名和密碼作為環境變量。 將文件存儲在啟用SSL的環境中,並使用這些用戶名和密碼通過簡單的HTTP身份驗證保護它們。 在構建過程開始之前使用它們使用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):

我已經開始在這里實現我的解決方案(開源): https//github.com/NonameDev/MathApp

  • 使用System.getenv("TRAVIS")檢測您的構建是否在Travis上運行。
  • storeFile rootProject.file('release.keystore') - 將釋放密鑰保存在您自己的存儲庫中 - travis將隱藏密碼
  • storePassword System.getenv("KEYSTORE_PASS") - 在travis上存儲環境變量 - travis將隱藏輸出
  • keyAlias System.getenv("ALIAS_NAME") - 在travis上存儲環境變量 - travis將隱藏輸出
  • keyPassword System.getenv("ALIAS_PASS") - 在travis上存儲環境變量 - travis將隱藏輸出
  • System.getenv("SERVICE_EMAIL") - 在travis上存儲環境變量 - travis將隱藏輸出
  • rootProject.file('play.p12') - 本地存儲證書 - travis將存儲電子郵件服務帳戶

熱門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'
    }
}

App 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 #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

在構建之前:

這是使用密鑰的過程的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" )以使其工作並用於發布到商店。

對於額外的安全性,您要添加其他登錄比你主要的登錄權限 以下是回購的作者在這里做的事情

...

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密鑰。
  • 現在為Play商店創建最終的APK文件並完全公開使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM