Подтвердить что ты не робот

Какова наилучшая практика использования хранилищ ключей для подписания версии Android-приложения на Travis CI?

Я использую Travis CI для создания моего приложения Android. Я подписываю его в отладочных сборках с debug.keystore, который я нажал на публичный репозиторий

Но я хочу построить сборку релизов и загрузить их в Google Play Store с помощью этого gradle плагина.

Для этого процесса требуется файл сертификата keystore и p12.

Пока я могу добавить зашифрованные переменные среды в 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/

4b9b3361

Ответ 1

Обновлено (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'
    }
}

Исходный ответ:

Вы видели этот ответ? Он отправляет ссылку на свои сборки TravisCI "до" и "после", исправляя свою сборку.

Вот его ответ:

Сравнить сборку # 162а также # 163.

В основном он должен был запустить sudo pip install google-api-python-client

С учетом сказанного я проверил здесь github repo .

Вот его .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 libs загружаются и используются для развертывания приложения в 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:

Я считаю, что для приложения должны быть как keystore, так и p12, но вы можете безопасно хранить свой пароль с помощью TravisCI (см. "$file_password"), как и в примере выше.

Ваш вопрос 2:

Даже если у вас есть сертификат keystore и p12, вам все равно нужен пароль (см. "$file_password") для работы и использования для публикации в хранилище.

Для дополнительной безопасности вы хотите добавить другой логин с меньшими разрешениями, чем основной вход. Вот что автор репо сделал здесь:

...

TRACK = 'beta'  # Can be 'alpha', beta', 'production' or 'rollout'

SERVICE_ACCOUNT_EMAIL = (
    '[email protected]account.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

Ответ 2

  • Когда ваше приложение будет завершено, после его экспорта.
  • В это время автоматически создаются ключи хранения ключей, SHA1 и MD5, которые используются в магазине воспроизведения или публично.
  • Теперь создайте свой окончательный файл APK для игрового магазина и полностью используйте его публично.