{"id":93,"date":"2020-03-27T08:21:39","date_gmt":"2020-03-27T08:21:39","guid":{"rendered":"https:\/\/amelioretonparent.wordpress.com\/?p=93"},"modified":"2020-03-27T08:21:39","modified_gmt":"2020-03-27T08:21:39","slug":"android-publier-son-application-sur-le-play-store-via-gitlab","status":"publish","type":"post","link":"https:\/\/atpart.fr\/index.php\/2020\/03\/27\/android-publier-son-application-sur-le-play-store-via-gitlab\/","title":{"rendered":"Android: publier son application sur le Play Store via Gitlab"},"content":{"rendered":"<p style=\"text-align:justify;\">LE r\u00eave de tous d\u00e9veloppeurs Android : pouvoir publier son application automatiquement sur le <a href=\"https:\/\/play.google.com\/\">Play Store<\/a> directement depuis son serveur d&#8217;int\u00e9gration continue !<\/p>\n<p style=\"text-align:justify;\">Et c&#8217;est possible. Avec <a href=\"https:\/\/gitlab.com\/\">Gitlab<\/a> et l&#8217;utilisation du couple <a href=\"https:\/\/www.docker.com\/\">Docker<\/a>\/<a href=\"https:\/\/fastlane.tools\/\">Fastlane<\/a>. Il existe un tutoriel tr\u00e8s bien fait en anglais sur le sujet (<a href=\"https:\/\/about.gitlab.com\/blog\/2019\/01\/28\/android-publishing-with-gitlab-and-fastlane\/\">https:\/\/about.gitlab.com\/blog\/2019\/01\/28\/android-publishing-with-gitlab-and-fastlane\/<\/a>), toutefois j&#8217;ai but\u00e9 sur certaines parties avant de r\u00e9ussir \u00e0 r\u00e9aliser cette publication automatique.<\/p>\n<p style=\"text-align:justify;\"><strong>Mise en place de Fastlane<\/strong> : j&#8217;ai na\u00efvement cru au d\u00e9part que ce serait possible sans faire d&#8217;installation en local. Et bien oui et non. C&#8217;est n\u00e9cessaire pour initialiser les donn\u00e9es de version (et les mettre en gestion de configuration), mais c&#8217;est une information qui peut \u00eatre d\u00e9sactiv\u00e9e dans la partie publication. Et c&#8217;est bien utile pour comprendre la configuration \u00e0 mettre en place pour g\u00e9rer les mots de passe et fichiers de s\u00e9curit\u00e9 (keystore). Alors pour \u00e9viter une installation locale, voici la configuration \u00e0 faire pour fastlane (mise \u00e0 jour suite aux \u00e9volutions de la version de fastlane et en bonus la gestion fine des informations \u00e0 mettre \u00e0 jour = upload des images, changelogs, etc.) :<\/p>\n<pre>desc \"Promote Internal to Alpha\"\nlane :promote_internal_to_alpha do |options|\n  versions = google_play_track_version_codes(track: \"internal\")\n  version_code = versions[0]\n\n  upload_to_play_store(track: 'internal',\n    track_promote_to: 'alpha', skip_upload_apk: true,\n    skip_upload_aab: true, skip_upload_metadata: true,\n    skip_upload_images: true, skip_upload_screenshots: true,\n    skip_upload_changelogs: false, version_code: version_code)\nend<\/pre>\n<p style=\"text-align:justify;\">C&#8217;est un exemple de configuration pour publier automatiquement une version interne de votre application en tant que version alpha. La version est extraite automatiquement de la liste des versions internes (par contre c&#8217;est forc\u00e9ment la derni\u00e8re version disponible qui est utilis\u00e9e). Et toutes les informations sont laiss\u00e9es en l&#8217;\u00e9tat sauf le changelog.<\/p>\n<p style=\"text-align:justify;\"><strong>La gestion des \u00e9l\u00e9ments secrets<\/strong> : c&#8217;est un autre point important. En effet, ce n&#8217;est pas possible de simplement les fournir en dur dans la configuration (mots de passe par exemple) ou de les stocker dans en gestion de configuration avec le code source. Sinon, pourquoi s&#8217;emb\u00eater avec la s\u00e9curit\u00e9 ?<\/p>\n<p style=\"text-align:justify;\">Cette question est encore plus pertinente lorsque nous devons g\u00e9rer la signature de notre apk (ou aab) puis une connexion automatique au Play Store depuis l&#8217;int\u00e9gration continue. Pour cela, l&#8217;astuce fournie est tout simplement &#8220;magique&#8221; : transformer le keystore en affichage hexad\u00e9cimal pour le fournir ensuite sous forme de variable d&#8217;environnement. Brillant !<\/p>\n<p>L&#8217;outil magique est xxd.<\/p>\n<ol>\n<li style=\"text-align:justify;\">Pour passer du fichier keystore \u00e0 l&#8217;affichage hexad\u00e9cimal (enfin, je pr\u00e9f\u00e8re le mettre dans un fichier texte pour pouvoir faire un copier-coller plus facilement du contenu).<br \/>\n<em>xxd -p your_keystore.jks &gt; your_jks_file_hex.txt<\/em><\/li>\n<li style=\"text-align:justify;\">Pour passer de la variable d&#8217;environnement au fichier keystore, c&#8217;est tout simplement l&#8217;op\u00e9ration inverse.<br \/>\n<em>echo &#8220;$signing_jks_file_hex&#8221; | xxd -r -p &#8211; &gt; your_keystore.jks<\/em><\/li>\n<\/ol>\n<p style=\"text-align:justify;\">Pour la cl\u00e9 permettant de se connecter au Play Store, comme elle est fournie \u00e9galement au format json (c&#8217;est d\u00e9j\u00e0 du texte). Nous collons son contenu dans un variable d&#8217;environnement \u00e9galement.<\/p>\n<p>\u00a0 \u00a0 \u00a0 \u00a0 <em>echo $google_play_service_account_api_key_json &gt; ~\/google_play_api_key.json<\/em><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align:justify;\">Ensuite, il ne reste plus qu&#8217;\u00e0 tester toutes ces configurations depuis une branche d\u00e9di\u00e9e. Cela peut parfois prendre du temps. Notamment \u00e0 cause des probl\u00e8mes de copier-coller du contenu du fichier keystore. Il m&#8217;est arriv\u00e9 de &#8220;perdre&#8221; la fin du fichier lors de cette \u00e9tape. En retirant mes moufles, et en prenant directement la sortie console du xxd (plut\u00f4t que le fichier texte) cela marche beaucoup mieux.<\/p>\n<p style=\"text-align:justify;\">Finalement, cette configuration permet de s&#8217;affranchir du stockage du keystore sur sa machine. Notamment pour le travail d&#8217;\u00e9quipe : ainsi tout le monde est capable de publier une version de mani\u00e8re autonome \ud83d\ude42<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>LE r\u00eave de tous d\u00e9veloppeurs Android : pouvoir publier son application automatiquement sur le Play Store directement depuis son serveur d&#8217;int\u00e9gration continue ! Et c&#8217;est possible. Avec Gitlab et l&#8217;utilisation du couple Docker\/Fastlane. Il existe un tutoriel tr\u00e8s bien fait en anglais sur le sujet (https:\/\/about.gitlab.com\/blog\/2019\/01\/28\/android-publishing-with-gitlab-and-fastlane\/), toutefois j&#8217;ai but\u00e9 sur certaines parties avant de r\u00e9ussir [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-93","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/atpart.fr\/index.php\/wp-json\/wp\/v2\/posts\/93","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atpart.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atpart.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atpart.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/atpart.fr\/index.php\/wp-json\/wp\/v2\/comments?post=93"}],"version-history":[{"count":0,"href":"https:\/\/atpart.fr\/index.php\/wp-json\/wp\/v2\/posts\/93\/revisions"}],"wp:attachment":[{"href":"https:\/\/atpart.fr\/index.php\/wp-json\/wp\/v2\/media?parent=93"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atpart.fr\/index.php\/wp-json\/wp\/v2\/categories?post=93"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atpart.fr\/index.php\/wp-json\/wp\/v2\/tags?post=93"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}