web-dev-qa-db-ja.com

キーストアを使用して、TravisCIのAndroidアプリのリリースバージョンに署名するためのベストプラクティスは何ですか?

私はTravisCIを使用して Androidアプリ をビルドしています。 パブリックリポジトリ にプッシュしたdebug.keystoreを使用してデバッグビルドで署名しています

しかし、リリースビルドをビルドし、これを使用してGoogle Playストアにアップロードしたいと思います gradleプラグイン

このプロセスには、keystorep12の証明書ファイルが必要です。

暗号化された環境変数をTravisCIに追加することはできますが、これらのファイルを保存するための最良の方法がわかりません。

質問1:これを行うためのベストプラクティスは何ですか?そして、誰かがオープンソースの実装を提供できますか? (見つかりませんでした)

1つの可能な実装:ユーザー名とパスワードを環境変数として安全に保存します。ファイルをSSL対応環境に保存し、単純なHTTP認証を使用してこれらのユーザー名とパスワードでファイルを保護します。ビルドプロセスを開始する前に、それらを使用してcurlを使用してダウンロードします。

質問2この実装はまったく意味がありますか?安全ですか?

追加:これらの2つのブログ投稿は、これに関連する優れた情報源ですが、残念ながら、いずれもこの質問に答えていません。

http://stablekernel.com/blog/deploying-google-play-continuous-delivery-Android-part-4/https://www.bignerdranch.com/blog/continuous -Android用の配信/

37
tasomaniac

更新(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'
    }
}

アプリ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'
    }
}

元の回答:

これを見たことがありますか answer ?彼は、自分のビルドを修正する「前」と「後」に、TravisCIビルドへのリンクを投稿しています。

これが彼の答えです:

ビルド #162#16 を比較します。

基本的に彼は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

ビルド前:

これは、キーが使用され、パスワードがTravisCI(TravisCIに安全に保存されている)から使用されるプロセスのsecure部分です。

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:

keystoreおよびp12証明書を持っている場合でも、両方が機能し、ストアへの公開に使用するには、パスワード("$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

27
Jared Burrows