From 1750236474f72ec714f744102408e1873be4e72e Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Fri, 22 Nov 2019 07:05:43 +0100 Subject: [PATCH] Added automation for Google Play publication (using fastlane). --- .gitignore | 8 +++- DEVELOPER.md | 26 ++++++++++-- Gemfile | 3 ++ build.gradle | 5 +++ fastlane/Fastfile | 38 ++++++++++++++++++ .../metadata/android/en-US/featureGraphic.png | Bin 0 -> 2340 bytes fastlane/metadata/android/en-US/icon.png | Bin 0 -> 16349 bytes 7 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 Gemfile create mode 100644 fastlane/Fastfile create mode 100644 fastlane/metadata/android/en-US/featureGraphic.png create mode 100644 fastlane/metadata/android/en-US/icon.png diff --git a/.gitignore b/.gitignore index db883e965..086c3d65e 100644 --- a/.gitignore +++ b/.gitignore @@ -73,8 +73,12 @@ captures/ .idea/workspace.xml # Keystore files -# Uncomment the following line if you do not want to check your keystore files in. -#*.jks +*.jks # External native build folder generated in Android Studio 2.2 and later .externalNativeBuild + +# Fastlane +Appfile +releasePlayStore/* +Gemfile.lock \ No newline at end of file diff --git a/DEVELOPER.md b/DEVELOPER.md index 7d35839a0..cdfbcecee 100644 --- a/DEVELOPER.md +++ b/DEVELOPER.md @@ -1,6 +1,6 @@ -# OpenTrack: Developer information +# OpenTracks: Developer information -## Create releases for FDroid +## Craft new releases 1. Get next _version code_ (master branch): `git rev-list HEAD --count master` 2. Decide on _version name_ (semantic versioning) @@ -9,7 +9,27 @@ 5. Create commit with all changes 6. Tag newly create commit with _version name_ (e.g., v3.2.1) 7. Push commits and tags to public repository -8. Add changelog to tag (Github releases) +8. Add changelog to tag (Github releases) + +## F-Droid +Application id: de.dennisguse.opentracks + +It if it properly tagged F-Droid takes care of building the app and publishing. +Usually, it takes two days before the update is published (build, signed, and published). + +The recent build activity can be found [here](https://f-droid.org/wiki/index.php?title=Special:RecentChanges&days=7&from=&hidebots=0&hideanons=1&hideliu=1&limit=500) + +## Google Play Store +Application id: de.dennisguse.opentracks.playstore + +Requirement: `gem install fastlane` + +1. Update store meta data (e.g., description and screenshots) + `fastlane supply --version_code $(git rev-list HEAD --count master) --skip_upload_apk` + (requires API key) +2. Build signed apk + (requires keystore) +3. Upload signed apk to [Google Play Console](https://play.google.com/apps/publish) ## Translations (localization) diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000..7a118b49b --- /dev/null +++ b/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gem "fastlane" diff --git a/build.gradle b/build.gradle index 5548da256..ecafae418 100644 --- a/build.gradle +++ b/build.gradle @@ -74,6 +74,11 @@ android { release { minifyEnabled false } + + releasePlayStore { + applicationIdSuffix ".playstore" + versionNameSuffix "-PlayStore" + } } applicationVariants.all { variant -> diff --git a/fastlane/Fastfile b/fastlane/Fastfile new file mode 100644 index 000000000..19c557cc6 --- /dev/null +++ b/fastlane/Fastfile @@ -0,0 +1,38 @@ +# This file contains the fastlane.tools configuration +# You can find the documentation at https://docs.fastlane.tools +# +# For a list of all available actions, check out +# +# https://docs.fastlane.tools/actions +# +# For a list of all available plugins, check out +# +# https://docs.fastlane.tools/plugins/available-plugins +# + +# Uncomment the line if you want fastlane to automatically update itself +# update_fastlane + +default_platform(:android) + +platform :android do + desc "Runs all the tests" + lane :test do + gradle(task: "test") + end + + desc "Submit a new Beta Build to Crashlytics Beta" + lane :beta do + gradle(task: "clean assembleRelease") + crashlytics + + # sh "your_script.sh" + # You can also use other beta testing services here + end + + desc "Deploy a new version to the Google Play" + lane :deploy do + gradle(task: "clean assembleRelease") + upload_to_play_store + end +end diff --git a/fastlane/metadata/android/en-US/featureGraphic.png b/fastlane/metadata/android/en-US/featureGraphic.png new file mode 100644 index 0000000000000000000000000000000000000000..3191ed866a768b9b739d8bd244e0a5d7e8e9aa61 GIT binary patch literal 2340 zcmeAS@N?(olHy`uVBq!ia0y~yU;#22zi==CDIJ#+H9(59z$3Dlfk96hgc&QA+Lr+Z z*-JcqUD+S=u!-m}vv)YW1PV!(xJHyX=jZ08=9Mrw7o{eaq^2m8XO?6rxO@5rgg5eu zGca(>^K@|xskrs_x+5=;cf{bp{^y6;IM=rPz2*sY#E(Q3ph3()ECIv^fS7>|hz)?a zfe}dX0C55kqbR{GgI)6hkO72^g)2z_sVBir_+1M(7RA{IKz0lwH<1whU}s~E7y=$5 zHJoVeCK7@l9(RMyO(Y~!P?CfDBLT=EHjR@SPBeDY0g%&4a8m-qXc#y)6b^)q98%Kkt7K1kTp L)z4*}Q$iB}AKdhrU-(BDg>!Yl`4d) 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%0Dx zmGT6u)||B>Ef;kduuH6sfDT!=H$U_EQt`liV;E>!@PyX84`8TuXy1bvg-!&yX0$fB zhS;b-)mZ{66M_rx!>s^T2QXdYh zt#*2du(&uAi~S31vpC|G_^r+&=Rjm`P?F6PjC{kGszaYndluAB84>5PJWaw2y80p~ z$`SKqt2N3gc846^qmm2a&df_uIAnn5)5D6Bk;4S1yevUuK!7qCDjyb-qh`M$$+lgnH zSx*9&bM8kcFf>B|$FLPkDen%10`fOSR-c&+oi$&09WF_z=dhN3CMZ4&phU+Rw$ntgFxlNtofFZETOF3{ z_YMyb!P7wJrX&fe4^BD>BeN)@#Vj5cwOis(0_5>fylQJJ?kmtTWA)9G$hMo;4 z2t`LMV}jxUo$L>bMz<}c3aYZC00cSe#|~ZSv!jY+*aE>2YLXvi&=K>!V6goI3XZZKD8Iz7u2u214S_#D6}Wo5oZnC?ZReADorCB+m{7vf zuO>zgSUzw_d|@xjPf^|IVRidKrcDCkV)-^0o9dZ?ny}nPyPCll!g`ZE)EFtN_nB3)p8e#CxUY zZf~WB%6Y>Rd;vf16IY|AxwuawDK{tuXklmSP|t7y2UU_`L%@a1)A5$%3HhXp#NT7m z>IBf?7}(zP+g|(1XS3dTMp|}p_zLeq=jC1YvuyvorLqV>UIo)29_l~3g2qy|NO&_u zHGopqR~G&A2%A`X$ZQQbg11`g-@TH3oy;PfzkK2#ly`z$#b*VhH29I4iAx{hmNO#~ z`3~pMy*bMOBT#eE&-(!yl^^Y8T~-rcsLSUj+Vt`@3)LOcwt#2=-f6YiNmpln&T#*z zh_UssGbkpA5)bfydIhUYP1k3xfUjvTi`)+!zyN!pfdgK=PJX&jkGYfGUF0i+Mm03e zsv$w^8>-H1O@&|)SV0qDFYZ88JsbiDTaUG)6b~O%fiEzpL{w(-vRJV&$}PkxKE#G- zze#0S#`1aSzT1I+qXUcztWj)a%4zq5!3|y6dY7{eSSMWtB{8 XRM7fJOLm@?vc0y3?)AcJ=x6^I2=?37 literal 0 HcmV?d00001