Jaka jest najlepsza praktyka używania klawiszy do podpisywania wersji wersji aplikacji na Androida w Travis CI?

Używałem Travis CI, aby zbudować moją aplikację na Androida. Podpisuję go w kompilacjach debugowania za pomocą debug.keystore, które pchnąłem do publicznego repozytorium

Ale chcę zbudować release build i przesłać je do Sklepu Google Play za pomocą tej gradle plugin .

Ten proces wymaga pliku certyfikatu keystore i p12.

Chociaż mogę dodać zaszyfrowane zmienne środowiskowe do Travis CI, Nie wiem, jak najlepiej przechowywać te pliki.

Pytanie 1: Jaka jest najlepsza praktyka, aby to zrobić? A czy ktoś może dostarczyć implementację open source? (Nie mogłem znaleźć)

Jedna możliwa implementacja: bezpiecznie przechowuje nazwę użytkownika i hasło jako zmienną środowiskową. Przechowuj pliki w środowisku z obsługą SSL i chroń je za pomocą nazwy użytkownika i hasła za pomocą prostego uwierzytelniania HTTP. Użyj ich do pobrania za pomocą curl przed rozpoczęciem procesu budowania.

Pytanie 2 Czy czy to wdrożenie ma w ogóle sens? Czy to bezpieczne?

Extra: TE 2 posty na blogu są świetnymi źródłami związanymi z tym, ale żaden z nich nie odpowiada niestety na to pytanie.

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

Author: JasonMArcher, 2015-04-28

2 answers

Aktualizacja (5/28/15):

Zacząłem implementować moje rozwiązanie tutaj (open source): https://github.com/NonameDev/MathApp

  • użycie System.getenv("TRAVIS") aby wykryć, że Twoja Budowa działa na Travisa.
  • storeFile rootProject.file('release.keystore') - keep release key in your own repozytorium-travis ukryje hasło]}
  • storePassword System.getenv("KEYSTORE_PASS") - przechowuj zmienną środowiskową na travis-travis ukryje wyjście
  • keyAlias System.getenv("ALIAS_NAME") - store environment variable na travis - travis ukryje wyjście
  • keyPassword System.getenv("ALIAS_PASS") - przechowuj zmienną środowiskową na travis-travis ukryje wyjście
  • System.getenv("SERVICE_EMAIL") - przechowuj zmienną środowiskową na travis-travis ukryje wyjście
  • rootProject.file('play.p12') - przechowuj cert lokalnie-travis będzie przechowywać konto usługi e-mail

Top 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'
    }
}

Oryginalna Odpowiedź:

Widziałeś tę odpowiedź ? Zamieszcza link do jego TravisCI buduje" przed "i" po " poprawiając jego budowę.

Oto jego odpowiedź:

Porównaj build #162 oraz #163.

W zasadzie musiał uciekać sudo pip install google-api-python-client

W związku z tym, sprawdziłem repo github tutaj.

Oto jego .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>

Źródło: https://github.com/mg6maciej/VielenGamesAndroidClient/blob/develop/.travis.yml

Przed zbudowaniem:

To jest secure część procesu, w której używane są klucze i hasło z TravisCI (bezpiecznie przechowywane w TravisCI).

before_install:
  - ci/decrypt_files
  - ci/start_emulator

Źródło 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

Źródło: https://github.com/mg6maciej/VielenGamesAndroidClient/blob/develop/ci/decrypt_files

Po Zbudowaniu:

To jest gdzie python i inne Google biblioteki są pobierane i używane do wdrażania aplikacji do Google Play.

after_success:
  - ci/deploy_all

Źródło ci/deploy_all:

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

Źródło 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

Bezpieczeństwo:

Twoje Pytanie 1:

Uważam, że musisz mieć zarówno keystore, jak i p12 dla aplikacji, ale możesz bezpiecznie zapisać swoje hasło za pomocą TravisCI(patrz "$file_password"), tak jak w powyższym przykładzie.

Twoje Pytanie 2:

Nawet jeśli posiadasz certyfikat keystore i p12, nadal potrzebujesz hasła (zobacz "$file_password") zarówno do pracy, jak i do publikacji w sklepie.

Dla dodatkowego bezpieczeństwa, chcesz dodać kolejny login z mniej uprawnień niż główny login. Oto co zrobił autor repo tutaj :

...

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.')

...

Źródło: https://github.com/mg6maciej/VielenGamesAndroidClient/blob/develop/ci/basic_upload_apks.py

 26
Author: Jared Burrows,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:09
  • gdy aplikacja zostanie ukończona, a następnie wyeksportowana.
  • w tym czasie automatycznie generuje klucze key-store, SHA1 i MD5, które są używane w Sklepie play lub publicznie.
  • teraz Utwórz ostateczny plik APK dla Sklepu play i doskonale używaj go publicznie.
 -3
Author: vishal gadhiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-02 12:44:08