<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Antoine CELLIER</title>
    <description>The latest articles on Forem by Antoine CELLIER (@antoinecellier).</description>
    <link>https://forem.com/antoinecellier</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F203799%2Fe826d402-3341-4fbe-a2b5-989621bb635c.png</url>
      <title>Forem: Antoine CELLIER</title>
      <link>https://forem.com/antoinecellier</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/antoinecellier"/>
    <language>en</language>
    <item>
      <title>Deploy React Native app on  Playstore with Fastlane and Github Actions ( 2 / 2 )</title>
      <dc:creator>Antoine CELLIER</dc:creator>
      <pubDate>Mon, 15 Mar 2021 09:40:59 +0000</pubDate>
      <link>https://forem.com/zenika/deploy-react-native-app-on-playstore-with-fastlane-and-github-actions-2-2-5gnc</link>
      <guid>https://forem.com/zenika/deploy-react-native-app-on-playstore-with-fastlane-and-github-actions-2-2-5gnc</guid>
      <description>&lt;p&gt;This is the second part of my post “Deploy React Native app on  Playstore with Fastlane and Github Actions”. &lt;br&gt;
All the sources of the application used here are available in this Github repository: &lt;a href="https://github.com/antoinecellier/rn-fastlane-githubactions" rel="noopener noreferrer"&gt;https://github.com/antoinecellier/rn-fastlane-githubactions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this part, we are going to set up Github Actions to build and upload an Android App Bundle on Playstore for each pre-release.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh5t6q0m756pjbpv1tazo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh5t6q0m756pjbpv1tazo.png" alt="Workflow Fastlane + Github Actions"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Setting up Github secrets
&lt;/h3&gt;

&lt;p&gt;First, we will see how to store sensitive datas in Github secrets in order to use it easily with Github actions.&lt;/p&gt;
&lt;h4&gt;
  
  
  Encrypt &lt;code&gt;release.keystore&lt;/code&gt; file and &lt;code&gt;service_account.json&lt;/code&gt; file with GPG.
&lt;/h4&gt;

&lt;p&gt;Github documentation suggests using GPG to encrypt your credentials and store them as Github secrets: &lt;br&gt;
&lt;a href="https://docs.github.com/en/actions/reference/encrypted-secrets#limits-for-secrets" rel="noopener noreferrer"&gt;https://docs.github.com/en/actions/reference/encrypted-secrets#limits-for-secrets&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;You must install GPG on your machine ( &lt;a href="https://gnupg.org" rel="noopener noreferrer"&gt;https://gnupg.org&lt;/a&gt; ), then encrypt these two files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;gpg &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nt"&gt;--armor&lt;/span&gt; release.keystore 
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Enter Passphrase 
&lt;span class="nv"&gt;$ &lt;/span&gt;gpg &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nt"&gt;--armor&lt;/span&gt; service_account.json 
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Enter Passphrase
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67y0ppz5k46cf4verpmv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67y0ppz5k46cf4verpmv.png" alt="Enter passphrase prompt for GPG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each file encrypted with GPG must have a passphrase associated with it. The passphrase is used for decryption. Once you have done this, two &lt;code&gt;.asc&lt;/code&gt; files have been generated. The idea is to store the contents of the &lt;code&gt;.asc&lt;/code&gt; files and its passphrase in the secrets of Github.&lt;/p&gt;

&lt;h3&gt;
  
  
  Store Github secrets
&lt;/h3&gt;

&lt;p&gt;According to the Fastlane configuration and files encrypted, you need to have these data in Github secrets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For &lt;code&gt;.keystore&lt;/code&gt; file:

&lt;ul&gt;
&lt;li&gt;Content of &lt;code&gt;.keystore.asc&lt;/code&gt; (&lt;code&gt;cat .keystore.asc&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Passphrase of &lt;code&gt;.keystore.asc&lt;/code&gt; for decrypt the file.&lt;/li&gt;
&lt;li&gt;Password of &lt;code&gt;.keystore&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Alias of &lt;code&gt;.keystore&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Key password of &lt;code&gt;.keystore&lt;/code&gt; file.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;For &lt;code&gt;service_account.json&lt;/code&gt; ( Playstore service account file ):

&lt;ul&gt;
&lt;li&gt;Content of &lt;code&gt;service_account.json.asc&lt;/code&gt; (&lt;code&gt;cat service_account.json.asc&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Passphrase of &lt;code&gt;service_account.json.asc&lt;/code&gt; for decrypt the file.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;On your repository Github page go to &lt;code&gt;Settings &amp;gt; Secrets&lt;/code&gt; , and create new secrets for each value above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnuexdr1l85y3hviiw09r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnuexdr1l85y3hviiw09r.png" alt="Example of secret form in Github"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Overview of Github secrets needed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4qiuimk1il7iyirzz8hm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4qiuimk1il7iyirzz8hm.png" alt="List of Github secrets"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up Github actions
&lt;/h3&gt;

&lt;p&gt;At the root of the application, create a &lt;code&gt;.github/&lt;/code&gt; folder with inside two folders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;workflows/&lt;/code&gt; folder with inside a file named &lt;code&gt;pre-release.yml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/&lt;/code&gt; folder with inside a file named &lt;code&gt;decrypt_android_keys.sh&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;.github/&lt;/code&gt; folder with files are available here: &lt;br&gt;
&lt;a href="https://github.com/antoinecellier/rn-fastlane-githubactions/tree/main/.github" rel="noopener noreferrer"&gt;https://github.com/antoinecellier/rn-fastlane-githubactions/tree/main/.github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's now take a look at the file &lt;code&gt;.github/scripts/scripts/decrypt_android_keys.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RELEASE_KEYSTORE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; release.keystore.asc 
gpg &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--passphrase&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RELEASE_KEYSTORE_PASSPHRASE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--batch&lt;/span&gt; release.keystore.asc &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; android/fastlane/release.keystore 

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SERVICE_ACCOUNT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; service_account.json.asc 
gpg &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--passphrase&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SERVICE_ACCOUNT_PASSPHRASE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--batch&lt;/span&gt; service_account.json.asc &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; android/fastlane/service_account.json 

&lt;span class="nb"&gt;rm &lt;/span&gt;release.keystore.asc service_account.json.asc

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The role of this file is to decrypt the &lt;code&gt;.keystore.asc&lt;/code&gt; and &lt;code&gt;service_account.json.asc&lt;/code&gt; files thanks to passphrase.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;.github/workflows/pre-release.yml&lt;/code&gt;, you will define your Github actions which trigger the lane for build and upload the Android App Bundle on Playstore. Here is its content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pre Release&lt;/span&gt; 

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
 &lt;span class="na"&gt;release&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
  &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;prereleased&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; 

 &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
 &lt;span class="na"&gt;Build-and-Deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
  &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt; 

  &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
   &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt; 
   &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Decrypt Android keys&lt;/span&gt; 
     &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sh ./.github/scripts/decrypt_android_keys.sh&lt;/span&gt; 
     &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;RELEASE_KEYSTORE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.RELEASE_KEYSTORE }}              RELEASE_KEYSTORE_PASSPHRASE&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.RELEASE_KEYSTORE_PASSPHRASE }} SERVICE_ACCOUNT&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SERVICE_ACCOUNT }}&lt;/span&gt; 
&lt;span class="na"&gt;SERVICE_ACCOUNT_PASSPHRASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SERVICE_ACCOUNT_PASSPHRASE }}&lt;/span&gt; 

   &lt;span class="s"&gt;- uses&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v1&lt;/span&gt; 
     &lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;10.x'&lt;/span&gt; 

&lt;span class="err"&gt;   &lt;/span&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-ruby@v1&lt;/span&gt; 
     &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;ruby-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2.x'&lt;/span&gt; 

   &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install packages&lt;/span&gt; 
     &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt; 
         &lt;span class="s"&gt;yarn&lt;/span&gt;

   &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Fastlane&lt;/span&gt; 
      &lt;span class="s"&gt;run&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gem install fastlane&lt;/span&gt;
   &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload to PlayStore&lt;/span&gt; 
      &lt;span class="s"&gt;run&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt; 
         &lt;span class="s"&gt;cd android &lt;/span&gt;
         &lt;span class="s"&gt;fastlane android playstoreInternal RELEASE_KEYSTORE_PASSWORD:${{secrets.RELEASE_KEYSTORE_PASSWORD}} &lt;/span&gt;
 &lt;span class="s"&gt;RELEASE_KEYSTORE_KEY_PASSWORD:${{secrets.RELEASE_KEYSTORE_KEY_PASSWORD}} RELEASE_KEYSTORE_ALIAS:${{secrets.RELEASE_KEYSTORE_ALIAS}}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's dig in this file. We first define the action’s trigger, in this case on each &lt;code&gt;pre-release&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pre Release&lt;/span&gt; 
 &lt;span class="s"&gt;on&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; 
  &lt;span class="na"&gt;release&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
   &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;prereleased&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we declare a job named &lt;code&gt;Build-and-Deploy&lt;/code&gt; which runs on Ubuntu environment.&lt;br&gt;
The job will execute &lt;code&gt;decrypt_android_keys.sh&lt;/code&gt; thanks to Github secrets.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jobs: Build-and-Deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
 &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt; 

 &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt; 
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Decrypt Android keys&lt;/span&gt; 
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sh ./.github/scripts/decrypt_android_keys.sh&lt;/span&gt; 
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
     &lt;span class="na"&gt;RELEASE_KEYSTORE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.RELEASE_KEYSTORE }}               RELEASE_KEYSTORE_PASSPHRASE&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.RELEASE_KEYSTORE_PASSPHRASE }}&lt;/span&gt; 
     &lt;span class="na"&gt;SERVICE_ACCOUNT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SERVICE_ACCOUNT }}&lt;/span&gt; 
     &lt;span class="na"&gt;SERVICE_ACCOUNT_PASSPHRASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SERVICE_ACCOUNT_PASSPHRASE }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the content of &lt;code&gt;release.keystore.asc&lt;/code&gt; and &lt;code&gt;service_account.json.asc&lt;/code&gt; decrypted and retrieved, we setup and install Fastlane. To finish, the action run &lt;code&gt;playstoreInternal&lt;/code&gt; lane with each parameters needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v1&lt;/span&gt;
        &lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;10.x'&lt;/span&gt;

  &lt;span class="err"&gt;    &lt;/span&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-ruby@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ruby-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2.x'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install packages&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;yarn&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Fastlane&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gem install fastlane&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload to PlayStore&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;cd android&lt;/span&gt;
          &lt;span class="s"&gt;fastlane playstoreInternal   RELEASE_KEYSTORE_PASSWORD:${{secrets.RELEASE_KEYSTORE_PASSWORD}} RELEASE_KEYSTORE_KEY_PASSWORD:${{secrets.RELEASE_KEYSTORE_KEY_PASSWORD}} RELEASE_KEYSTORE_ALIAS:${{secrets.RELEASE_KEYSTORE_ALIAS}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Push the &lt;code&gt;.github/&lt;/code&gt; folder on your Github repository, and create a&lt;code&gt;pre-release&lt;/code&gt; to trigger this awesome Github action!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhysj5jwrlraylj2do2ox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhysj5jwrlraylj2do2ox.png" alt="Form to create pre-release"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here's the result 🎉 🚀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbrbh8n5sjb58dyr4efzz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbrbh8n5sjb58dyr4efzz.png" alt="Github action success"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have any other way to use Fastlane with Github actions or if you see a way to improve what I propose to you, please share it with us.&lt;/p&gt;

&lt;p&gt;A big thank you to &lt;a href="https://twitter.com/eric_briand" rel="noopener noreferrer"&gt;@eric_briand&lt;/a&gt;, &lt;a href="https://twitter.com/bpetetot" rel="noopener noreferrer"&gt;@bpetetot&lt;/a&gt; and &lt;a href="https://twitter.com/tbetous" rel="noopener noreferrer"&gt;@tbetous&lt;/a&gt; for their proofreading.&lt;/p&gt;

&lt;p&gt;Sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@StefMa/how-to-store-a-android-keystore-safely-on-github-actions-f0cef9413784" rel="noopener noreferrer"&gt;https://medium.com/@StefMa/how-to-store-a-android-keystore-safely-on-github-actions-f0cef9413784&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/features/actions" rel="noopener noreferrer"&gt;https://github.com/features/actions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>reactnative</category>
      <category>fastlane</category>
      <category>github</category>
      <category>android</category>
    </item>
    <item>
      <title>Deploy React Native app on  Playstore with Fastlane and Github Actions ( 1 / 2 )</title>
      <dc:creator>Antoine CELLIER</dc:creator>
      <pubDate>Mon, 15 Mar 2021 09:39:29 +0000</pubDate>
      <link>https://forem.com/zenika/deploy-react-native-app-on-the-playstore-with-fastlane-and-github-actions-1-2-8l2</link>
      <guid>https://forem.com/zenika/deploy-react-native-app-on-the-playstore-with-fastlane-and-github-actions-1-2-8l2</guid>
      <description>&lt;p&gt;With this series of two posts, I’m going to detail how to setup a continuous deployment for an Android app made with React Native. (Bonus: it also works without React Native!).&lt;/p&gt;

&lt;p&gt;I will use and configure Fastlane with Github Actions in order to deploy on Playstore at each pre-release or even each commit if you want. This post will be split into two parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy an Android App Bundle on Playstore with Fastlane&lt;/li&gt;
&lt;li&gt;Trigger Fastlane with Github Actions for uploading AAB (Android App Bundle) on Playstore.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this post, I will use AAB but you can also use APK.&lt;/p&gt;

&lt;p&gt;The source code of the application is available in this Github repository: &lt;a href="https://github.com/antoinecellier/rn-fastlane-githubactions/" rel="noopener noreferrer"&gt;https://github.com/antoinecellier/rn-fastlane-githubactions/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffq05f42ic4q9ih6rv5qo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffq05f42ic4q9ih6rv5qo.png" alt="Fastlane worflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up Fastlane on your machine
&lt;/h3&gt;

&lt;p&gt;Fastlane is an open source platform aimed at simplifying Android and iOS deployment. It lets you automate every aspect of your development and release workflow. &lt;/p&gt;

&lt;p&gt;Your workflow will be defined by Ruby files which are called &lt;code&gt;Appfile&lt;/code&gt; and &lt;code&gt;Fastfile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Appfile&lt;/code&gt; stores useful information that are used across all Fastlane tools like your Apple ID or the application Bundle Identifier, to deploy your lanes faster and tailored on your project needs.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;FastFile&lt;/code&gt; contains the Lanes definition. The Lanes are functions that define actions to execute in a sequential way. For example: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;update version of the app&lt;/code&gt; -&amp;gt; &lt;code&gt;build the app&lt;/code&gt; -&amp;gt; &lt;code&gt;deploy the app&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To install it on your machine, follow these steps in Fastlane documentation: &lt;a href="https://docs.fastlane.tools/getting-started/android/setup/" rel="noopener noreferrer"&gt;https://docs.fastlane.tools/getting-started/android/setup/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To be sure that Fastlane is correctly installed, just use &lt;code&gt;fastlane --help&lt;/code&gt; in the terminal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl89bu13q1qokgylmvpp2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl89bu13q1qokgylmvpp2.png" alt="Check Fastlane installation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a Google Developers service account
&lt;/h3&gt;

&lt;p&gt;The Google Developers Services will be used to upload an Android App Bundle on Playstore.&lt;/p&gt;

&lt;p&gt;Follow these steps in Fastlane documentation: &lt;a href="https://docs.fastlane.tools/actions/upload_to_play_store/#setup" rel="noopener noreferrer"&gt;https://docs.fastlane.tools/actions/upload_to_play_store/#setup&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the end of these steps, you will have a credentials json file looking like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"private_key_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"private_key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"client_email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"client_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"auth_uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"token_uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"auth_provider_x509_cert_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"client_x509_cert_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Generate a Keystore file in order to sign in the app
&lt;/h3&gt;

&lt;p&gt;If you use Android App Bundles, you need to sign the app bundle before you upload it to the Play Console, and Play App Signing takes care of the rest.&lt;/p&gt;

&lt;p&gt;Generate a release.keystore file. 4 mandatory elements are in this file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The file itself.&lt;/li&gt;
&lt;li&gt;The key alias (see the keytool command below).&lt;/li&gt;
&lt;li&gt;The keystore password.&lt;/li&gt;
&lt;li&gt;The key password.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;keytool &lt;span class="nt"&gt;-genkey&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-keystore&lt;/span&gt; release.keystore &lt;span class="nt"&gt;-alias&lt;/span&gt; &amp;lt;your key &lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;-keyalg&lt;/span&gt; RSA &lt;span class="nt"&gt;-keysize&lt;/span&gt; 2048 &lt;span class="nt"&gt;-validity&lt;/span&gt; 10000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more information, go to &lt;a href="https://developer.android.com/studio/publish/app-signing#generate-key" rel="noopener noreferrer"&gt;https://developer.android.com/studio/publish/app-signing#generate-key&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Before continuing, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;functional Fastlane&lt;/strong&gt; on your machine.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Google Developer service account&lt;/strong&gt; with your json credentials file.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;release.keystore&lt;/strong&gt; file generated.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Setting up Fastlane
&lt;/h3&gt;

&lt;p&gt;From now on, we will consider that the Android configuration files are generated by React Native init without changes.&lt;/p&gt;

&lt;p&gt;Here is how to initialise a React Native app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npx react-native init AwesomeProject
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the Android folder, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prompt steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provide the package name for the application when asked (e.g. com.my.app).&lt;/li&gt;
&lt;li&gt;Press enter when asked for the path to your json secret file.&lt;/li&gt;
&lt;li&gt;Answer 'n' when asked if you plan on uploading info to Google Play via Fastlane (we can set this up later).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F407gu4dvr0etdushxwrk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F407gu4dvr0etdushxwrk.png" alt="Prompt steps for Fastlane init"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fastlane folder has been created and contains two files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Appfile&lt;/code&gt; which defines global configuration information of the app.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FastFile&lt;/code&gt; which defines lanes of Fastlane.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;service_account.json&lt;/code&gt; file of your Google Developer service account will be used in &lt;code&gt;AppFile&lt;/code&gt;. Copy the json file inside the Fastlane folder and modify &lt;code&gt;android/fastlane/AppFile&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;json_key_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"fastlane/service_account.json"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="n"&gt;package_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"com.my.app"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can now test the connection to the Google Play Store:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane run validate_play_store_json_key json_key:/path/to/your/file.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fawavjcjdml44cmy23ujs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fawavjcjdml44cmy23ujs.png" alt="Playstore credentials validation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up fastlane plugins
&lt;/h3&gt;

&lt;p&gt;Plugins allow reuse fonctions created by the community by installing them from the Fastlane client. &lt;/p&gt;

&lt;p&gt;You going to add Fastlane plugins for:&lt;/p&gt;

&lt;p&gt;Retrieve the version number of the application in the package.json file that will define the version number of the Android App Bundle. For this,  we need to add the  load_json plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane add_plugin load_json
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Should fastlane modify the Gemfile 
    at path &lt;span class="s1"&gt;'/xxx/react-native-app/android/Gemfile'&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;you? &lt;span class="o"&gt;(&lt;/span&gt;y/n&lt;span class="o"&gt;)&lt;/span&gt; 
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To be uploaded on Playstore, each AAB or APK must have a unique version code. To set the version code of your app, install the &lt;code&gt;versioning_android&lt;/code&gt; plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane add_plugin versioning_android
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Now let's configure the first lane in the &lt;code&gt;FastFile&lt;/code&gt; file.
&lt;/h3&gt;

&lt;p&gt;The first thing to do is to implement a function that generates a unique &lt;code&gt;versionCode&lt;/code&gt; for the Android App Bundle. Put this function, that generate a new version code, in the upper part of the &lt;code&gt;android/fastlane/FastFile&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;default_platform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:android&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getVersionCode&lt;/span&gt;
  &lt;span class="c1"&gt;# Instead of managing the version code manually it is based on a timestamp in seconds&lt;/span&gt;
  &lt;span class="c1"&gt;# Any build done more recently is considered to be a higher version&lt;/span&gt;
  &lt;span class="c1"&gt;# versionCode increase every minute (so max 1 build per minute)&lt;/span&gt;
  &lt;span class="c1"&gt;# versionCode cannot be smaller than legacyVersionCode&lt;/span&gt;
  &lt;span class="n"&gt;thirtySeptemberTwentyTwenty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1601480940&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;
  &lt;span class="n"&gt;legacyVersionCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10902&lt;/span&gt;
  &lt;span class="n"&gt;versionCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;legacyVersionCode&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;thirtySeptemberTwentyTwenty&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;versionCode&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2100000000&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="s2"&gt;"versionCode cannot be higher than 2100000000"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="n"&gt;versionCode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And define the first lane that will use getVersionCode to update &lt;code&gt;android.defaultConfig.versionCode&lt;/code&gt; in the &lt;code&gt;app/build.gradle&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;...&lt;/span&gt; 
 &lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="ss"&gt;:android&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;   
  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;"Increments internal build number tracking (different than version)"&lt;/span&gt; 
    &lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:bump_build_number&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; 
     &lt;span class="n"&gt;android_set_version_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; 
      &lt;span class="ss"&gt;version_code: &lt;/span&gt;&lt;span class="n"&gt;getVersionCode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
     &lt;span class="p"&gt;)&lt;/span&gt; 
 &lt;span class="k"&gt;end&lt;/span&gt; 
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Still in &lt;code&gt;android/fastlane/FastFile&lt;/code&gt;, you can define the lane for building and uploading the Android App Bundle on Playstore.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;"Build and uploads the app to playstore for a internal testing release"&lt;/span&gt;
  &lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:playstoreInternal&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="c1"&gt;# Retrieve version of my app in package.json (React Native case)&lt;/span&gt;
    &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;json_path: &lt;/span&gt;&lt;span class="s2"&gt;"../package.json"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Clean build folder&lt;/span&gt;
    &lt;span class="n"&gt;gradle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="ss"&gt;task: &lt;/span&gt;&lt;span class="s2"&gt;"clean"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Bump android.defaultConfig.versionCode&lt;/span&gt;
    &lt;span class="n"&gt;bump_build_number&lt;/span&gt;

    &lt;span class="c1"&gt;# Do the bundle of the application&lt;/span&gt;
    &lt;span class="n"&gt;gradle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="ss"&gt;task: &lt;/span&gt;&lt;span class="s1"&gt;'bundle'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="ss"&gt;build_type: &lt;/span&gt;&lt;span class="s1"&gt;'Release'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="ss"&gt;properties: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"android.injected.signing.store.file"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Dir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pwd&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"/release.keystore"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"android.injected.signing.store.password"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:RELEASE_KEYSTORE_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;# keystore password&lt;/span&gt;
        &lt;span class="s2"&gt;"android.injected.signing.key.alias"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:RELEASE_KEYSTORE_ALIAS&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;# alias&lt;/span&gt;
        &lt;span class="s2"&gt;"android.injected.signing.key.password"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:RELEASE_KEYSTORE_KEY_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;# key password&lt;/span&gt;
        &lt;span class="s2"&gt;"vname"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Upload Android App Bundle to PlayStore like Internal testing Release&lt;/span&gt;
    &lt;span class="n"&gt;upload_to_play_store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="ss"&gt;track: &lt;/span&gt;&lt;span class="s1"&gt;'internal'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="ss"&gt;release_status: &lt;/span&gt;&lt;span class="s1"&gt;'draft'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# &amp;lt;http://docs.fastlane.tools/actions/upload_to_play_store/#parameters&amp;gt;&lt;/span&gt;
      &lt;span class="ss"&gt;skip_upload_apk: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="ss"&gt;version_name: &lt;/span&gt;&lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s look into details the lane:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First we retrieve the application version from the &lt;code&gt;package.json&lt;/code&gt; file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;"Build and uploads the app to playstore for a internal testing release"&lt;/span&gt;
&lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:playstoreInternal&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;json_path: &lt;/span&gt;&lt;span class="s2"&gt;"../package.json"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Then clean up the build folder and use &lt;code&gt;bump_build_number&lt;/code&gt; lane created above:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;gradle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
 &lt;span class="ss"&gt;task: &lt;/span&gt;&lt;span class="s2"&gt;"clean"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;bump_build_number&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Finally, we define a gradle task to build the application in the app/build.gradle file:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;gradle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="ss"&gt;task: &lt;/span&gt;&lt;span class="s1"&gt;'bundle'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;build_type: &lt;/span&gt;&lt;span class="s1"&gt;'Release'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;properties: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="s2"&gt;"android.injected.signing.store.file"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Dir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pwd&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"/release.keystore"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;"android.injected.signing.store.password"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:RELEASE_KEYSTORE_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;# keystore password&lt;/span&gt;
         &lt;span class="s2"&gt;"android.injected.signing.key.alias"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:RELEASE_KEYSTORE_ALIAS&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;# alias&lt;/span&gt;
         &lt;span class="s2"&gt;"android.injected.signing.key.password"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:RELEASE_KEYSTORE_KEY_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;# key password&lt;/span&gt;
         &lt;span class="s2"&gt;"vname"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
       &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4 different properties are needed to allow gradle to sign your application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;android.injected.signing.store.file&lt;/code&gt;: Path to the release.keystore file.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;android.injected.signing.store.password&lt;/code&gt;: Keystore password.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;android.injected.signing.key.alias&lt;/code&gt;: Key alias of the release.keystore file.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;android.injected.signing.key.password&lt;/code&gt;: key password.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three of these properties are sensitive information, so they can be filled through the Fastlane parameters. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane playstoreInternal RELEASE_KEYSTORE_PASSWORD:&lt;span class="k"&gt;**&lt;/span&gt;keystore password&lt;span class="k"&gt;**&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this step, you can check if the application is properly bundled. Copy your &lt;code&gt;release.keystore&lt;/code&gt; file in the &lt;code&gt;android/fastlane&lt;/code&gt; folder and run the command below with the passwords and the alias of your &lt;code&gt;release.keystore&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane playstoreInternal 
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   RELEASE_KEYSTORE_PASSWORD:&lt;span class="k"&gt;**&lt;/span&gt;mypassword&lt;span class="k"&gt;**&lt;/span&gt; 
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;       RELEASE_KEYSTORE_ALIAS:&lt;span class="k"&gt;**&lt;/span&gt;myalias&lt;span class="k"&gt;**&lt;/span&gt; 
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;       RELEASE_KEYSTORE_KEY_PASSWORD:&lt;span class="k"&gt;**&lt;/span&gt;mykeypassword&lt;span class="k"&gt;**&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you copy paste the entire file above, comment &lt;code&gt;upload_to_play_store&lt;/code&gt; action in order to just test Gradle build.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvq0290ybuwao8lju64qa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvq0290ybuwao8lju64qa.png" alt="Test of the build release lane"&gt;&lt;/a&gt;&lt;br&gt;
The last step of the lane is to upload the aab on Playstore:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;upload_to_play_store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;track: &lt;/span&gt;&lt;span class="s1"&gt;'internal'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# 'internal' for internal testing release&lt;/span&gt;
  &lt;span class="ss"&gt;release_status: &lt;/span&gt;&lt;span class="s1"&gt;'draft'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# http://docs.fastlane.tools/actions/upload_to_play_store/#parameters&amp;gt;&lt;/span&gt;
  &lt;span class="ss"&gt;skip_upload_apk: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# if you want to upload apk, use skip_upload_aab instead&lt;/span&gt;
  &lt;span class="ss"&gt;version_name: &lt;/span&gt;&lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's time to test the whole workflow of your awesome lane:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;fastlane playstoreInternal 
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   RELEASE_KEYSTORE_PASSWORD:&lt;span class="k"&gt;**&lt;/span&gt;mypassword&lt;span class="k"&gt;**&lt;/span&gt; 
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;       RELEASE_KEYSTORE_ALIAS:&lt;span class="k"&gt;**&lt;/span&gt;myalias&lt;span class="k"&gt;**&lt;/span&gt; 
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;       RELEASE_KEYSTORE_KEY_PASSWORD:&lt;span class="k"&gt;**&lt;/span&gt;mykeypassword&lt;span class="k"&gt;**&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1zpatiz1drwjzn12chk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1zpatiz1drwjzn12chk.png" alt="Test of the deploy release lane"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's check the result in the Google Play Console.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh8w8tg4h6s1n1owfe43r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh8w8tg4h6s1n1owfe43r.png" alt="AAB uploaded on Playstore"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have another way to upload your applications on Playstore or to improve this workflow, please feel free to share it with us.&lt;/p&gt;

&lt;p&gt;Source code is available in this repository:&lt;br&gt;
&lt;a href="https://github.com/antoinecellier/rn-fastlane-githubactions" rel="noopener noreferrer"&gt;https://github.com/antoinecellier/rn-fastlane-githubactions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the second part of this post we will see how to use Github Actions in order to upload an Android App Bundle on Playstore at each pre-release.&lt;/p&gt;

&lt;p&gt;A big thank you to &lt;a href="https://twitter.com/eric_briand" rel="noopener noreferrer"&gt;@eric_briand&lt;/a&gt;, &lt;a href="https://twitter.com/bpetetot" rel="noopener noreferrer"&gt;@bpetetot&lt;/a&gt; and &lt;a href="https://twitter.com/tbetous" rel="noopener noreferrer"&gt;@tbetous&lt;/a&gt; for their proofreading.&lt;/p&gt;

&lt;p&gt;Sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.android.com/studio/publish/app-signing#generate-key" rel="noopener noreferrer"&gt;https://developer.android.com/studio/publish/app-signing#generate-key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.fastlane.tools/getting-started/android/setup/" rel="noopener noreferrer"&gt;https://docs.fastlane.tools/getting-started/android/setup/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.gradle.org/current/userguide/userguide.html" rel="noopener noreferrer"&gt;https://docs.gradle.org/current/userguide/userguide.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>reactnative</category>
      <category>fastlane</category>
      <category>android</category>
      <category>playstore</category>
    </item>
  </channel>
</rss>
