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/
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ź:
W zasadzie musiał uciekać sudo pip install google-api-python-client
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
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.
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