{"id":279,"date":"2022-11-10T21:53:15","date_gmt":"2022-11-10T21:53:15","guid":{"rendered":"https:\/\/riddance.wasmer.app\/?p=279"},"modified":"2026-02-22T10:27:42","modified_gmt":"2026-02-22T10:27:42","slug":"github-ci-cd-for-multi-environment-deployment-on-firebase-multiple-sites","status":"publish","type":"post","link":"https:\/\/blog.ridwan.cc\/?p=279","title":{"rendered":"GitHub CI\/CD for multi-environment deployment on Firebase multiple\u00a0sites"},"content":{"rendered":"\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"889\" src=\"https:\/\/riddance.wasmer.app\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x.png\" alt=\"\" class=\"wp-image-280\" srcset=\"https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x.png 1600w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x-300x167.png 300w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x-1024x569.png 1024w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x-768x427.png 768w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x-1536x853.png 1536w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x-1320x733.png 1320w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/figure>\n\n\n\n<p>Hi, Here we\u2019ll cover how to automate your workflow on GitHub, deploy to multiple environments. This will assist in rapid iterations to your front-end app, without constantly pushing breaking changes to production. The goal is to have an environment for your users (production), an environment to approve changes prior to shipping (staging) and an environment that\u2019s actively being worked on (development).<\/p>\n\n\n\n<p>By the end of this article, your app will automatically be deployed to a specific Firebase Project simply by pushing to GitHub. Although we go extremely in-depth in this article, the end result is rather simple. The github repo can be seen&nbsp;<a href=\"https:\/\/github.com\/thisisrid\/firebase-cicd\" rel=\"noreferrer noopener\" target=\"_blank\"><strong>here<\/strong><\/a>.<\/p>\n\n\n\n<p>Let have a look some definition first.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong><em>Multi-Environment Deployment<\/em><\/strong><em>&nbsp;The standard practice for developing &amp; testing changes in an isolated environment.<\/em><\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong><em>CI\/CD<\/em><\/strong><em>: Continuous Integration is the practice of merging all outstanding changes in a code-base, as often as possible. Being sure to test at all points. Continuous deployment is the practice of automating deployments to your users. Getting them new updates regularly.<\/em><\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong><em>Firebase<\/em><\/strong><em>: A mobile and web application development platform, owned by Google, that provides a number of&nbsp;<\/em><a href=\"https:\/\/firebase.google.com\/products\" rel=\"noreferrer noopener\" target=\"_blank\"><em>products<\/em><\/a><em>&nbsp;for any real world app. In this article, we\u2019ll only be using \u201c<\/em><a href=\"https:\/\/firebase.google.com\/docs\/hosting\" rel=\"noreferrer noopener\" target=\"_blank\"><strong><em>Firebase Hosting<\/em><\/strong><\/a><em>\u201d.<\/em><\/p>\n<\/blockquote>\n\n\n\n<p>We are jumping into the process supposing you\u2019ve already got your front-end app setup. We will use React app here.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Initialize Firebase and Getting Firebase&nbsp;Token<\/h3>\n\n\n\n<p>Before start we need firebase initialization, run<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">firebase init<\/pre>\n\n\n\n<p>This is needed in order for GitHub to authenticate to your Firebase project. Allowing you to deploy.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">firebase login:ci<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong><em>Caution<\/em><\/strong><em>: this token can be used to perform almost any task on any Firebase project you have access to. Save it. If, for any reason, your token becomes compromised, you can run the following command:&nbsp;<\/em><code><em>firebase logout --token YOUR_TOKEN<\/em><\/code><\/p>\n<\/blockquote>\n\n\n\n<p>Now, you\u2019ll need to add your Firebase token to your repo\u2019s secrets. Navigate to your GitHub repo, go to&nbsp;<strong><em>\u201cSettings -&gt; Secrets -&gt; Add a New Secret\u201d<\/em><\/strong>.<\/p>\n\n\n\n<p><strong>Name<\/strong>: FIREBASE_TOKEN<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1220\" height=\"723\" src=\"https:\/\/riddance.wasmer.app\/wp-content\/uploads\/2026\/02\/10kqOXRDBlbngz5DwE_23cA.png\" alt=\"\" class=\"wp-image-281\" srcset=\"https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/10kqOXRDBlbngz5DwE_23cA.png 1220w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/10kqOXRDBlbngz5DwE_23cA-300x178.png 300w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/10kqOXRDBlbngz5DwE_23cA-1024x607.png 1024w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/10kqOXRDBlbngz5DwE_23cA-768x455.png 768w\" sizes=\"auto, (max-width: 1220px) 100vw, 1220px\" \/><figcaption class=\"wp-element-caption\">Set the firebase token in your github&nbsp;repo<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Create \u201cyml\u201d&nbsp;file<\/h3>\n\n\n\n<p>Now that we\u2019re all set up, let\u2019s create our initial workflow. Create a file at&nbsp;<code>.github\/workflows\/firebase_web.yml<\/code>, with the contents below.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">name: Firebase hosting<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">on:<br>  push:<br>    branches: [master, dev]<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">jobs:<br>  deploy:<br>    runs-on: ubuntu-latest<br>    steps:<br>      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it<br>      - uses: actions\/checkout@v2<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">      - name: Install firebase tools<br>        run: |<br>          sudo npm install -g firebase-tools<br>          firebase use rid1-test --token ${{secrets.FIREBASE_TOKEN}}<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">      - name: Build website<br>        run: |<br>          yarn<br>          yarn build<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">      - name: Deploy to staging site<br>        if: github.ref == 'refs\/heads\/dev'<br>        run: firebase deploy --only hosting:dev --non-interactive --token ${{secrets.FIREBASE_TOKEN}} -m \"RunID ${{ github.run_id }} Commit SHA ${{ github.sha }}\"<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">      - name: Deploy to production site<br>        if: github.ref == 'refs\/heads\/master'<br>        run: firebase deploy --only hosting:prod --non-interactive --token ${{secrets.FIREBASE_TOKEN}} -m \"RunID ${{ github.run_id }} Commit SHA ${{ github.sha }}\"<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">      - name: Archive build Artifact<br>        uses: actions\/upload-artifact@master<br>        with:<br>          path: build<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Workflow explained<\/h3>\n\n\n\n<p>We\u2019re creating a workflow that\u2019s triggered whenever a push is made on&nbsp;<strong>master<\/strong>&nbsp;and&nbsp;<strong>dev<\/strong>&nbsp;brances. The workflow runs on Ubuntu.<\/p>\n\n\n\n<p>Then, we install Node, which is needed for Firebase. After that, we run yarn (npm can also be used just fine) to install dependencies. From there, we run the typical \u201cbuild\u201d command that React ships with. After the build is complete, we deploy using Firebase CLI.<\/p>\n\n\n\n<p>We splite the deployment in 2 way. \u201cDeploy to staging site\u201d workflow will be triggered for&nbsp;<strong>dev<\/strong>&nbsp;branch another is for&nbsp;<strong>master.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3: Firebase configuration<\/h3>\n\n\n\n<p>Create \u201cfirebase.json\u201d file in your root directory and add the following codes;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{<br>  \"hosting\": [<br>    {<br>      \"target\": \"dev\",<br>      \"public\": \"dist\",<br>      \"ignore\": [\"firebase.json\", \"**\/.*\", \"**\/node_modules\/**\"]<br>    },<br>    {<br>      \"target\": \"prod\",<br>      \"public\": \"dist\",<br>      \"ignore\": [\"firebase.json\", \"**\/.*\", \"**\/node_modules\/**\"]<br>    }<br>  ]<br>}<\/pre>\n\n\n\n<p>Create \u201c.firebaserc\u201d file in your root directory and add the following codes<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{<br>  \"projects\": {<br>    \"default\": \"rid1-test\"<br>  },<br>  \"targets\": {<br>    \"rid1-test\": {<br>      \"hosting\": {<br>        \"dev\": [<br>          \"rid1-test-development\"<br>        ],<br>        \"prod\": [<br>          \"rid1-test-production\"<br>        ]<br>      }<br>    }<br>  }<br>}<\/pre>\n\n\n\n<p><strong>Explanation:<\/strong><\/p>\n\n\n\n<p>Here&nbsp;<strong>rid1-test<\/strong>&nbsp;is my Firebase project, \u201crid1-test-development\u201d and \u201crid1-test-production\u201d denotes the firebase multiple site names, first one is for the development another is for production. If&nbsp;<strong><em>example-dev.web.app<\/em><\/strong>&nbsp;is your firebase site then example-dev will be your site name.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Make sure you have created a firebase project and create similarly two sites from firebase&nbsp;<a href=\"https:\/\/console.firebase.google.com\/\" rel=\"noreferrer noopener\" target=\"_blank\"><strong>console<\/strong><\/a><strong>.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"784\" src=\"https:\/\/riddance.wasmer.app\/wp-content\/uploads\/2026\/02\/1Fdhc5UC7sPujW2zpxUmpsg.png\" alt=\"\" class=\"wp-image-282\" srcset=\"https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1Fdhc5UC7sPujW2zpxUmpsg.png 1600w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1Fdhc5UC7sPujW2zpxUmpsg-300x147.png 300w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1Fdhc5UC7sPujW2zpxUmpsg-1024x502.png 1024w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1Fdhc5UC7sPujW2zpxUmpsg-768x376.png 768w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1Fdhc5UC7sPujW2zpxUmpsg-1536x753.png 1536w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1Fdhc5UC7sPujW2zpxUmpsg-1320x647.png 1320w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><figcaption class=\"wp-element-caption\">Create firebase project and multiple&nbsp;site.<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Final step: Check the&nbsp;action!<\/h3>\n\n\n\n<p>Now to push to GitHub and see a successful action now&nbsp;: )<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">git add .<br>git commit -m 'WOW CI&amp;CD checking\/Github Action'<br>git push<\/pre>\n\n\n\n<p>Additionally, any pushes you make both on&nbsp;<strong>master\/dev<\/strong>&nbsp;should deploy to the correct Firebase project, based on the branch you\u2019re working on!!<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"501\" src=\"https:\/\/riddance.wasmer.app\/wp-content\/uploads\/2026\/02\/1tfwoj0lg2JVFwRQr4XXpZg.png\" alt=\"\" class=\"wp-image-284\" srcset=\"https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1tfwoj0lg2JVFwRQr4XXpZg.png 1600w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1tfwoj0lg2JVFwRQr4XXpZg-300x94.png 300w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1tfwoj0lg2JVFwRQr4XXpZg-1024x321.png 1024w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1tfwoj0lg2JVFwRQr4XXpZg-768x240.png 768w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1tfwoj0lg2JVFwRQr4XXpZg-1536x481.png 1536w, https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1tfwoj0lg2JVFwRQr4XXpZg-1320x413.png 1320w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/figure>\n\n\n\n<p><strong>All done!<\/strong><\/p>\n\n\n\n<p><strong>Congratulations! You\u2019re now ready to maximize your workflow by utilizing automated deployments to multiple environments \ud83d\ude80\ud83e\udd19\ud83c\udffb<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"https:\/\/riddance.wasmer.app\/wp-content\/uploads\/2026\/02\/14OkWvvA9AOP5vKjqLeWFzQ.gif\" alt=\"\" class=\"wp-image-283\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Happy Hacking!<\/h3>\n\n\n\n<p>Interested in the final result? Take a look at these&nbsp;<a href=\"https:\/\/github.com\/thisisrid\/firebase-cicd\" rel=\"noreferrer noopener\" target=\"_blank\"><strong>GitHub REPO<\/strong><\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hi, Here we\u2019ll cover how to automate your workflow on GitHub, deploy to multiple environments. This will assist in rapid iterations to your front-end app, without constantly pushing breaking changes to production. The goal is to have an environment for your users (production), an environment to approve changes prior to shipping (staging) and an environment [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":280,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24,2],"tags":[29,31,28,30],"class_list":["post-279","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it","category-software","tag-ci-cd","tag-deployment","tag-firebase","tag-hosting"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>GitHub CI\/CD for multi-environment deployment on Firebase multiple\u00a0sites &#8212; Ridwan&#039;s Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/riddance.wasmer.app\/?p=279\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GitHub CI\/CD for multi-environment deployment on Firebase multiple\u00a0sites &#8212; Ridwan&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"Hi, Here we\u2019ll cover how to automate your workflow on GitHub, deploy to multiple environments. This will assist in rapid iterations to your front-end app, without constantly pushing breaking changes to production. The goal is to have an environment for your users (production), an environment to approve changes prior to shipping (staging) and an environment [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/riddance.wasmer.app\/?p=279\" \/>\n<meta property=\"og:site_name\" content=\"Ridwan&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-11-10T21:53:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-22T10:27:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/riddance.wasmer.app\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"889\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"myworldshoyab\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"myworldshoyab\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/riddance.wasmer.app\/?p=279#article\",\"isPartOf\":{\"@id\":\"https:\/\/riddance.wasmer.app\/?p=279\"},\"author\":{\"name\":\"myworldshoyab\",\"@id\":\"https:\/\/riddance.wasmer.app\/#\/schema\/person\/6d1f43b456a7c5cdf8547c59c598b509\"},\"headline\":\"GitHub CI\/CD for multi-environment deployment on Firebase multiple\u00a0sites\",\"datePublished\":\"2022-11-10T21:53:15+00:00\",\"dateModified\":\"2026-02-22T10:27:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/riddance.wasmer.app\/?p=279\"},\"wordCount\":651,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/riddance.wasmer.app\/?p=279#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x.png\",\"keywords\":[\"CI\/CD\",\"Deployment\",\"Firebase\",\"Hosting\"],\"articleSection\":[\"IT\",\"Software\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/riddance.wasmer.app\/?p=279#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/riddance.wasmer.app\/?p=279\",\"url\":\"https:\/\/riddance.wasmer.app\/?p=279\",\"name\":\"GitHub CI\/CD for multi-environment deployment on Firebase multiple\u00a0sites &#8212; Ridwan&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\/\/riddance.wasmer.app\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/riddance.wasmer.app\/?p=279#primaryimage\"},\"image\":{\"@id\":\"https:\/\/riddance.wasmer.app\/?p=279#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x.png\",\"datePublished\":\"2022-11-10T21:53:15+00:00\",\"dateModified\":\"2026-02-22T10:27:42+00:00\",\"author\":{\"@id\":\"https:\/\/riddance.wasmer.app\/#\/schema\/person\/6d1f43b456a7c5cdf8547c59c598b509\"},\"breadcrumb\":{\"@id\":\"https:\/\/riddance.wasmer.app\/?p=279#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/riddance.wasmer.app\/?p=279\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/riddance.wasmer.app\/?p=279#primaryimage\",\"url\":\"https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x.png\",\"contentUrl\":\"https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x.png\",\"width\":1600,\"height\":889},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/riddance.wasmer.app\/?p=279#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/riddance.wasmer.app\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"GitHub CI\/CD for multi-environment deployment on Firebase multiple\u00a0sites\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/riddance.wasmer.app\/#website\",\"url\":\"https:\/\/riddance.wasmer.app\/\",\"name\":\"Ridwan's Blog\",\"description\":\"Ridwan blog\",\"alternateName\":\"Ridwanul Alam\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/riddance.wasmer.app\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/riddance.wasmer.app\/#\/schema\/person\/6d1f43b456a7c5cdf8547c59c598b509\",\"name\":\"myworldshoyab\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/riddance.wasmer.app\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3d0be2f93f9a777c919521d1f8c19821b0e46b183dfcab79f9afac3b2cbef23e?s=96&d=retro&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3d0be2f93f9a777c919521d1f8c19821b0e46b183dfcab79f9afac3b2cbef23e?s=96&d=retro&r=g\",\"caption\":\"myworldshoyab\"},\"sameAs\":[\"http:\/\/localhost\"],\"url\":\"https:\/\/blog.ridwan.cc\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"GitHub CI\/CD for multi-environment deployment on Firebase multiple\u00a0sites &#8212; Ridwan&#039;s Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/riddance.wasmer.app\/?p=279","og_locale":"en_US","og_type":"article","og_title":"GitHub CI\/CD for multi-environment deployment on Firebase multiple\u00a0sites &#8212; Ridwan&#039;s Blog","og_description":"Hi, Here we\u2019ll cover how to automate your workflow on GitHub, deploy to multiple environments. This will assist in rapid iterations to your front-end app, without constantly pushing breaking changes to production. The goal is to have an environment for your users (production), an environment to approve changes prior to shipping (staging) and an environment [&hellip;]","og_url":"https:\/\/riddance.wasmer.app\/?p=279","og_site_name":"Ridwan&#039;s Blog","article_published_time":"2022-11-10T21:53:15+00:00","article_modified_time":"2026-02-22T10:27:42+00:00","og_image":[{"width":1600,"height":889,"url":"https:\/\/riddance.wasmer.app\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x.png","type":"image\/png"}],"author":"myworldshoyab","twitter_card":"summary_large_image","twitter_misc":{"Written by":"myworldshoyab","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/riddance.wasmer.app\/?p=279#article","isPartOf":{"@id":"https:\/\/riddance.wasmer.app\/?p=279"},"author":{"name":"myworldshoyab","@id":"https:\/\/riddance.wasmer.app\/#\/schema\/person\/6d1f43b456a7c5cdf8547c59c598b509"},"headline":"GitHub CI\/CD for multi-environment deployment on Firebase multiple\u00a0sites","datePublished":"2022-11-10T21:53:15+00:00","dateModified":"2026-02-22T10:27:42+00:00","mainEntityOfPage":{"@id":"https:\/\/riddance.wasmer.app\/?p=279"},"wordCount":651,"commentCount":0,"image":{"@id":"https:\/\/riddance.wasmer.app\/?p=279#primaryimage"},"thumbnailUrl":"https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x.png","keywords":["CI\/CD","Deployment","Firebase","Hosting"],"articleSection":["IT","Software"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/riddance.wasmer.app\/?p=279#respond"]}]},{"@type":"WebPage","@id":"https:\/\/riddance.wasmer.app\/?p=279","url":"https:\/\/riddance.wasmer.app\/?p=279","name":"GitHub CI\/CD for multi-environment deployment on Firebase multiple\u00a0sites &#8212; Ridwan&#039;s Blog","isPartOf":{"@id":"https:\/\/riddance.wasmer.app\/#website"},"primaryImageOfPage":{"@id":"https:\/\/riddance.wasmer.app\/?p=279#primaryimage"},"image":{"@id":"https:\/\/riddance.wasmer.app\/?p=279#primaryimage"},"thumbnailUrl":"https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x.png","datePublished":"2022-11-10T21:53:15+00:00","dateModified":"2026-02-22T10:27:42+00:00","author":{"@id":"https:\/\/riddance.wasmer.app\/#\/schema\/person\/6d1f43b456a7c5cdf8547c59c598b509"},"breadcrumb":{"@id":"https:\/\/riddance.wasmer.app\/?p=279#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/riddance.wasmer.app\/?p=279"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/riddance.wasmer.app\/?p=279#primaryimage","url":"https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x.png","contentUrl":"https:\/\/blog.ridwan.cc\/wp-content\/uploads\/2026\/02\/1fccSMONvUgR_NxyE4cdjJQ@2x.png","width":1600,"height":889},{"@type":"BreadcrumbList","@id":"https:\/\/riddance.wasmer.app\/?p=279#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/riddance.wasmer.app\/"},{"@type":"ListItem","position":2,"name":"GitHub CI\/CD for multi-environment deployment on Firebase multiple\u00a0sites"}]},{"@type":"WebSite","@id":"https:\/\/riddance.wasmer.app\/#website","url":"https:\/\/riddance.wasmer.app\/","name":"Ridwan's Blog","description":"Ridwan blog","alternateName":"Ridwanul Alam","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/riddance.wasmer.app\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/riddance.wasmer.app\/#\/schema\/person\/6d1f43b456a7c5cdf8547c59c598b509","name":"myworldshoyab","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/riddance.wasmer.app\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3d0be2f93f9a777c919521d1f8c19821b0e46b183dfcab79f9afac3b2cbef23e?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3d0be2f93f9a777c919521d1f8c19821b0e46b183dfcab79f9afac3b2cbef23e?s=96&d=retro&r=g","caption":"myworldshoyab"},"sameAs":["http:\/\/localhost"],"url":"https:\/\/blog.ridwan.cc\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/blog.ridwan.cc\/index.php?rest_route=\/wp\/v2\/posts\/279","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ridwan.cc\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ridwan.cc\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ridwan.cc\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ridwan.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=279"}],"version-history":[{"count":0,"href":"https:\/\/blog.ridwan.cc\/index.php?rest_route=\/wp\/v2\/posts\/279\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.ridwan.cc\/index.php?rest_route=\/wp\/v2\/media\/280"}],"wp:attachment":[{"href":"https:\/\/blog.ridwan.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=279"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ridwan.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=279"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ridwan.cc\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=279"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}