Replace App Center with Firebase

How to Replace App Center with Firebase Using Azure DevOps Pipelines

Why Replace App Center with Firebase?

With Microsoft retiring App Center soon on March 31, 2025, developers need a reliable alternative for mobile app distribution and CI/CD. Firebase App Distribution provides a seamless solution, allowing you to efficiently distribute builds, gather feedback, and integrate with Azure DevOps Pipelines for automation.

Top 10 Benefits of Using Firebase Over App Center

✅Free Plan 
✅Simplified App Distribution 
✅Supports both iOS & Android apps
✅Automated app distribution for testers
✅Email Notifications
✅Version Management
✅Seamless integration with Azure DevOps
✅Security & Access Control
✅Better analytics and crash reporting
✅Faster Feedback Loop

Prerequisites for Firebase App Distribution

Before setting up Azure DevOps Pipelines, ensure you have:

✔️ Firebase Project (Create one at Firebase Console)
✔️ Firebase CLI installed
✔️ Azure DevOps Account with proper permissions
✔️ Source Code Repository (Azure Repos, GitHub, or Bitbucket)

Step 1: Set Up Firebase App Distribution

1. Add Your App to Firebase

  • Log in to Firebase Console and create a new project.

  • Click “Add App”, select iOS or Android, and follow the setup instructions.

2. Download Configuration Files

  • For Android, download google-services.json.
  • For iOS, download GoogleService-Info.plist.
  • Place these files in the root directory of your app.

3. Add Testers to Firebase (Optional)

  • In Firebase App Distribution, go to “Testers & Groups”.
  • Add testers or create a tester group for easy distribution.

4. Applicaiton ID

Get the App ID for both android and iOS apps from the project setting and store it in a pipeline variable as FIREBASE_IOS_APP_ID, FIREBASE_AOS_APP_ID. It will be used later in the firebase deployment from the azure pipeline.

Step 2: Configure Azure DevOps Pipeline for Firebase Distribution

1. Generate a Firebase Service Account Key

Authentication on Firebase can be performed using the Firebase CI Token. Since the Firebase token has been deprecated and will be removed in the next major Firebase release, we will use the GCP login for this integration. To download the GCP json service key, follow these steps:

Open project settings -> Go to service accounts tab -> Generate new private key as shown below.

2. Store Firebase Credentials in Azure DevOps

  1. Navigate to Azure DevOps > Pipelines > Library.
  2. Create a Secure Files (e.g., FirebaseCredentials.json).

3. Add the Firebase dependency to your project

Go to your package.json file and add the “firebase-tools”: “^13.30.0” under dependencies.

4. Create Azure DevOps Pipeline (YAML Configuration)

Create a azure-pipelines.yml file in your repository:


        trigger:
            branches:
              include:
                - main
          
          variables:
            #Environment
            - name: DEVOPS_ENVIRONMENT
              value: 'DemoApp Mobile'
            #Firebase
            - name: FIREBASE_IOS_APP_ID
              value: '1:xxxxxxxxxxxxxx:ios:a18fxxxxxxxxxxxx4bf974a'
            - name: FIREBASE_AOS_APP_ID
              value: '1:xxxxxxxxxxxxxx:android:e99xxxxxxxxxxxxxxxf974a'
          
          jobs:
          ######################################################## AOS
            - deployment: job_deploy_android
              displayName: 'AOS Deploy'
              pool:
                vmImage: 'ubuntu-latest'
              environment: $(DEVOPS_ENVIRONMENT)
              strategy:
                runOnce:
                  deploy:
                    steps:
                      - checkout: self
                        persistCredentials: true
                        clean: true
          
                      - task: NodeTool@0
                        displayName: 'Using Node.js 18.x'
                        inputs:
                          versionSpec: '18.x' 
          
                      - task: Npm@1
                        displayName: 'Install dependencies'
                        inputs:
                          command: 'ci'   
          
                      # Build Android bundle with Gradle
                      - task: Gradle@3
                        displayName: 'Build APK'
                        inputs:
                          gradleWrapperFile: 'android/gradlew'
                          cwd: 'android'
                          tasks: 'assembleRelease'
                          publishJUnitResults: false
                          javaHomeOption: 'JDKVersion'
                          jdkVersionOption: '1.17'
                          gradleOptions: '-Xmx4608m'
                          sonarQubeRunAnalysis: false
          
                      - task: DownloadSecureFile@1
                        name: FirebaseCredentials
                        displayName: 'Download Firebase SA Private Key'
                        inputs:
                          secureFile: 'FirebaseCredentials.json'
          
                      # Distribute APK to Firebase
                      - task: Bash@3
                        displayName: 'Distribute APK Package to Firebase'
                        inputs:
                          targetType: 'inline'
                          script: |
                            export GOOGLE_APPLICATION_CREDENTIALS=$(FirebaseCredentials.secureFilePath)
                            ./node_modules/.bin/firebase appdistribution:distribute "$(Build.SourcesDirectory)/android/app/build/outputs/apk/release/app-release.apk" --app $(FIREBASE_AOS_APP_ID) --release-notes " Branch: $(Build.SourceBranchName) \n Build version: $(Build.BuildNumber)"
          
          ######################################################## IOS
            - deployment: job_deploy_ios
              condition : false
              displayName: 'iOS Deploy'
              pool:
                vmImage: 'macos-13'
              environment: $(DEVOPS_ENVIRONMENT)
              strategy:
                runOnce:
                  deploy:
                    steps:
                      - checkout: self
                        persistCredentials: true
                        clean: true
          
                      - task: NodeTool@0
                        displayName: 'Using Node.js 18.x'
                        inputs:
                          versionSpec: '18.x' 
          
                      - task: Npm@1
                        displayName: 'Install dependencies'
                        inputs:
                          command: 'ci'  
          
                      - task: CocoaPods@0
                        displayName: 'Install CocoaPods'
                        inputs:
                          workingDirectory: 'ios'
          
                      # Build and archive iOS Application under IPA format bundle
                      - task: Xcode@5
                        displayName: 'Build IPA'
                        inputs:
                          actions: 'build'
                          xcodeVersion: 'specifyPath'
                          xcodeDeveloperDir: '/Applications/Xcode_15.2.app'
                          configuration: 'Release'
                          sdk: 'iphoneos'
                          xcWorkspacePath: 'ios/$(IOS_PROJECT_NAME).xcworkspace'
                          scheme: $(IOS_PROJECT_NAME)
                          packageApp: true
                          exportPath: 'output'
          
                      - task: CopyFiles@2
                        displayName: 'Copy IPA Bundle'
                        inputs:
                          contents: 'output/$(IOS_PROJECT_NAME).ipa'
                          targetFolder: '$(Build.ArtifactStagingDirectory)'
          
                      - publish: '$(Build.ArtifactStagingDirectory)/output'
                        displayName: 'Publish IPA Bundle'
                        artifact: drop
          
                      - task: DownloadSecureFile@1
                        name: FirebaseCredentials
                        displayName: 'Download Firebase SA Private Key'
                        inputs:
                          secureFile: 'FirebaseCredentials.json'
          
                      # Distribute Bundle to Firebase
                      - task: Bash@3
                        displayName: 'Upload IPA Bundle to Firebase'
                        inputs:
                          targetType: 'inline'
                          script: |
                            export GOOGLE_APPLICATION_CREDENTIALS=$(FirebaseCredentials.secureFilePath)
                            ./node_modules/.bin/firebase appdistribution:distribute "$(Build.SourcesDirectory)/output/$(IOS_PROJECT_NAME).ipa" --app $(FIREBASE_IOS_APP_ID) --release-notes " Branch: $(Build.SourceBranchName) \n Build version: $(Build.BuildNumber)"
          
          

Step 3: Run the Pipeline & Distribute Your App

  1. Push the azure-pipelines.yml file to your repository.
  2. In Azure DevOps, go to Pipelines > New Pipeline.
  3. Select your repository and configure it to use YAML.
  4. Click Run to trigger the pipeline.

🎉 Your mobile app is now built and distributed using Firebase via Azure DevOps!

Conclusion: Why Firebase is the Best Alternative to App Center

Migrating from App Center to Firebase ensures your mobile app continues to be efficiently distributed with CI/CD automation via Azure DevOps Pipelines. With Firebase App Distribution, you get:

Continuous Deployment for testers
Better app insights & crash analytics
Scalability and Google Cloud integration

💡 Start your migration today and streamline your mobile app distribution with Firebase!

📌 Need help migrating from App Center to Firebase? Leave a comment below or share your experience! 🚀

You are currently viewing How to Replace App Center with Firebase Using Azure DevOps Pipelines