<?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>DEV Community: Jeff Gaoey</title>
    <description>The latest articles on DEV Community by Jeff Gaoey (@gaoey).</description>
    <link>https://dev.to/gaoey</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F102641%2Fbed6386f-f83d-4a35-a147-e1c6193c99f3.jpeg</url>
      <title>DEV Community: Jeff Gaoey</title>
      <link>https://dev.to/gaoey</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gaoey"/>
    <language>en</language>
    <item>
      <title>Multiple Environments in React Native with Appcenter + Fastlane (Android only)</title>
      <dc:creator>Jeff Gaoey</dc:creator>
      <pubDate>Fri, 25 Feb 2022 09:46:43 +0000</pubDate>
      <link>https://dev.to/gaoey/multiple-environments-in-react-native-with-appcenter-fastlane-android-only-37c</link>
      <guid>https://dev.to/gaoey/multiple-environments-in-react-native-with-appcenter-fastlane-android-only-37c</guid>
      <description>&lt;h2&gt;
  
  
  PART 1 - Registering Appcenter
&lt;/h2&gt;

&lt;p&gt;1.Register Appcenter here &lt;a href="https://appcenter.ms/" rel="noopener noreferrer"&gt;https://appcenter.ms/&lt;/a&gt;&lt;br&gt;
2.Add new app in Appcenter&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%2Fzyqbln1ox48wngdz1580.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%2Fzyqbln1ox48wngdz1580.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
3.Following Getting Started&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%2Fsgqkstbat2fu9q3egowi.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%2Fsgqkstbat2fu9q3egowi.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
4.Get &lt;code&gt;API_TOKEN&lt;/code&gt; &lt;br&gt;
go to &lt;code&gt;Settings -&amp;gt; App API tokens -&amp;gt; Click New Api token&lt;/code&gt; &lt;br&gt;
Warning! please save your &lt;code&gt;API_TOKEN&lt;/code&gt; because It will disappear in next time.&lt;br&gt;
5.Wording you must know&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Owner Name = project's owner
App Name = project name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you can get both from Appcenter url.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://appcenter.ms/users/{{owner-name}}/apps/{{app-name}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;organization account it will show like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://appcenter.ms/orgs/{{your-owner-name}}/apps/{{app-name}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then create app in Appcenter for each environment you have (Repeat step 1 to 5)&lt;/p&gt;

&lt;h2&gt;
  
  
  PART 2 - Install react-native-config
&lt;/h2&gt;

&lt;p&gt;Using react-native-config for using environment variable&lt;/p&gt;

&lt;p&gt;1.Installation&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install - save react-native-config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.Setup react-native-config for android&lt;br&gt;
Manually apply a plugin to your app at &lt;code&gt;android/app/build.gradle&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See more in react-native-config docs. below here.&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/react-native-config" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.Create your own environment files (.env.development,&amp;nbsp;.env.preprod etc.)&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%2Fj2yfjddgzlb30nq3zc98.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%2Fj2yfjddgzlb30nq3zc98.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Now you can use in your project like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// file .env

REACT_APP_URL_BACKEND_API=localhost:3000
ENV_NAME=demo
BUILD_VERSION=0.0.1
&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%2Fb67hnwbljydkx549ki4u.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%2Fb67hnwbljydkx549ki4u.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.Don't forget to add Appcenter environment variable in your environment file, For example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// file .env

REACT_APP_URL_BACKEND_API=localhost:3000
ENV_NAME=demo
BUILD_VERSION=0.0.1
APPCENTER_API_TOKEN=xxx
APPCENTER_OWNER_NAME=xxx
APPCENTER_OWNER_TYPE=xxx
APPCENTER_APP_NAME_IOS=xxx
APPCENTER_APP_NAME_ANDROID=xxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  PART 3 - Setup Product Flavors for&amp;nbsp;Android
&lt;/h2&gt;

&lt;p&gt;1.Go to &lt;code&gt;android/app/build.gradle&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2.Add env configuration.&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%2F0r8b2iswvdh5xm8e2qp3.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%2F0r8b2iswvdh5xm8e2qp3.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.Set flavorDimensions as "default"&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%2Fzl6ei12razfcxa1139io.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%2Fzl6ei12razfcxa1139io.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Create product flavor following format here&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;productFalvors {
 [env name] {
     applicationIdSuffix '.{{env file suffix}}'
     resValue "string", "build_config_package", "{{package name}}"
 }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Environment file suffix is the suffix of your environment file&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;For example&lt;br&gt;
env file name is&amp;nbsp;.env.development &lt;br&gt;
your env file suffix is&amp;nbsp;.development&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Package name. - you can get this in AndroidManifest.xml
&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%2F54ik6bywxvksoi0ozr1d.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally you will get Product Flavor like this&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%2Fxb50bkp7jd1qrwr9wrhp.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%2Fxb50bkp7jd1qrwr9wrhp.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  PART 4 - Creating launch screen and Icon for all&amp;nbsp;flavors
&lt;/h2&gt;

&lt;p&gt;Usually by default android in react-native has res folder to keep the icon and launch screen. see more at &lt;code&gt;/android/app/src/main/res&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For multiple environments, We have to separate icons and launch screen for it own.&lt;/p&gt;

&lt;p&gt;1.Copy res folder at &lt;code&gt;/android/app/src/main/res&amp;nbsp;&lt;/code&gt;&lt;br&gt;
2.Create your environment folder in &lt;code&gt;/android/app/src&lt;/code&gt; level then paste &lt;code&gt;res&lt;/code&gt; folder in that. For example &lt;code&gt;/android/app/src/demo/res&lt;/code&gt;.&lt;br&gt;
3.Rename your environment app_name itself - go to &lt;code&gt;/android/app/src/demo/res/values/strings.xml&lt;/code&gt; and change value in&amp;nbsp;&lt;code&gt;&amp;lt;string name="app_name"&amp;gt;{{app-name}}&amp;lt;/string&amp;gt;&lt;/code&gt;&lt;br&gt;
4.Repeat step 2 and 3 for all your environments.&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%2Fxpxalgyblugm42d6t0qw.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%2Fxpxalgyblugm42d6t0qw.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
5.Remove &lt;code&gt;res&lt;/code&gt; folder in &lt;code&gt;/android/app/src/main/res&lt;/code&gt;&lt;br&gt;
6.Setup command for each environments in &lt;code&gt;package.json&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
// development
"start:android:dev": "APP_ENV=development ENVFILE=.env.development react-native run-android --variant=DevelopmentDebug",
"build:android:debug:dev": "cd android &amp;amp;&amp;amp; ENVFILE=.env.development ./gradlew assembleDevelopmentDebug",
"build:android:release:dev": "cd android &amp;amp;&amp;amp; ENVFILE=.env.development ./gradlew assembleDevelopmentRelease",
"start:dev": "APP_ENV=development ENVFILE=.env.development npx react-native start -- --reset-cache",

// demo
"start:android:demo": "APP_ENV=demo ENVFILE=.env.demo react-native run-android --variant=DemoDebug",
"build:android:debug:demo": "cd android &amp;amp;&amp;amp; ENVFILE=.env.demo ./gradlew assembleDemoDebug",
 "build:android:release:demo": "cd android &amp;amp;&amp;amp; ENVFILE=.env.demo ./gradlew assembleDemoRelease",
"start:demo": "APP_ENV=demo ENVFILE=.env.demo npx react-native start -- --reset-cache"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  PART 5- Integrating Fastlane
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Installing fastlane &lt;code&gt;brew install fastlane&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create Fastfile &lt;code&gt;/fastlane/Fastfile&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add deployment step in your Fastfile (Don't for get to add this in each environment you have)&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%2Fkol07rzndxx5wryoa80l.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%2Fkol07rzndxx5wryoa80l.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add command in &lt;code&gt;package.json&lt;/code&gt; for deployment.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
 "createbuild": "react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res",
"deploy:android:dev": "fastlane android_dev deploy --env development",
"deploy:android:demo": "fastlane android_demo deploy --env demo"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  PART 6 - Running&amp;nbsp;pipeline
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;npm run createbuild&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;remove /android/app/src/main/res&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npm run deploy:android:dev&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Thank you&lt;/p&gt;

&lt;p&gt;Credit&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/luggit/react-native-config" rel="noopener noreferrer"&gt;https://github.com/luggit/react-native-config&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.folio3.com/how-to-manage-multiple-environments-in-a-react-native-app-for-android" rel="noopener noreferrer"&gt;https://www.folio3.com/how-to-manage-multiple-environments-in-a-react-native-app-for-android&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>reactnative</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
