{"id":1774,"date":"2026-05-21T14:18:38","date_gmt":"2026-05-21T08:48:38","guid":{"rendered":"https:\/\/velanapps.com\/blog\/?p=1774"},"modified":"2026-05-21T14:18:39","modified_gmt":"2026-05-21T08:48:39","slug":"flutter-cicd-fastlane-guide","status":"publish","type":"post","link":"https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/","title":{"rendered":"CI\/CD\u00a0for Flutter with Fastlane: Beginner\u2019s End-to-End Guide\u00a0"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Automating Flutter deployments really cuts out all those hours spent on boring, repetitive release stuff. You no longer need to manually build,&nbsp;sign,&nbsp;and upload the apps to the App Store &amp; Google Play Store. Just install Fastlane and create a proper CI\/CD pipeline, and you&#8217;re fine. Once all of this is up and running, deploying a new release becomes as simple as the following:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once&nbsp;you\u2019ve&nbsp;got it all running, pushing out a new release is as easy as:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>fastlane&nbsp;iOS&nbsp;release&nbsp;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fastlane<strong><a href=\"https:\/\/velanapps.com\/android-app-development-services\" type=\"link\" id=\"https:\/\/velanapps.com\/android-app-development-services\"> Android<\/a><\/strong> release.\u00a0In this article, we will learn how to create a Flutter CI\/CD pipeline from scratch using Fastlane (for both Android and iOS <strong><a href=\"https:\/\/velanapps.com\/cross-platform-app-development-services\" type=\"link\" id=\"https:\/\/velanapps.com\/cross-platform-app-development-services\">platforms<\/a><\/strong>) and GitHub Actions (our automation tool), along with TestFlight app uploading and Play Store deployments as well as secret management for secure and sustainable automation practices. Set up CI\/CD for Flutter using\u00a0fastlane.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Why Set Up CI\/CD for Flutter with Fastlane?<\/strong>&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Manual Flutter deployments usually involve:&nbsp;<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Building APK\/AAB or IPA files&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Managing signing certificates&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uploading builds to app stores&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Updating build numbers&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Running tests&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Handling release tracks&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Such processes can result in&nbsp;<strong>30\u201360 minutes per release<\/strong>.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>This means a proper&nbsp;Flutter CI\/CD pipeline&nbsp;automates everything:&nbsp;<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Faster releases&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Fewer deployment errors&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Consistent builds&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Automated testing&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>One-click publishing&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Better team collaboration&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">One of the most popular tools for <strong><a href=\"https:\/\/velanapps.com\/custom-app-development-services\" type=\"link\" id=\"https:\/\/velanapps.com\/custom-app-development-services\">mobile deployment automation<\/a><\/strong>,\u00a0<strong>Fastlane<\/strong>\u00a0runs effortlessly with Flutter, Android, and iOS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>What Is Fastlane?<\/strong>&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Fastlane is an open-source tool that enables the deployment of iOS and Android apps. This automates some of the repetitive tasks that you do every time, such as uploading builds to TestFlight, publishing apps to Google Play, and releasing them.&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Building Android AAB\/APK files&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Building iOS IPA files&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Managing signing certificates&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uploading builds to TestFlight&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Publishing apps to Google Play&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Running tests&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Capturing App Store screenshots&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Managing version numbers&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Fastlane integrates with:&nbsp;<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GitHub Actions&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bitrise&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GitLab CI\/CD&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CircleCI&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Prerequisites&nbsp;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tools&nbsp;required: Before going to set up&nbsp;<strong>Fastlane automation of Flutter<\/strong>, first make sure your machine has the correct tools installed.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Requirement<\/strong>&nbsp;<\/td><td><strong>Purpose<\/strong>&nbsp;<\/td><td><strong>Verify<\/strong>&nbsp;<\/td><\/tr><tr><td>Flutter SDK 3. x+&nbsp;<\/td><td>Build Flutter apps&nbsp;<\/td><td>flutter -version&nbsp;<\/td><\/tr><tr><td>Ruby 2.5+&nbsp;<\/td><td>Required for Fastlane&nbsp;<\/td><td>ruby &#8211;version&nbsp;<\/td><\/tr><tr><td>Xcode 14+&nbsp;<\/td><td><strong><a href=\"https:\/\/www.velaninfo.com\/ios-app-development-services\" type=\"link\" id=\"https:\/\/www.velaninfo.com\/ios-app-development-services\">Build iOS apps\u00a0<\/a><\/strong><\/td><td>xcode-select -version&nbsp;<\/td><\/tr><tr><td>Android Studio \/ SDK&nbsp;<\/td><td>Android builds&nbsp;<\/td><td>flutter doctor&nbsp;<\/td><\/tr><tr><td>Apple Developer Account&nbsp;<\/td><td>iOS publishing&nbsp;<\/td><td>developer.apple.com&nbsp;<\/td><\/tr><tr><td>Google Play Console Access&nbsp;<\/td><td>Android publishing&nbsp;<\/td><td>play.google.com\/console&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Flutter App Deployment Pipeline Using Fastlane and GitHub Actions<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"2000\" src=\"https:\/\/velanapps.com\/blog\/wp-content\/uploads\/2026\/05\/Step-by-Step-Flutter-Deployment-Automation-with-Fastlane.jpg\" alt=\"Complete Flutter CI\/CD Automation Using Fastlane\" class=\"wp-image-1775\" srcset=\"https:\/\/velanapps.com\/blog\/wp-content\/uploads\/2026\/05\/Step-by-Step-Flutter-Deployment-Automation-with-Fastlane.jpg 800w, https:\/\/velanapps.com\/blog\/wp-content\/uploads\/2026\/05\/Step-by-Step-Flutter-Deployment-Automation-with-Fastlane-120x300.jpg 120w, https:\/\/velanapps.com\/blog\/wp-content\/uploads\/2026\/05\/Step-by-Step-Flutter-Deployment-Automation-with-Fastlane-410x1024.jpg 410w, https:\/\/velanapps.com\/blog\/wp-content\/uploads\/2026\/05\/Step-by-Step-Flutter-Deployment-Automation-with-Fastlane-768x1920.jpg 768w, https:\/\/velanapps.com\/blog\/wp-content\/uploads\/2026\/05\/Step-by-Step-Flutter-Deployment-Automation-with-Fastlane-614x1536.jpg 614w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong>Stage 1: Install Fastlane for Flutter<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Install Fastlane<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can install Fastlane using RubyGems or Homebrew:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>RubyGems&nbsp;(Recommended)<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>gem install&nbsp;fastlane<em>&nbsp;# Option 1<\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Homebrew (macOS Only)<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">brew install&nbsp;fastlane&nbsp;<strong><em># Option 2 (macOS only)<\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use&nbsp;gem install&nbsp;fastlane&nbsp;for CI\/CD runners and automated environments.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Configure Flutter Environment Variables<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Find Flutter SDK Path<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>which flutter&nbsp;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example output:&nbsp;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\/Users\/username\/development\/flutter\/bin\/flutter&nbsp;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Your Flutter SDK path is:&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Set FLUTTER_ROOT<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Edit your shell configuration file depending on your terminal<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Shell<\/td><td>Config File<\/td><td>Command to Edit<\/td><\/tr><tr><td>zsh (default)<\/td><td>~\/.zshrc<\/td><td>open -e ~\/.zshrc<\/td><\/tr><tr><td>bash<\/td><td>~\/.bash_profile<\/td><td>open -e ~\/.bash_profile<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Then, add this line at the end of the file:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>export FLUTTER_ROOT=\/Users\/username\/development\/flutter<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>export PATH=&#8221;$FLUTTER_ROOT\/bin:$PATH&#8221;<\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Replace the path with your actual Flutter SDK location.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Your environment is correctly set up&nbsp;if the&nbsp;Flutter Doctor&nbsp;is successful.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\/Users\/username\/development\/flutter\/<\/strong>&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Stage 2: Check for Flutter Local Builds<\/strong>&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Make sure local builds are working fine before configuring automation.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Android Build<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">flutter build&nbsp;appbundle&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>iOS Build<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">flutter build&nbsp;ipa&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If local builds fail, they are going to fail in the&nbsp;<strong>CI\/CD pipeline<\/strong>&nbsp;too due to the same reasons.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Stage 3: Setting Up Fastlane in Flutter<\/strong>&nbsp;<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Android<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">cd android &amp;&amp;&nbsp;fastlane&nbsp;init&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>iOS<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">cd&nbsp;ios&nbsp;&amp;&amp;&nbsp;fastlane&nbsp;init&nbsp;<br>Fastlane creates:&nbsp;<br>android\/fastlane\/&nbsp;<br>Appfile&nbsp;<br>Fastfile&nbsp;<br>Pluginfile&nbsp;<br>ios\/fastlane\/&nbsp;<br>Appfile&nbsp;<br>Fastfile&nbsp;<br>Matchfile&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Stage 4: Configure&nbsp;Appfile<\/strong>&nbsp;<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Android&nbsp;Appfile<\/strong>&nbsp;<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># android\/fastlane\/Appfile\u00a0\njson_key_file(\"path\/to\/play-store-credentials.json\")\u00a0\npackage_name(\"com.yourcompany.yourapp\")\u00a0<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>iOS&nbsp;Appfile<\/strong>&nbsp;<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#\u00a0ios\/fastlane\/Appfile\u00a0\n\napple_id(\"yourappleid@example.com\")\u00a0\n\napp_identifier(\"com.yourcompany.yourapp\")\u00a0\n\nteam_id(\"YOUR_TEAM_ID\")\u00a0\n\nitc_team_id(\"YOUR_ITC_TEAM_ID\")<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Stage 5: Fastlane on Android CI\/CD<\/strong>&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For deployment on Google Play we use the keyword&nbsp;&#8216;upload_to_play_store&#8217;&nbsp;in Fastlane.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Create a Google Play Service Account&nbsp;<\/strong><\/h3>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. Enable API Access<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In the Google Play Console:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Setup \u2192 API Access&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Link a Google Cloud project.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. Create Service Account<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In Google Cloud Console:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enable Google Play Android Developer API&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Create Service Account&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Generate JSON key&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Download the JSON credentials file&nbsp;<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. Grant Permissions<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In Play Console:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Users &amp; Permissions \u2192 Invite User&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Assign the service account:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Release Manager role&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Validate Play Store JSON Key<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>fastlane&nbsp;run&nbsp;validate_play_store_json_key&nbsp;json_key:\/path\/to\/key.json&nbsp;<\/em><\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Android&nbsp;Fastfile&nbsp;Example<\/strong>&nbsp;<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>default_platform(:android)\u00a0\n\nplatform :android\u00a0do\u00a0\n\ndesc\u00a0\"Deploy Android Beta\"\u00a0\n\nlane :beta\u00a0do\u00a0\n\n\u202f\u202fsh(\"flutter build\u00a0appbundle\u00a0--release\")\u00a0\n\n\u202f\u202fupload_to_play_store(\u00a0\n\n\u202f\u202f\u202f\u202ftrack: \"beta\",\u00a0\n\n\u202f\u202f\u202f\u202faab: \"..\/build\/app\/outputs\/bundle\/release\/app-release.aab\"\u00a0\n\n\u202f\u202f)\u00a0\n\nend\u00a0\n\ndesc\u00a0\"Deploy Android Production\"\u00a0\n\nlane :release\u00a0do\u00a0\n\n\u202f\u202fsh(\"flutter build\u00a0appbundle\u00a0--release\")\u00a0\n\n\u202f\u202fupload_to_play_store(\u00a0\n\n\u202f\u202f\u202f\u202ftrack: \"production\",\u00a0\n\n\u202f\u202f\u202f\u202faab: \"..\/build\/app\/outputs\/bundle\/release\/app-release.aab\"\u00a0\n\n\u202f\u202f)\u00a0\n\nend\u00a0\n\nend<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Android Release Signing Configuration<\/strong>&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before uploading Android builds to the Play Store, you must configure release signing properly. Without signing configuration, Play Store deployments will fail.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Generate an Android Keystore<\/strong>&nbsp;<\/h3>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\"><strong>Run:<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">keytool&nbsp;-genkey&nbsp;-v \\&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">-keystore upload-keystore.jks&nbsp;\\&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">-keyalg&nbsp;RSA \\&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">-keysize&nbsp;2048 \\&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">-validity 10000 \\&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">-alias upload&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This generates:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>upload-keystore.jks&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Store this file securely and never commit it to source control.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Create&nbsp;key.properties<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inside the&nbsp;android\/&nbsp;directory create:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">storePassword=YOUR_STORE_PASSWORD&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">keyPassword=YOUR_KEY_PASSWORD&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">keyAlias=upload&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">storeFile=..\/upload-keystore.jks&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Configure Gradle Signing<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">android\/app\/build.gradle&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Add:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">def&nbsp;keystoreProperties&nbsp;= new&nbsp;Properties()&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">def&nbsp;keystorePropertiesFile&nbsp;=&nbsp;rootProject.file(&#8220;key.properties&#8221;)&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">if (keystorePropertiesFile.exists()) {&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;keystoreProperties.load(new&nbsp;FileInputStream(keystorePropertiesFile))&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">android {&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;signingConfigs&nbsp;{&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; release {&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyAlias&nbsp;keystoreProperties[&#8216;keyAlias&#8217;]&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyPassword&nbsp;keystoreProperties[&#8216;keyPassword&#8217;]&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;storeFile&nbsp;file(keystoreProperties[&#8216;storeFile&#8217;])&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;storePassword&nbsp;keystoreProperties[&#8216;storePassword&#8217;]&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; }&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;buildTypes&nbsp;{&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; release {&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;signingConfig&nbsp;signingConfigs.release&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; }&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}&nbsp;<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>CI\/CD Secret Management<\/strong>&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For GitHub Actions or other CI\/CD platforms:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Store keystore files securely&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Store passwords as encrypted secrets&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Recreate keystore files during CI runtime&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Never commit:&nbsp;<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">.jks&nbsp;<\/mark><\/strong><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">.keystore&nbsp;<\/mark><\/strong><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>passwords&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>signing configs&nbsp;<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Verify Signed Release Build<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Run:&nbsp;<\/strong><br>flutter build&nbsp;appbundle&nbsp;&#8211;release&nbsp;<br>If successful, your Android app is properly signed and ready for deployment to the Play Store.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Stage 6: iOS CI\/CD with Fastlane<\/strong>&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Setting Up iOS Certificates and Provisioning Profiles<\/strong>&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Secure Apple Credentials<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Older Fastlane setups commonly used:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">export FASTLANE_PASSWORD=&#8221;YourApplePassword&#8221;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">However, modern iOS CI\/CD pipelines should use an&nbsp;<strong>App Store Connect API Key<\/strong>&nbsp;instead of Apple ID passwords wherever possible.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Why use API Keys?&nbsp;<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>More secure and reliable&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Works better with Apple 2FA enabled accounts&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Recommended by Apple and Fastlane&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Better suited for CI\/CD automation environments&nbsp;<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Create an App Store Connect API Key<\/strong>&nbsp;<\/h3>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Open App Store Connect&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Navigate&nbsp;to:[Text Wrapping Break]Users and Access \u2192 Keys&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Create a new API Key&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Download&nbsp;the&nbsp;.p8&nbsp;key file&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>Note the following values:&nbsp;<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Key ID&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Issuer ID&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">.p8&nbsp;file&nbsp;<\/mark><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Store Credentials Securely<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Never commit:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">.p8&nbsp;files&nbsp;<\/mark><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>passwords&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>certificates&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>provisioning profiles&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Store them securely using CI\/CD secrets such as the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GitHub Actions Secrets&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GitLab CI Variables&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bitrise&nbsp;Secrets&nbsp;<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Example Fastlane Configuration<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">app_store_connect_api_key(&nbsp;<\/p>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;key_id: ENV[&#8220;APP_STORE_CONNECT_KEY_ID&#8221;],&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;issuer_id: ENV[&#8220;APP_STORE_CONNECT_ISSUER_ID&#8221;],&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;key_filepath:&nbsp;&#8220;.\/AuthKey.p8&#8221;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">)&nbsp;<\/p>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>GitHub Actions Secret Example<\/strong>&nbsp;<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>env:\u00a0\n\n\u00a0 APP_STORE_CONNECT_KEY_ID: ${{\u00a0secrets.APP_STORE_CONNECT_KEY_ID\u00a0}}\u00a0\n\n\u00a0 APP_STORE_CONNECT_ISSUER_ID: ${{\u00a0secrets.APP_STORE_CONNECT_ISSUER_ID\u00a0}}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Using App Store Connect API Keys provides a more stable and production-ready authentication method for automated iOS deployments.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>macOS\/Linux<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>export FASTLANE_PASSWORD=&#8221;YourApplePassword&#8221;&nbsp;<\/em><\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Windows PowerShell<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>setx&nbsp;FASTLANE_PASSWORD &#8220;YourApplePassword&#8221;&nbsp;<\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Never commit passwords to source control.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use CI secrets instead.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Generate Profiles and Certificates for iOS<\/strong>&nbsp;<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Distribution Certificate<\/strong>&nbsp;<\/h3>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\">In the Apple Developer Portal:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Certificates \u2192 +&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create an iOS Distribution Certificate.&nbsp;<\/p>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Provisioning Profile<\/strong>&nbsp;<\/h3>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\">Create:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Profiles \u2192 App Store&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Download and install the&nbsp;.mobileprovision&nbsp;file.&nbsp;<\/p>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Configure in Xcode<\/strong>&nbsp;<\/h3>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\"><strong>Open:&nbsp;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ios\/Runner.xcworkspace&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Navigate to:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Runner \u2192 Signing &amp; Capabilities&nbsp;<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\"><strong>Select:&nbsp;<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Team&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Certificate&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Provisioning profile&nbsp;<\/li>\n<\/ul>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Install&nbsp;CocoaPods&nbsp;Dependencies for iOS<\/strong>&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Flutter iOS projects depend on&nbsp;CocoaPods&nbsp;to manage native iOS libraries and plugins.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Before running Fastlane or GitHub Actions for <strong><a href=\"https:\/\/velanapps.com\/ios-app-development-services\" type=\"link\" id=\"https:\/\/velanapps.com\/ios-app-development-services\">iOS<\/a><\/strong> builds, make sure\u00a0CocoaPods\u00a0dependencies are installed correctly.\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Install&nbsp;CocoaPods<\/strong>&nbsp;<\/h3>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\">Install&nbsp;CocoaPods&nbsp;globally:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">sudo&nbsp;gem install&nbsp;cocoapods&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Verify installation:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pod &#8211;version&nbsp;<\/p>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Install iOS Dependencies<\/strong>&nbsp;<\/h3>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\">Navigate to the iOS folder:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cd&nbsp;ios&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pod&nbsp;install&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you face outdated dependency issues, run:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pod repo update&nbsp;<\/p>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Common&nbsp;CocoaPods&nbsp;Issues<\/strong>&nbsp;<\/h3>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\"><strong>Pod Installation Failed<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Try:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pod&nbsp;deintegrate&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pod&nbsp;install&nbsp;<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\"><strong>Architecture or Cache Issues<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Run:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">flutter clean&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">rm -rf Pods&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">rm -rf&nbsp;Podfile.lock&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">pod&nbsp;install&nbsp;<\/p>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>CI\/CD Best Practice<\/strong>&nbsp;<\/p>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\">In GitHub Actions or CI\/CD pipelines, always run:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cd&nbsp;ios&nbsp;&amp;&amp; pod install&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">before building the iOS app.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This ensures all Flutter plugins and native iOS dependencies are installed correctly during automated builds.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Use Fastlane Match (Recommended)<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fastlane Match securely stores certificates in a private Git repository.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Initialize Match:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">fastlane&nbsp;match&nbsp;init&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Generate App Store certificates:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">fastlane&nbsp;match&nbsp;appstore&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Generate development certificates:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">fastlane&nbsp;match development&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fastlane Match prevents signing conflicts across developers and CI runners.&nbsp;<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>iOS&nbsp;Fastfile&nbsp;Example<\/strong>&nbsp;<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>default_platform(:ios)\u00a0\n\nplatform :ios\u00a0do\u00a0\n\ndesc\u00a0\"Upload to TestFlight\"\u00a0\n\nlane :beta\u00a0do\u00a0\n\n\u202f\u202fbuild_app(\u00a0\n\n\u202f\u202f\u202f\u202fscheme: \"Runner\",\u00a0\n\n\u202f\u202f\u202f\u202fexport_method: \"app-store\"\u00a0\n\n\u202f\u202f)\u00a0\n\n\u202f\u202fupload_to_testflight\u00a0\n\nend\u00a0\n\ndesc\u00a0\"Release to App Store\"\u00a0\n\nlane :release\u00a0do\u00a0\n\n\u202fbuild_app(\u00a0\n\n\u202f\u202f\u202f\u202fscheme: \"Runner\",\u00a0\n\n\u202f\u202f\u202f\u202fexport_method: \"app-store\"\u00a0\n\n\u202f\u202f)\u00a0\n\n\u202f\u202fupload_to_app_store\u00a0\n\nend\u00a0\n\nend<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Stage 7: Run Flutter Deployments<\/strong>&nbsp;<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Android Deployment<\/strong>&nbsp;<\/h3>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\">flutter build&nbsp;appbundle&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cd android&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">fastlane&nbsp;beta&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">fastlane&nbsp;release&nbsp;<\/p>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>iOS Deployment<\/strong>&nbsp;<\/h3>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\">flutter build&nbsp;ios&nbsp;&#8211;release &#8211;no-codesign&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cd&nbsp;ios&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">fastlane&nbsp;beta&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">fastlane&nbsp;release&nbsp;<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Stage<\/strong> <strong>8: GitHub Actions Flutter CI\/CD Pipeline\u202f<\/strong>&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use GitHub Actions to automate deployments. on every push, you can perform a deployment.&nbsp;<\/p>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\"><strong>Create:&nbsp;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">.github\/workflows\/flutter-deploy.yml&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Example Workflow<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">name: Flutter CI\/CD with Fastlane&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">on:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">push:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202fbranches:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f- main&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">jobs:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">deploy-android:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202fruns-on: ubuntu-latest&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202fsteps:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f- uses: actions\/checkout@v3&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f- uses:&nbsp;subosito\/flutter-action@v2&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f\u202f\u202fwith:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202fflutter-version: &#8220;3.x&#8221;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f- run: flutter pub&nbsp;get&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f- run: gem install&nbsp;fastlane&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f- run: flutter build&nbsp;appbundle&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f- run: cd android &amp;&amp;&nbsp;fastlane&nbsp;beta&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202fenv:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; name: Decode Play Store Key&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; run: echo &#8220;$PLAY_STORE_JSON_KEY&#8221; &gt; android\/play-key.json&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202fjson_key_file(&#8220;play-key.json&#8221;)&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">deploy-ios:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202fruns-on:&nbsp;macos-latest&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202fsteps:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f- uses: actions\/checkout@v3&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f- uses:&nbsp;subosito\/flutter-action@v2&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f\u202f\u202fwith:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f\u202f\u202f\u202f\u202fflutter-version: &#8220;3.x&#8221;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f- run: flutter pub&nbsp;get&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f- run: gem install&nbsp;fastlane&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f- run: flutter build&nbsp;ipa&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202f- run: cd&nbsp;ios&nbsp;&amp;&amp;&nbsp;fastlane&nbsp;beta&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202fenv:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202fFASTLANE_PASSWORD: ${{ secrets. FASTLANE_PASSWORD }}&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202f\u202f\u202fMATCH_PASSWORD: ${{ secrets. MATCH_PASSWORD }}&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Apple\u2019s platform restrictions require iOS builds to run on macOS machines.&nbsp;<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Common Fastlane Flutter Errors<\/strong>&nbsp;<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Error<\/strong>&nbsp;<\/td><td><strong>Cause<\/strong>&nbsp;<\/td><td><strong>Fix<\/strong>&nbsp;<\/td><\/tr><tr><td>&#8216;flutter&#8217; command not found&nbsp;<\/td><td>FLUTTER_ROOT missing&nbsp;<\/td><td>Set environment variables&nbsp;<\/td><\/tr><tr><td>Invalid Play Store JSON&nbsp;<\/td><td>API access issue&nbsp;<\/td><td>Recreate service account&nbsp;<\/td><\/tr><tr><td>iOS signing error&nbsp;<\/td><td>Wrong certificate&nbsp;<\/td><td>Run&nbsp;fastlane&nbsp;match&nbsp;appstore&nbsp;<\/td><\/tr><tr><td>TestFlight upload fails&nbsp;<\/td><td>2FA issue&nbsp;<\/td><td>Use App-Specific Password&nbsp;<\/td><\/tr><tr><td>Build number conflict&nbsp;<\/td><td>Duplicate build number&nbsp;<\/td><td>Use an incremented build number.&nbsp;<\/td><\/tr><tr><td>Gradle build failed&nbsp;<\/td><td>Missing signing config&nbsp;<\/td><td>Check keystore setup&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>CI\/CD Best Practices for Flutter<\/strong>&nbsp;<\/h2>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\"><strong>Security<\/strong>&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Store credentials as encrypted CI secrets&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Never commit JSON&nbsp;or&nbsp;.p12&nbsp;files&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use Fastlane Match for iOS signing&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rotate service account keys regularly&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Reliability<\/strong>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bundler setup&nbsp;Use:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">gem install bundler&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bundle&nbsp;init&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">gem &#8220;fastlane&#8221;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bundle&nbsp;install&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bundle exec&nbsp;fastlane&nbsp;beta&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">instead of:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">fastlane&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pin Fastlane versions in&nbsp;Gemfile&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Run&nbsp;Flutter test&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Separate beta and production lanes&nbsp;<\/li>\n<\/ul>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Add Automated Build Numbers<\/strong>&nbsp;<\/h3>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\">lane: beta do&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">increment_build_number(&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202f\u202fbuild_number: ENV[&#8220;GITHUB_RUN_NUMBER&#8221;]&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">)&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">build_app(scheme: &#8220;Runner&#8221;)&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">upload_to_testflight&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">end&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This prevents duplicate build number errors.&nbsp;<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Fastlane vs GitHub Actions<\/strong>&nbsp;<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Feature<\/strong>&nbsp;<\/td><td><strong>Fastlane<\/strong>&nbsp;<\/td><td><strong>GitHub Actions<\/strong>&nbsp;<\/td><\/tr><tr><td>Mobile deployment&nbsp;<\/td><td>Yes&nbsp;<\/td><td>No&nbsp;<\/td><\/tr><tr><td>Workflow orchestration&nbsp;<\/td><td>Limited&nbsp;<\/td><td>Yes&nbsp;<\/td><\/tr><tr><td>Store uploads&nbsp;<\/td><td>Yes&nbsp;<\/td><td>No&nbsp;<\/td><\/tr><tr><td>CI runners&nbsp;<\/td><td>No&nbsp;<\/td><td>Yes&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\">GitHub Actions handles CI orchestration.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fastlane handles mobile deployment automation.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You typically use both together.&nbsp;<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Flutter CI\/CD Setup Checklist<\/strong>&nbsp;<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Task<\/strong>&nbsp;<\/td><td><strong>Status<\/strong>&nbsp;<\/td><\/tr><tr><td>Flutter SDK installed&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Fastlane installed&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>FLUTTER_ROOT configured&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Local builds working&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Fastlane initialized&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Appfile&nbsp;configured&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Play Store API configured&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>iOS certificates installed&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Fastlane Match configured&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>GitHub Actions workflow created&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusion<\/strong>&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Only iOS builds should run on macOS due to an Apple platform restriction.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A complete Flutter CI\/CD pipeline gives you:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Faster deployments&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Fewer release errors&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Automated store publishing&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Consistent build environments&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Better team collaboration&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">After configuring Fastlane, your deployment pipeline can automatically build, sign, test, and distribute your Flutter app.&nbsp;It could, for example, automatically build and test, sign, and, therefore, distribute new versions of the app to TestFlight or Google Play every single time you bump up that version number.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>FAQs<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. <strong>Why would developers choose Fastlane and&nbsp;GitHub Actions&nbsp;for their Flutter apps?<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Actions&nbsp;acts as the CI\/CD platform with runners, workflow triggers, and automation,&nbsp;whereas&nbsp;Fastlane takes care of Flutter building, code signing, app store uploads, as well as deployment automation. While&nbsp;GitHub Actions&nbsp;is arranging the pipeline, Fastlane is transporting mobile deployments.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. <strong>Can I use Fastlane for Flutter on Windows?<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Fastlane supports macOS, Linux, and Windows, but iOS builds require macOS because of Xcode.&nbsp;Apple restrictions require iOS builds to use macOS. When we build Android on Linux and macOS, we rarely deploy Fastlane to Windows. Usually,&nbsp;GitHub Actions&nbsp;runs android builds on ubuntu-latest along with iOS builds running on&nbsp;macos-latest.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. <strong>Is an Apple Developer Program account necessary for Fastlane iOS deployment?<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Indeed.&nbsp;You must have a paid Apple Developer Program account if you want to distribute apps via TestFlight or the App Store.&nbsp;Distribution certificates and provisioning profiles are only available with a paid account.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. <strong>How to deal with Apple 2FA in CI\/CD?<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t&nbsp;put your Apple username and password to direct use. Create an App Store.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Connect API key, download&nbsp;the .p8 certificate file, and store it securely in your CI\/CD environment. Fastlane will be able to authenticate this way without being interrupted by 2FA. This way, Fastlane can authenticate without any 2FA disruptions.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. <strong>How long does Flutter CI\/CD deployment take?<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Typical CI times vary depending on project size and cache usage.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Deployment usually takes around 10\u201330 minutes, depending on build size and CI runner performance.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Android: 5\u201312 minutes&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">iOS: 15, 30+ minutes, as Xcode builds are usually heavy, and in addition to that, Apple processing will make it even longer.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6. <strong>Does Fastlane allow me to create and deploy iOS and Android builds simultaneously?<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Indeed. You&nbsp;are able to&nbsp;set up distinct&nbsp;GitHub Actions&nbsp;jobs for the deployment of iOS and Android and get them to&nbsp;operate&nbsp;concurrently on separate cloud runners, thus saving time.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7. <strong>Should I use Fastlane Match with Flutter?<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Fastlane Match stores iOS certificates and provisioning profiles within an encrypted private Git repository and automatically distributes them to developer machines and CI runners.\u202f&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">8. <strong>Why does it pass running locally but fail on&nbsp;GitHub Actions&nbsp;with the same build?\u202f<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Common reasons include:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Missing secrets, such as keystores or API credentials&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Different Flutter, Java, or Xcode versions&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">File name capitalization differences, which work fine locally will fail in CI\/CD environments; this can be a headache for your project.\u202f&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>9. If I use Fastlane, will I be able to deploy my Flutter app for both iOS and Android?<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Absolutely, you can.&nbsp;You can see that the deployments for Android and iOS are separated in GitHub Actions, and with PR pushes to main, we trigger both jobs.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Actions\u00a0separate jobs for the <strong><a href=\"https:\/\/www.velaninfo.com\/android-app-development-services\" type=\"link\" id=\"https:\/\/www.velaninfo.com\/android-app-development-services\">deployment of Android<\/a><\/strong> and iOS, and PR pushes to the main branch are triggers for the simultaneous execution of both jobs.\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">10. <strong>How to auto-increment the build number?<\/strong>&nbsp;<\/h3>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-4fc3f8e1 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\">The easiest method is to use your Git commit count or CI run number.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">lane: deploy do&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202fbuild_num&nbsp;=&nbsp;number_of_commits()&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202fDir.chdir&nbsp;&#8220;..\/&#8230;&#8221; do&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202fsh(&#8220;flutter build&nbsp;appbundle&nbsp;&#8211;build-number=#{build_num}&#8221;)&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202fsh(&#8220;flutter build&nbsp;ipa&nbsp;&#8211;build-number=#{build_num}&#8221;)&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u202fend&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">end&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can also use GITHUB_RUN_NUMBER with&nbsp;increment_build_number&nbsp;in Fastlane to generate unique build numbers automatically.&nbsp;<\/p>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">11. <strong>Is Fastlane free to use for Flutter CI\/CD?<\/strong>&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. Fastlane is free and&nbsp;open-source.&nbsp;Additional&nbsp;costs may include:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Google Play Developer account&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Apple Developer Program membership&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CI\/CD runner usage costs&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table aligncenter\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Task<\/strong>&nbsp;<\/td><td><strong>Platform<\/strong>&nbsp;<\/td><td><strong>Done?<\/strong>&nbsp;<\/td><\/tr><tr><td>Install Flutter SDK and verify flutter doctor passes&nbsp;<\/td><td>Both&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Install Ruby and verify gem install&nbsp;fastlane&nbsp;works&nbsp;<\/td><td>Both&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Set and verify the FLUTTER_ROOT environment variable&nbsp;<\/td><td>Both&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Confirm flutter build&nbsp;appbundle&nbsp;and flutter build&nbsp;ipa&nbsp;work locally&nbsp;<\/td><td>Both&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Run&nbsp;fastlane&nbsp;init&nbsp;inside the android\/ and&nbsp;ios\/ directories&nbsp;<\/td><td>Both&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Configure the&nbsp;Appfile&nbsp;with the correct package name and bundle ID&nbsp;<\/td><td>Both&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Create and&nbsp;validate&nbsp;the Google Service Account JSON key&nbsp;<\/td><td>Android&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Install Apple Distribution Certificate and Provisioning Profile&nbsp;<\/td><td>iOS&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Configure Fastlane Match (recommended)&nbsp;<\/td><td>iOS&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Create beta and release lanes in the&nbsp;Fastfile&nbsp;for both platforms&nbsp;<\/td><td>Both&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Store all credentials as encrypted CI environment variables&nbsp;<\/td><td>CI\/CD&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><tr><td>Create, test, and automate deployment using GitHub Actions&nbsp;<\/td><td>CI\/CD&nbsp;<\/td><td>\u2610&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Automating Flutter deployments really cuts out all those hours spent on boring, repetitive release stuff. You no longer need to manually build,&nbsp;sign,&nbsp;and upload the apps to the App Store &amp; Google Play Store. Just install Fastlane and create a proper CI\/CD pipeline, and you&#8217;re fine. Once all of this is up and running, deploying a [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":1776,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[],"class_list":["post-1774","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mobile-app-development"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Flutter CI\/CD with Fastlane: Complete Beginner Guide<\/title>\n<meta name=\"description\" content=\"Learn how to implement CI\/CD for Flutter using Fastlane. This beginner-friendly tutorial covers Android, iOS, GitHub Actions, app deployment, and automation step by step.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flutter CI\/CD with Fastlane: Complete Beginner Guide\" \/>\n<meta property=\"og:description\" content=\"Learn how to implement CI\/CD for Flutter using Fastlane. This beginner-friendly tutorial covers Android, iOS, GitHub Actions, app deployment, and automation step by step.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"Latest Trends In Information Technology (IT) Blog - VelanApps\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-21T08:48:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-21T08:48:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/velanapps.com\/blog\/wp-content\/uploads\/2026\/05\/Flutter-CICD-Fastlane-Guide.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2240\" \/>\n\t<meta property=\"og:image:height\" content=\"1260\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"kingsly jebaraj\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"kingsly jebaraj\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/flutter-cicd-fastlane-guide\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/flutter-cicd-fastlane-guide\\\/\"},\"author\":{\"name\":\"kingsly jebaraj\",\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/#\\\/schema\\\/person\\\/301160f2e391f734a4d8b238a1e0edeb\"},\"headline\":\"CI\\\/CD\u00a0for Flutter with Fastlane: Beginner\u2019s End-to-End Guide\u00a0\",\"datePublished\":\"2026-05-21T08:48:38+00:00\",\"dateModified\":\"2026-05-21T08:48:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/flutter-cicd-fastlane-guide\\\/\"},\"wordCount\":3385,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/flutter-cicd-fastlane-guide\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Flutter-CICD-Fastlane-Guide.jpg\",\"articleSection\":[\"Mobile App Development\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/velanapps.com\\\/blog\\\/flutter-cicd-fastlane-guide\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/flutter-cicd-fastlane-guide\\\/\",\"url\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/flutter-cicd-fastlane-guide\\\/\",\"name\":\"Flutter CI\\\/CD with Fastlane: Complete Beginner Guide\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/flutter-cicd-fastlane-guide\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/flutter-cicd-fastlane-guide\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Flutter-CICD-Fastlane-Guide.jpg\",\"datePublished\":\"2026-05-21T08:48:38+00:00\",\"dateModified\":\"2026-05-21T08:48:39+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/#\\\/schema\\\/person\\\/301160f2e391f734a4d8b238a1e0edeb\"},\"description\":\"Learn how to implement CI\\\/CD for Flutter using Fastlane. This beginner-friendly tutorial covers Android, iOS, GitHub Actions, app deployment, and automation step by step.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/flutter-cicd-fastlane-guide\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/velanapps.com\\\/blog\\\/flutter-cicd-fastlane-guide\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/flutter-cicd-fastlane-guide\\\/#primaryimage\",\"url\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Flutter-CICD-Fastlane-Guide.jpg\",\"contentUrl\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Flutter-CICD-Fastlane-Guide.jpg\",\"width\":2240,\"height\":1260,\"caption\":\"Flutter CI\\\/CD Setup for Android and iOS\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/flutter-cicd-fastlane-guide\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CI\\\/CD\u00a0for Flutter with Fastlane: Beginner\u2019s End-to-End Guide\u00a0\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/\",\"name\":\"Latest Trends In Information Technology (IT) Blog - VelanApps\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/#\\\/schema\\\/person\\\/301160f2e391f734a4d8b238a1e0edeb\",\"name\":\"kingsly jebaraj\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/Kingsly-Jebaraj-96x96.png\",\"url\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/Kingsly-Jebaraj-96x96.png\",\"contentUrl\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/Kingsly-Jebaraj-96x96.png\",\"caption\":\"kingsly jebaraj\"},\"description\":\"Kingsly heads the transformation services with over 10+ years of experience and proven track record. Successfully delivered high-quality projects while effectively managing cross-functional teams and ensuring timely delivery. Committed to driving innovation, fostering collaboration, and achieving excellence in software development.\",\"url\":\"https:\\\/\\\/velanapps.com\\\/blog\\\/author\\\/kingsly\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Flutter CI\/CD with Fastlane: Complete Beginner Guide","description":"Learn how to implement CI\/CD for Flutter using Fastlane. This beginner-friendly tutorial covers Android, iOS, GitHub Actions, app deployment, and automation step by step.","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:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/","og_locale":"en_US","og_type":"article","og_title":"Flutter CI\/CD with Fastlane: Complete Beginner Guide","og_description":"Learn how to implement CI\/CD for Flutter using Fastlane. This beginner-friendly tutorial covers Android, iOS, GitHub Actions, app deployment, and automation step by step.","og_url":"https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/","og_site_name":"Latest Trends In Information Technology (IT) Blog - VelanApps","article_published_time":"2026-05-21T08:48:38+00:00","article_modified_time":"2026-05-21T08:48:39+00:00","og_image":[{"width":2240,"height":1260,"url":"https:\/\/velanapps.com\/blog\/wp-content\/uploads\/2026\/05\/Flutter-CICD-Fastlane-Guide.jpg","type":"image\/jpeg"}],"author":"kingsly jebaraj","twitter_card":"summary_large_image","twitter_misc":{"Written by":"kingsly jebaraj","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/#article","isPartOf":{"@id":"https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/"},"author":{"name":"kingsly jebaraj","@id":"https:\/\/velanapps.com\/blog\/#\/schema\/person\/301160f2e391f734a4d8b238a1e0edeb"},"headline":"CI\/CD\u00a0for Flutter with Fastlane: Beginner\u2019s End-to-End Guide\u00a0","datePublished":"2026-05-21T08:48:38+00:00","dateModified":"2026-05-21T08:48:39+00:00","mainEntityOfPage":{"@id":"https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/"},"wordCount":3385,"commentCount":0,"image":{"@id":"https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/velanapps.com\/blog\/wp-content\/uploads\/2026\/05\/Flutter-CICD-Fastlane-Guide.jpg","articleSection":["Mobile App Development"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/","url":"https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/","name":"Flutter CI\/CD with Fastlane: Complete Beginner Guide","isPartOf":{"@id":"https:\/\/velanapps.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/#primaryimage"},"image":{"@id":"https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/velanapps.com\/blog\/wp-content\/uploads\/2026\/05\/Flutter-CICD-Fastlane-Guide.jpg","datePublished":"2026-05-21T08:48:38+00:00","dateModified":"2026-05-21T08:48:39+00:00","author":{"@id":"https:\/\/velanapps.com\/blog\/#\/schema\/person\/301160f2e391f734a4d8b238a1e0edeb"},"description":"Learn how to implement CI\/CD for Flutter using Fastlane. This beginner-friendly tutorial covers Android, iOS, GitHub Actions, app deployment, and automation step by step.","breadcrumb":{"@id":"https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/#primaryimage","url":"https:\/\/velanapps.com\/blog\/wp-content\/uploads\/2026\/05\/Flutter-CICD-Fastlane-Guide.jpg","contentUrl":"https:\/\/velanapps.com\/blog\/wp-content\/uploads\/2026\/05\/Flutter-CICD-Fastlane-Guide.jpg","width":2240,"height":1260,"caption":"Flutter CI\/CD Setup for Android and iOS"},{"@type":"BreadcrumbList","@id":"https:\/\/velanapps.com\/blog\/flutter-cicd-fastlane-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/velanapps.com\/blog\/"},{"@type":"ListItem","position":2,"name":"CI\/CD\u00a0for Flutter with Fastlane: Beginner\u2019s End-to-End Guide\u00a0"}]},{"@type":"WebSite","@id":"https:\/\/velanapps.com\/blog\/#website","url":"https:\/\/velanapps.com\/blog\/","name":"Latest Trends In Information Technology (IT) Blog - VelanApps","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/velanapps.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/velanapps.com\/blog\/#\/schema\/person\/301160f2e391f734a4d8b238a1e0edeb","name":"kingsly jebaraj","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/velanapps.com\/blog\/wp-content\/uploads\/2024\/04\/Kingsly-Jebaraj-96x96.png","url":"https:\/\/velanapps.com\/blog\/wp-content\/uploads\/2024\/04\/Kingsly-Jebaraj-96x96.png","contentUrl":"https:\/\/velanapps.com\/blog\/wp-content\/uploads\/2024\/04\/Kingsly-Jebaraj-96x96.png","caption":"kingsly jebaraj"},"description":"Kingsly heads the transformation services with over 10+ years of experience and proven track record. Successfully delivered high-quality projects while effectively managing cross-functional teams and ensuring timely delivery. Committed to driving innovation, fostering collaboration, and achieving excellence in software development.","url":"https:\/\/velanapps.com\/blog\/author\/kingsly\/"}]}},"_links":{"self":[{"href":"https:\/\/velanapps.com\/blog\/wp-json\/wp\/v2\/posts\/1774","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/velanapps.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/velanapps.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/velanapps.com\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/velanapps.com\/blog\/wp-json\/wp\/v2\/comments?post=1774"}],"version-history":[{"count":5,"href":"https:\/\/velanapps.com\/blog\/wp-json\/wp\/v2\/posts\/1774\/revisions"}],"predecessor-version":[{"id":1783,"href":"https:\/\/velanapps.com\/blog\/wp-json\/wp\/v2\/posts\/1774\/revisions\/1783"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/velanapps.com\/blog\/wp-json\/wp\/v2\/media\/1776"}],"wp:attachment":[{"href":"https:\/\/velanapps.com\/blog\/wp-json\/wp\/v2\/media?parent=1774"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/velanapps.com\/blog\/wp-json\/wp\/v2\/categories?post=1774"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/velanapps.com\/blog\/wp-json\/wp\/v2\/tags?post=1774"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}