{"id":8446,"date":"2024-10-31T01:23:20","date_gmt":"2024-10-30T19:23:20","guid":{"rendered":"https:\/\/touhidapps.com\/learn\/?p=8446"},"modified":"2024-10-31T01:46:28","modified_gmt":"2024-10-30T19:46:28","slug":"jenkins-ci-cd-build-upload-android-app-to-firebase-app-distribution","status":"publish","type":"post","link":"https:\/\/touhidapps.com\/learn\/jenkins-ci-cd-build-upload-android-app-to-firebase-app-distribution\/","title":{"rendered":"Jenkins CI\/CD: Build &#038; Upload Android App to Firebase app distribution of Kotlin Compose Multiplatform(KMP\/CMP) project"},"content":{"rendered":"\n<p>Jenkins CI\/CD is an open source solution for continuous integration and deployment. We can use it to build and upload to firebase app distribution so that testers can get a new build for testing.<\/p>\n\n\n\n<p>Now we are going to see how to use Jenkins CI\/CD for Kotlin Multiplatform project, build android apk and upload to firebase app distribution. After that testers will be notified by email and can test new build.<\/p>\n\n\n\n<p><strong><em><span style=\"text-decoration: underline;\">To understand this article you have to be familiar with android app development and firebase app distribution.<\/span><\/em><\/strong><\/p>\n\n\n\n<p><strong><span style=\"text-decoration: underline;\">Step 1: Download Jenkins<\/span><\/strong><\/p>\n\n\n\n<p>To download Jenkins file, go to below link and download the LTS version. Download instruction as like the screenshot.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.jenkins.io\/download\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.jenkins.io\/download\/<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"723\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/001_download-jenkins-1024x723.png\" alt=\"001_download-jenkins\" class=\"wp-image-8452\" style=\"aspect-ratio:1.4163208852005533;width:749px;height:auto\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/001_download-jenkins-1024x723.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/001_download-jenkins-300x212.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/001_download-jenkins-1536x1085.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/001_download-jenkins-2048x1447.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/001_download-jenkins-600x424.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">001_download-jenkins<\/figcaption><\/figure>\n\n\n\n<p><strong><span style=\"text-decoration: underline;\">Step 2: Run Jenkins<\/span><\/strong>:<\/p>\n\n\n\n<p>Make sure you have installed java on your machine. As you are focusing to build android app so I think you already have installed it.<\/p>\n\n\n\n<p>To run Jenkins- open terminal and use below command and hit enter. To get war file path just drag and drop the file on terminal.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>java -jar &lt;path of your jenkins downloaded war file&gt;<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"649\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/002_run-jenkins-1024x649.png\" alt=\"002_run jenkins\" class=\"wp-image-8453\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/002_run-jenkins-1024x649.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/002_run-jenkins-300x190.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/002_run-jenkins-1536x973.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/002_run-jenkins-2048x1297.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/002_run-jenkins-410x260.png 410w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/002_run-jenkins-600x380.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">002_run jenkins<\/figcaption><\/figure>\n\n\n\n<p>In the browser Jenkins Getting Started page of this screenshot(002) there is a red colored text which is actually the password directory path. Copy this path.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong><span style=\"text-decoration: underline;\">Step 3: Get the password &amp; unlock Jenkins<\/span><\/strong>:<\/p>\n\n\n\n<p>Now we need to open a directory found in previous step and get the password.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"808\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/003_go-to-folder-1-1024x808.png\" alt=\"003_go to folder 1\" class=\"wp-image-8454\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/003_go-to-folder-1-1024x808.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/003_go-to-folder-1-300x237.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/003_go-to-folder-1-80x62.png 80w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/003_go-to-folder-1-600x473.png 600w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/003_go-to-folder-1.png 1230w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">003_go to folder 1<\/figcaption><\/figure>\n\n\n\n<p>To get the unlock password go to <em>initialAdminPassword<\/em> directory. In finder choose &#8220;Go&#8221; menu and click on &#8220;Go to Folder&#8230;&#8221; option. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"772\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/004_go-to-folder-2-1024x772.png\" alt=\"004_go to folder 2\" class=\"wp-image-8455\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/004_go-to-folder-2-1024x772.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/004_go-to-folder-2-300x226.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/004_go-to-folder-2-600x452.png 600w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/004_go-to-folder-2.png 1488w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">004_go to folder 2<\/figcaption><\/figure>\n\n\n\n<p>Paste that copied path on the popup box like below screenshot(<em>004<\/em>) and hit enter\/return.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"571\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/005_open-password-file-1024x571.png\" alt=\"005_open password file\" class=\"wp-image-8456\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/005_open-password-file-1024x571.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/005_open-password-file-300x167.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/005_open-password-file-1536x856.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/005_open-password-file-2048x1142.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/005_open-password-file-600x335.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">005_open password file<\/figcaption><\/figure>\n\n\n\n<p>In the screenshot(005) I am using sublime text to open the admin password file. Open the file(<em>initialAdminPassword<\/em>) using any text editor and copy the password. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"855\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/006_apply-password-1024x855.png\" alt=\"006_apply password\" class=\"wp-image-8457\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/006_apply-password-1024x855.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/006_apply-password-300x250.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/006_apply-password-1536x1282.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/006_apply-password-2048x1709.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/006_apply-password-600x501.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">006_apply password<\/figcaption><\/figure>\n\n\n\n<p>Paste copied password in the getting started pages password box and click on Continue button. (006)<\/p>\n\n\n\n<p><strong><span style=\"text-decoration: underline;\">Step 4: make Jenkins ready to use<\/span><\/strong>:<\/p>\n\n\n\n<p>After unlocking Jenkins we have to setup jenkins to make it ready to use.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"629\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/007_install-plugin-1024x629.png\" alt=\"007_install plugin\" class=\"wp-image-8458\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/007_install-plugin-1024x629.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/007_install-plugin-300x184.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/007_install-plugin-1536x944.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/007_install-plugin-600x369.png 600w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/007_install-plugin.png 1780w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">007_install plugin<\/figcaption><\/figure>\n\n\n\n<p>(007) After unlocking we will see this page to install plugins. Just choose &#8220;Install suggested plugins&#8221;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"878\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/008_installing-plugin-1024x878.png\" alt=\"008_installing plugin\" class=\"wp-image-8459\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/008_installing-plugin-1024x878.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/008_installing-plugin-300x257.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/008_installing-plugin-1536x1317.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/008_installing-plugin-2048x1757.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/008_installing-plugin-600x515.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">008_installing plugin<\/figcaption><\/figure>\n\n\n\n<p>Jenkins will install necessary plugins (008). Make sure you have stable internet connection while doing this step.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"865\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/009_crate-admin-user-1024x865.png\" alt=\"009_crate admin user\" class=\"wp-image-8460\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/009_crate-admin-user-1024x865.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/009_crate-admin-user-300x254.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/009_crate-admin-user-1536x1298.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/009_crate-admin-user-2048x1731.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/009_crate-admin-user-600x507.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">009_crate admin user<\/figcaption><\/figure>\n\n\n\n<p>After installation of plugins we have to create admin user. Use your name, password and email for this step(009) and click on &#8220;Save and Continue&#8221; button.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"858\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/010_jenkins-access-url-1024x858.png\" alt=\"010_jenkins access url\" class=\"wp-image-8461\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/010_jenkins-access-url-1024x858.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/010_jenkins-access-url-300x251.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/010_jenkins-access-url-1536x1286.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/010_jenkins-access-url-2048x1715.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/010_jenkins-access-url-600x503.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">010_jenkins access url<\/figcaption><\/figure>\n\n\n\n<p>After setting up admin user we will see a screen of Jenkins URL. Just keep this as it is and click on &#8220;Save and Finish&#8221; button (010).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"863\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/011_jenkins-start-1024x863.png\" alt=\"011_jenkins start\" class=\"wp-image-8462\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/011_jenkins-start-1024x863.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/011_jenkins-start-300x253.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/011_jenkins-start-1536x1294.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/011_jenkins-start-2048x1725.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/011_jenkins-start-600x505.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">011_jenkins start<\/figcaption><\/figure>\n\n\n\n<p>Now Jenkins is ready to use(011). Click on &#8220;Start using Jenkins&#8221; button.<\/p>\n\n\n\n<p><strong><span style=\"text-decoration: underline;\">Step 5: Set Java &amp; Gradle<\/span><\/strong>:<\/p>\n\n\n\n<p>We have use set java path and gradle in Jenkins.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"867\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/012_manage-jenkins-1024x867.png\" alt=\"012_manage jenkins\" class=\"wp-image-8463\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/012_manage-jenkins-1024x867.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/012_manage-jenkins-300x254.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/012_manage-jenkins-1536x1300.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/012_manage-jenkins-2048x1734.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/012_manage-jenkins-600x508.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">012_manage jenkins<\/figcaption><\/figure>\n\n\n\n<p>Go to &#8220;Manage Jenkins&#8221; menu and choose &#8220;Tools&#8221; (012).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"863\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/013_add-jdk-and-gradle-1024x863.png\" alt=\"013_add jdk and gradle\" class=\"wp-image-8464\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/013_add-jdk-and-gradle-1024x863.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/013_add-jdk-and-gradle-300x253.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/013_add-jdk-and-gradle-1536x1295.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/013_add-jdk-and-gradle-2048x1726.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/013_add-jdk-and-gradle-600x506.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">013_add jdk and gradle<\/figcaption><\/figure>\n\n\n\n<p>Scroll down a little bit and Click on Add JDK button to add Java path. (013)<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"380\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/014_add-jdk-path-1024x380.png\" alt=\"014_add jdk path\" class=\"wp-image-8465\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/014_add-jdk-path-1024x380.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/014_add-jdk-path-300x111.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/014_add-jdk-path-1536x569.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/014_add-jdk-path-2048x759.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/014_add-jdk-path-600x222.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">014_add jdk path<\/figcaption><\/figure>\n\n\n\n<p>To find installed Java path run below code in your terminal. Copy the path and set it to JAVA_HOME section in Jenkins also use any name in the Name box. (014)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/usr\/libexec\/java_home \/\/ This command to get java path<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"861\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/015_add-gradle-version-1024x861.png\" alt=\"015_add gradle version\" class=\"wp-image-8466\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/015_add-gradle-version-1024x861.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/015_add-gradle-version-300x252.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/015_add-gradle-version-1536x1291.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/015_add-gradle-version-2048x1721.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/015_add-gradle-version-600x504.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">015_add gradle version<\/figcaption><\/figure>\n\n\n\n<p>Now we need to set gradle. So scroll down a little more and Click on Add Gradle button. Type a name as your wish and choose a gradle version which one you may need to build your android project. You can check your android project to know supported version. Near version will also may work fine.<\/p>\n\n\n\n<p><strong><span style=\"text-decoration: underline;\">Step 6: Create a new Pipeline:<\/span><\/strong><\/p>\n\n\n\n<p>Now we have to create a new pipeline.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"859\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/016_new-item-1024x859.png\" alt=\"016_new item\" class=\"wp-image-8467\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/016_new-item-1024x859.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/016_new-item-300x252.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/016_new-item-1536x1289.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/016_new-item-2048x1719.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/016_new-item-600x504.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">016_new item<\/figcaption><\/figure>\n\n\n\n<p>(016) Click on &#8220;New Item&#8221; option.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"812\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/017_make-new-pipeline-1024x812.png\" alt=\"017_make new pipeline\" class=\"wp-image-8468\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/017_make-new-pipeline-1024x812.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/017_make-new-pipeline-300x238.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/017_make-new-pipeline-1536x1217.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/017_make-new-pipeline-2048x1623.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/017_make-new-pipeline-80x62.png 80w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/017_make-new-pipeline-600x476.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">017_make new pipeline<\/figcaption><\/figure>\n\n\n\n<p>(017) give a name -&gt; choose Pipeline -&gt; Click OK button.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"719\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/018_write-pipeline-script-1024x719.png\" alt=\"018_write pipeline script\" class=\"wp-image-8469\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/018_write-pipeline-script-1024x719.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/018_write-pipeline-script-300x211.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/018_write-pipeline-script-1536x1078.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/018_write-pipeline-script-2048x1437.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/018_write-pipeline-script-600x421.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">018_write pipeline script<\/figcaption><\/figure>\n\n\n\n<p>Now we are in the most customisable part. In the pipeline script section we have to write code. You may need different tasks for different work. You can write the script as you need.  It is actually a combination of gradle and shell script. <\/p>\n\n\n\n<p>Wait, Before writing the script we can download the firebase account key file. You can get your firebase service account key json file from your firebase project like below. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"592\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/018_1_fireabase-service-account-key-generate-and-download-1024x592.png\" alt=\"018_1_fireabase service account key generate and download\" class=\"wp-image-8496\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/018_1_fireabase-service-account-key-generate-and-download-1024x592.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/018_1_fireabase-service-account-key-generate-and-download-300x173.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/018_1_fireabase-service-account-key-generate-and-download-1536x887.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/018_1_fireabase-service-account-key-generate-and-download-2048x1183.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/018_1_fireabase-service-account-key-generate-and-download-600x347.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">018_1_fireabase service account key generate and download<\/figcaption><\/figure>\n\n\n\n<p>Open your firebase project -&gt; Project settings -&gt; Service Accounts -&gt; Firebase Admin SDK -&gt; Generate new private key &#8211; &gt; Generate Key -&gt; File will download. Use this file path as FIREBASE_SERVICE_AC_KEY_PATH of next given code.<\/p>\n\n\n\n<p>I am adding a code below so you just can copy and paste it to your Script section and after a little customisation you are ready to go. It is a little big code but don&#8217;t worry you will understand if you see the code. In below code from the environment { } block you need to change the git url, destination path, sdk path, app id, firebase json file path.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * This Jenkins script is to build Kotlin Multiplatform project\n **\/\n\npipeline {\n    \n    agent any\n    \n    environment {\n        \/\/ Declare global environment variables\n        \/\/ General android project ex.: 'app\/build\/outputs\/apk\/debug\/*.apk'\n        \/\/ Kotlin Multiplatform project ex.: 'composeApp\/build\/outputs\/apk\/debug\/*.apk'\n        BUILD_PATH = 'composeApp\/build\/outputs\/apk'\n        BUILD_APK_PATH = ''\n        DESTINATION_PATH = '\/Users\/touhid\/Desktop\/test' \/\/ Just to get apk easily\n        ANDROID_SDK_PATH = '\/Users\/touhid\/Library\/Android\/sdk'\n        \n        MY_PROPERTIES_FILE = \"local.properties\"\n        GRADLE_FILE = 'composeApp\/build.gradle.kts'  \/\/ Path to your Gradle file\n        \n        PROJECT_GIT_URL = 'https:\/\/github.com\/TouhidApps\/Unit-Test-Kotlin-Multiplatform-Compose.git'\n\n        APP_ID = '1:1050128836546:android:319e12c81a6f08fd85b'  \/\/ Replace with your Firebase app ID\n        FIREBASE_SERVICE_AC_KEY_PATH = '\/Users\/touhid\/Downloads\/abc-2b5f9-firebase-adminsdk-6iuqx-bf59c84cf0.json'  \/\/ Replace with your file path\n        \n    }\n    \n    stages {\n        \n        stage('Check property file') { \/\/ check local.properties file is available or not if not create it\n            steps {\n                script {\n                    \n                    \/\/ Define the file path and content\n                    def propFilePath = \"${env.WORKSPACE}\/${MY_PROPERTIES_FILE}\"\n                    def propFileContent = \"\"\"sdk.dir=${ANDROID_SDK_PATH}\nVERSION_CODE=1\nVERSION_NAME=1.0.0\nRELEASE_NOTES=What's new:\t- Added new features\t- Fixed bug\t- Improved performance\t- new notificat\"\"\"\n\n                    \/\/ Check if the file exists\n                    if (!fileExists(propFilePath)) {\n                        \/\/ Create the file and write content\n                        writeFile file: propFilePath, text: propFileContent\n                        echo \"${MY_PROPERTIES_FILE} File created: ${propFilePath}\"\n                    } else {\n                        echo \"${MY_PROPERTIES_FILE} File already exists: ${propFilePath}\"\n                    }\n                    \n                }\n            }\n        }\n    \n        stage('Store Value') {\n            steps {\n                script {\n                    \/\/ Store the parameter value for future builds\n                    \/\/    writeFile file: MY_PROPERTIES_FILE, text: \"VERSION_NAME=${params.VERSION_NAME}\"\n                    \n                    \/\/ Read the properties file\n                    def fileContent = readFile(\"${MY_PROPERTIES_FILE}\").trim().split('\\n').collectEntries { line -&gt;\n                        def (key, value) = line.split('=')\n                        &#91;(key.trim()): value.trim()]\n                    }\n                    \n                    \/\/ Log the current file content\n                    echo \"File Content:\\n${fileContent}\"\n                    \n                    \/\/ Update the properties with the new value\n                    if (params.VERSION_CODE) {\n                        fileContent&#91;'VERSION_CODE'] = params.VERSION_CODE\n                    }\n                    if (params.VERSION_NAME) {\n                        fileContent&#91;'VERSION_NAME'] = params.VERSION_NAME\n                    }\n                    if (params.RELEASE_NOTES) {\n                        fileContent&#91;'RELEASE_NOTES'] = params.RELEASE_NOTES.replaceAll('\\n', '\\t') \/\/ Replace newlines with tabs, not to inturrupt new line of other key values values\n                    }\n\n                    \/\/ Write back to the properties file\n                    writeFile file: \"${MY_PROPERTIES_FILE}\", text: fileContent.collect { \"${it.key}=${it.value}\" }.join('\\n')\n                    \n                }\n            }\n        }\n        \n        stage('Input Parameter') { \/\/ Keep this stage after 'Store Value' so after storing it can load new values\n            steps {\n                script {\n                    \/\/ Define a parameter dynamically based on the environment variable\n                    def fileContent = readFile(\"${MY_PROPERTIES_FILE}\").trim().split('\\n').collectEntries { line -&gt;\n                        def (key, value) = line.split('=')\n                        &#91;(key.trim()): value.trim()]\n                    }\n                    echo \"${fileContent&#91;'VERSION_CODE']}\"\n                    echo \"${fileContent&#91;'VERSION_NAME']}\"\n                    echo \"${fileContent&#91;'RELEASE_NOTES']}\"\n                    properties(&#91;\n                        parameters(&#91;\n                            choice(name: 'BUILD_TYPE', choices: &#91;'debug', 'release'], description: 'Select build type'),\n                            string(name: 'FIREBASE_TESTERS', defaultValue: 'uat-testers,uat-testers', description: 'Enter Firebase tester group (comma-separated)'),\n                            string(name: 'VERSION_CODE', defaultValue: \"${fileContent&#91;'VERSION_CODE']}\", description: \"Increase app version code (Current: ${fileContent&#91;'VERSION_CODE']})\"),\n                            string(name: 'VERSION_NAME', defaultValue: \"${fileContent&#91;'VERSION_NAME']}\", description: \"Increase app version name (Current: ${fileContent&#91;'VERSION_NAME']})\"),\n                            text(name: 'RELEASE_NOTES', defaultValue: \"${fileContent&#91;'RELEASE_NOTES'].replaceAll('\\t', '\\n')}\", description: 'Release notes:')\n                        ])\n                    ])\n                }\n            }\n        }\n        \n        stage('Checkout') {\n            steps {\n                script {\n                    \/\/ Check out a specific branch\n                    git branch: 'main', url: \"${PROJECT_GIT_URL}\"\n                }\n            }\n        }\n        \n        stage('Preparation') {\n            steps {\n                script {\n                    \n                    \/\/ Define Groovy variables\n                    def buildType = params.BUILD_TYPE ?: 'debug'\n                    def buildPath = \"${BUILD_PATH}\/${buildType}\"\n                    BUILD_APK_PATH = \"${buildPath}\/*.apk\"\n                    \/\/ Make directory if not exists\n                    sh \"mkdir -p ${buildPath}\"\n                    sh \"mkdir -p ${DESTINATION_PATH}\"\n                    \/\/ Delete previous build if available\n                    sh \"rm -rf ${buildPath}\/*\"\n                    \n                }\n            }\n        }\n        \n        stage('Update Version in Gradle File') {\n            steps {\n                script {\n                    \/\/ Read the existing gradle.kts file\n                    def gradleContent = readFile(\"${GRADLE_FILE}\")\n\n                    \/\/ Replace versionCode and versionName\n                    gradleContent = gradleContent.replaceAll(\/versionCode\\s*=\\s*\\d+\/, \"versionCode = ${params.VERSION_CODE}\")\n                    gradleContent = gradleContent.replaceAll(\/versionName\\s*=\\s*\\\".*?\\\"\/, \"versionName = \\\"${params.VERSION_NAME}\\\"\")\n\n                    \/\/ Write back to the gradle.kts file\n                    writeFile(file: \"${GRADLE_FILE}\", text: gradleContent)\n                    echo \"Updated ${GRADLE_FILE} with versionCode=${params.VERSION_CODE} and versionName=${params.VERSION_NAME}\"\n                }\n            }\n        }\n        \n        stage('Build') {\n            steps {\n                script {\n                    \/\/ or use `gradlew.bat` for Windows\n                    def buildCommand = \".\/gradlew assemble${BUILD_TYPE.capitalize()}\"\n                    sh buildCommand\n                }\n            }\n        }\n        \n        stage('Archive') {\n            steps {\n                archiveArtifacts artifacts: BUILD_APK_PATH, allowEmptyArchive: true\n            }\n        }\n        \n        stage('Pause 3 seconds') {\n            steps {\n                \/\/ Pause for 3 seconds to make sure build file has written to storage perfectly\n                script {\n                    sleep(3)  \/\/ Pause for 3 seconds\n                }\n            }\n        }\n        \n        stage('Copy to Desktop') {\n            steps {\n                \/\/ Copy the APK to a specific location\n                script {\n                    sh \"cp ${BUILD_APK_PATH} ${DESTINATION_PATH}\"\n                }\n            }\n        }\n        \n        stage('Upload to firebase distribution') {\n            steps {\n                script {\n                    \/\/ Upload APK to Firebase App Distribution\n                    def fileListCmd = \"ls ${BUILD_APK_PATH} | head -n 1\" \/\/  | head -n 1 = for first file found\n                    def apkFilePath = sh(script: fileListCmd, returnStdout: true).trim()\n                    \n                    echo \"Uploading apk file path: ${apkFilePath}\"\n                    \n                    \/\/ Authenticate with Firebase\n                    env.GOOGLE_APPLICATION_CREDENTIALS = \"${FIREBASE_SERVICE_AC_KEY_PATH}\"\n                    \n                    \/\/ Upload to Firebase App Distribution\n                    def firebaseUploadCmd = \"\"\"\n                    firebase appdistribution:distribute \"${apkFilePath}\" \\\n                      --app \"${APP_ID}\" \\\n                      --groups \"${params.FIREBASE_TESTERS}\" \\\n                      --release-notes \"${params.RELEASE_NOTES}\"\n                      \"\"\"\n                      \n                    echo \"Executing: ${firebaseUploadCmd}\"\n                    sh firebaseUploadCmd\n                    \n                }\n            }\n        }\n     \n        \/\/ stage('Send notification') {\n        \/\/     steps {\n        \/\/         script {\n        \/\/             if (currentBuild.result == 'SUCCESS') {\n        \/\/                 \/\/ Send success notification\n        \/\/             } else {\n        \/\/                 \/\/ Send failure notification\n        \/\/             }\n        \/\/         }\n        \/\/     }\n        \/\/ }\n        \n        \n     \/\/   stage('Test') {\n     \/\/       steps {\n      \/\/          sh '.\/gradlew test'\n     \/\/       }\n     \/\/   }\n        \/\/ post {\n        \/\/     always {\n        \/\/         mail to: 'your-email@example.com',\n        \/\/              subject: \"Build ${currentBuild.currentResult}: Job '${env.JOB_NAME}'\",\n        \/\/              body: \"Check console output at ${env.BUILD_URL}\"\n        \/\/     }\n        \/\/  }\n    }\n    \n}<\/code><\/pre>\n\n\n\n<p>You can enable test stage if you need by uncommenting test stage.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>I would like to share my git repository where I have kept above code in &#8220;Jenkinsfile&#8221;. Don&#8217;t forget to give a start in this repository.<\/p>\n<cite><a href=\"https:\/\/github.com\/TouhidApps\/Jenkins-with-KMP\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/TouhidApps\/Jenkins-with-KMP<\/a><\/cite><\/blockquote>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"240\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/019_cli-firebase-tool-install-1024x240.png\" alt=\"019_cli firebase tool install\" class=\"wp-image-8470\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/019_cli-firebase-tool-install-1024x240.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/019_cli-firebase-tool-install-300x70.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/019_cli-firebase-tool-install-600x141.png 600w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/019_cli-firebase-tool-install.png 1448w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">019_cli firebase tool install<\/figcaption><\/figure>\n\n\n\n<p>(019) Now we need to install firebase tools to use firebase terminal based tool. Run below code in terminal.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install -g firebase-tools<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"582\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/020_build-now-1024x582.png\" alt=\"020_build now\" class=\"wp-image-8471\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/020_build-now-1024x582.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/020_build-now-300x171.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/020_build-now-1536x873.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/020_build-now-2048x1164.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/020_build-now-600x341.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">020_build now<\/figcaption><\/figure>\n\n\n\n<p>All set. Now click on Build Now button and click Build button. Don&#8217;t worry first build will fail and you will not see any extra option to choose.<\/p>\n\n\n\n<p><em><span style=\"text-decoration: underline;\">Add testers on firebase app distribution and make testers group. Testers group you can set in the jenkins script.<\/span><\/em><\/p>\n\n\n\n<p>Now see below. After first build your menu name will be &#8220;Build with Parameters&#8221; and there are some options to choose. you already know what are the options if you are familiar with firebase app distribution.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"736\" src=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/021_build-with-param-1024x736.png\" alt=\"021_build with param\" class=\"wp-image-8472\" srcset=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/021_build-with-param-1024x736.png 1024w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/021_build-with-param-300x216.png 300w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/021_build-with-param-1536x1104.png 1536w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/021_build-with-param-2048x1472.png 2048w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/021_build-with-param-360x260.png 360w, https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/021_build-with-param-600x431.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">021_build with param<\/figcaption><\/figure>\n\n\n\n<p>Now build this to upload apk on firebase app distribution. We will also get a copy of apk file in our desktop to easily access apk. Sometimes we need to share apk without firebase app distribution so I kept that option in the script.<\/p>\n\n\n\n<p><strong><em>Thank you so much. Share with your friends who need it.<\/em><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jenkins CI\/CD is an open source solution for continuous integration and deployment. We can use it to build and upload to firebase app distribution so that testers can get a new build for testing. Now we are going to see how to use Jenkins CI\/CD for Kotlin Multiplatform project, build android apk and upload to [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":8449,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[161,150,163],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v15.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Jenkins CI\/CD: Build &amp; Upload Android App to Firebase app distribution of Kotlin Compose Multiplatform(KMP\/CMP) project - Touhid Apps!<\/title>\n<meta name=\"description\" content=\"how to use Jenkins CI\/CD for Kotlin Multiplatform project, build android apk and upload to firebase app distribution. After that testers will be notified by email.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/touhidapps.com\/learn\/jenkins-ci-cd-build-upload-android-app-to-firebase-app-distribution\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Jenkins CI\/CD: Build &amp; Upload Android App to Firebase app distribution of Kotlin Compose Multiplatform(KMP\/CMP) project\" \/>\n<meta property=\"og:description\" content=\"how to use Jenkins CI\/CD for Kotlin Multiplatform project, build android apk and upload to firebase app distribution. After that testers will be notified by email.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/touhidapps.com\/learn\/jenkins-ci-cd-build-upload-android-app-to-firebase-app-distribution\/\" \/>\n<meta property=\"og:site_name\" content=\"Touhid Apps!\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/touhidapps\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/touhid1010\" \/>\n<meta property=\"article:published_time\" content=\"2024-10-30T19:23:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-10-30T19:46:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/jenkins-ci-cd-with-kotlin-multiplatform-android.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1792\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@#\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\">\n\t<meta name=\"twitter:data1\" content=\"8 minutes\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https:\/\/touhidapps.com\/learn\/#organization\",\"name\":\"Touhid Apps Learn\",\"url\":\"https:\/\/touhidapps.com\/learn\/\",\"sameAs\":[\"https:\/\/www.facebook.com\/touhidapps\",\"https:\/\/www.linkedin.com\/company\/touhid-apps\",\"https:\/\/www.youtube.com\/touhidapps\"],\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/touhidapps.com\/learn\/#logo\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2020\/09\/kotlin-compose-multiplatform-bangla-android-course-cover.jpg\",\"width\":1920,\"height\":1080,\"caption\":\"Touhid Apps Learn\"},\"image\":{\"@id\":\"https:\/\/touhidapps.com\/learn\/#logo\"}},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/touhidapps.com\/learn\/#website\",\"url\":\"https:\/\/touhidapps.com\/learn\/\",\"name\":\"Touhid Apps!\",\"description\":\"Makes Apps Development Fun | Bangla Android Kotlin Tutorial Courses\",\"publisher\":{\"@id\":\"https:\/\/touhidapps.com\/learn\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/touhidapps.com\/learn\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/touhidapps.com\/learn\/jenkins-ci-cd-build-upload-android-app-to-firebase-app-distribution\/#primaryimage\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/2024\/10\/jenkins-ci-cd-with-kotlin-multiplatform-android.jpg\",\"width\":1792,\"height\":1024,\"caption\":\"jenkins ci-cd with kotlin multiplatform android\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/touhidapps.com\/learn\/jenkins-ci-cd-build-upload-android-app-to-firebase-app-distribution\/#webpage\",\"url\":\"https:\/\/touhidapps.com\/learn\/jenkins-ci-cd-build-upload-android-app-to-firebase-app-distribution\/\",\"name\":\"Jenkins CI\/CD: Build & Upload Android App to Firebase app distribution of Kotlin Compose Multiplatform(KMP\/CMP) project - Touhid Apps!\",\"isPartOf\":{\"@id\":\"https:\/\/touhidapps.com\/learn\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/touhidapps.com\/learn\/jenkins-ci-cd-build-upload-android-app-to-firebase-app-distribution\/#primaryimage\"},\"datePublished\":\"2024-10-30T19:23:20+00:00\",\"dateModified\":\"2024-10-30T19:46:28+00:00\",\"description\":\"how to use Jenkins CI\/CD for Kotlin Multiplatform project, build android apk and upload to firebase app distribution. After that testers will be notified by email.\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/touhidapps.com\/learn\/jenkins-ci-cd-build-upload-android-app-to-firebase-app-distribution\/\"]}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/touhidapps.com\/learn\/jenkins-ci-cd-build-upload-android-app-to-firebase-app-distribution\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/touhidapps.com\/learn\/jenkins-ci-cd-build-upload-android-app-to-firebase-app-distribution\/#webpage\"},\"author\":{\"@id\":\"https:\/\/touhidapps.com\/learn\/#\/schema\/person\/fa5754d3b194eade4772b66d9c310115\"},\"headline\":\"Jenkins CI\/CD: Build &#038; Upload Android App to Firebase app distribution of Kotlin Compose Multiplatform(KMP\/CMP) project\",\"datePublished\":\"2024-10-30T19:23:20+00:00\",\"dateModified\":\"2024-10-30T19:46:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/touhidapps.com\/learn\/jenkins-ci-cd-build-upload-android-app-to-firebase-app-distribution\/#webpage\"},\"publisher\":{\"@id\":\"https:\/\/touhidapps.com\/learn\/#organization\"},\"image\":{\"@id\":\"https:\/\/touhidapps.com\/learn\/jenkins-ci-cd-build-upload-android-app-to-firebase-app-distribution\/#primaryimage\"},\"articleSection\":\"Android SDK,Kotlin,Mobile Apps\",\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/touhidapps.com\/learn\/#\/schema\/person\/fa5754d3b194eade4772b66d9c310115\",\"name\":\"Md. Touhidul Islam\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/touhidapps.com\/learn\/#personlogo\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/touhidapps.com\/learn\/wp-content\/uploads\/nsl_avatars\/6d841e66bc35036a9a24410322a30c0a.jpg\",\"caption\":\"Md. Touhidul Islam\"},\"description\":\"Android | iOS | Kotlin | Swift -- \\u09e8\\u09e6\\u09e7\\u09ec \\u09b8\\u09be\\u09b2 \\u09a5\\u09c7\\u0995\\u09c7 \\u09a8\\u09cd\\u09af\\u09be\\u099f\\u09bf\\u09ad \\u098f\\u09a8\\u09cd\\u09a1\\u09cd\\u09b0\\u09df\\u09c7\\u09a1 \\u0993 \\u09a8\\u09cd\\u09af\\u09be\\u099f\\u09bf\\u09ad \\u0986\\u0987\\u0993\\u098f\\u09b8 \\u09a6\\u09c1\\u099f\\u09bf \\u09aa\\u09cd\\u09b2\\u09be\\u099f\\u09ab\\u09b0\\u09cd\\u09ae\\u09c7\\u0987 \\u0995\\u09be\\u099c \\u0995\\u09b0\\u099b\\u09bf\\u0964 \\u09e9 \\u099f\\u09bf \\u09a6\\u09c7\\u09b6\\u09bf \\u0993 \\u09e8 \\u099f\\u09bf \\u09ae\\u09be\\u09b2\\u09cd\\u099f\\u09bf\\u09a8\\u09c7\\u09b6\\u09a8\\u09be\\u09b2 \\u0995\\u09cb\\u09ae\\u09cd\\u09aa\\u09be\\u09a8\\u09bf\\u09a4\\u09c7 \\u0995\\u09be\\u099c \\u0995\\u09b0\\u09be \\u09b9\\u09df\\u09c7\\u099b\\u09c7\\u0964 \\u098f\\u0996\\u09a8 \\u0986\\u099b\\u09bf \\u09ae\\u09be\\u09b2\\u09df\\u09c7\\u09b6\\u09bf\\u09df\\u09be\\u09b0 \\u0995\\u09c1\\u09df\\u09be\\u09b2\\u09be\\u09b2\\u09be\\u09ae\\u09aa\\u09c1\\u09b0\\u09c7\\u0964 \\u098f\\u0996\\u09be\\u09a8\\u09c7 \\u098f\\u0995\\u099f\\u09bf \\u09ae\\u09be\\u09b2\\u09cd\\u099f\\u09bf-\\u09a8\\u09cd\\u09af\\u09be\\u09b6\\u09a8\\u09be\\u09b2 \\u09ac\\u09cd\\u09af\\u09be\\u0982\\u0995\\u09c7\\u09b0 \\u09ae\\u09cb\\u09ac\\u09be\\u0987\\u09b2 \\u098f\\u09cd\\u09af\\u09be\\u09aa \\u09a1\\u09c7\\u09ad\\u09b2\\u09aa\\u09ae\\u09c7\\u09a8\\u09cd\\u099f \\u09a8\\u09bf\\u09df\\u09c7 \\u0995\\u09be\\u099c \\u0995\\u09b0\\u099b\\u09bf\\u0964 \\u09a6\\u09c7\\u09b6\\u09c7 \\u09a5\\u09be\\u0995\\u09a4\\u09c7 \\u099c\\u09ac\\u09c7\\u09b0 \\u09aa\\u09be\\u09b6\\u09be\\u09aa\\u09be\\u09b6\\u09bf \\u09a2\\u09be\\u0995\\u09be\\u09b0 \\u09e8\\u099f\\u09bf \\u09ac\\u09c3\\u09b9\\u09a4\\u09cd\\u09a4\\u09ae \\u099f\\u09cd\\u09b0\\u09c7\\u09a8\\u09bf\\u0982 \\u09b8\\u09c7\\u09a8\\u09cd\\u099f\\u09be\\u09b0\\u09c7 \\u09aa\\u09be\\u09b0\\u09cd\\u099f-\\u099f\\u09be\\u0987\\u09ae \\u098f\\u09a8\\u09cd\\u09a1\\u09cd\\u09b0\\u09df\\u09c7\\u09a1 \\u099f\\u09cd\\u09b0\\u09c7\\u0987\\u09a8\\u09be\\u09b0 \\u09b9\\u09bf\\u09b8\\u09c7\\u09ac\\u09c7 \\u0995\\u09be\\u099c \\u0995\\u09b0\\u09be \\u09b9\\u09df\\u09c7\\u099b\\u09c7\\u0964 \\u09a4\\u09a5\\u09cd\\u09af\\u09aa\\u09cd\\u09b0\\u09af\\u09c1\\u0995\\u09cd\\u09a4\\u09bf\\u09a4\\u09c7 \\u09ae\\u09be\\u09b8\\u09cd\\u099f\\u09be\\u09b0\\u09cd\\u09b8 \\u0995\\u09b0\\u09c7\\u099b\\u09bf \\u099c\\u09be\\u09b9\\u09be\\u0999\\u09cd\\u0997\\u09c0\\u09b0\\u09a8\\u0997\\u09b0 \\u09ac\\u09bf\\u09b6\\u09cd\\u09ac\\u09ac\\u09bf\\u09a6\\u09cd\\u09af\\u09be\\u09b2\\u09df\\u09c7\\u09b0 IIT \\u09a5\\u09c7\\u0995\\u09c7\\u0964 \\u0997\\u09cd\\u09b0\\u09be\\u09ae\\u09c0\\u09a8\\u09ab\\u09cb\\u09a8 \\u0995\\u09cb\\u09a1 \\u09ae\\u09be\\u09b8\\u09cd\\u099f\\u09be\\u09b0 \\u09b9\\u09cd\\u09af\\u09be\\u0995\\u09be\\u09a5\\u09a8\\u09c7 (\\u09e8\\u09e6\\u09e8\\u09e6) \\u098f\\u09a8\\u09cd\\u09a1\\u09cd\\u09b0\\u09df\\u09c7\\u09a1\\u09c7 \\u09b0\\u09be\\u09a8\\u09be\\u09b0\\u0986\\u09aa \\u099b\\u09bf\\u09b2\\u09be\\u09ae\\u0964 \\u0995\\u09be\\u099c \\u0995\\u09b0\\u09c7\\u099b\\u09bf \\u09ab\\u09bf\\u09a8\\u099f\\u09c7\\u0995, \\u09b0\\u09be\\u0987\\u09a1 \\u09b6\\u09c7\\u09df\\u09be\\u09b0\\u09bf\\u0982, \\u09b6\\u09b0\\u09cd\\u099f \\u09ad\\u09bf\\u09a1\\u09bf\\u0993 \\u09b6\\u09c7\\u09df\\u09be\\u09b0\\u09bf\\u0982, \\u09b2\\u09be\\u0987\\u09ad \\u09ac\\u09cd\\u09b0\\u09a1\\u0995\\u09be\\u09b8\\u09cd\\u099f\\u09bf\\u0982, \\u09a8\\u09bf\\u0989\\u099c \\u0987\\u09a4\\u09cd\\u09af\\u09be\\u09a6\\u09bf \\u09ac\\u09bf\\u09ad\\u09bf\\u09a8\\u09cd\\u09a8 \\u09a7\\u09b0\\u09a8\\u09c7\\u09b0 \\u098f\\u09cd\\u09af\\u09be\\u09aa \\u09a8\\u09bf\\u09df\\u09c7\\u0964 \\u0995\\u09ae\\u09bf\\u0989\\u09a8\\u09bf\\u099f\\u09bf\\u09b0 \\u099c\\u09a8\\u09cd\\u09af \\u0985\\u09a8\\u09c7\\u0995 \\u0986\\u0997\\u09c7 \\u09a5\\u09c7\\u0995\\u09c7\\u0987 \\u0987\\u0989\\u099f\\u09bf\\u0989\\u09ac\\u09c7 \\u09ad\\u09bf\\u09a1\\u09bf\\u0993 \\u09a6\\u09bf\\u09df\\u09c7 \\u0986\\u09b8\\u099b\\u09bf \\u09af\\u09be\\u09b0 \\u09ae\\u09be\\u09a7\\u09cd\\u09af\\u09ae\\u09c7 \\u0986\\u09ae\\u09be\\u09b0 \\u09ac\\u09be\\u09b8\\u09cd\\u09a4\\u09ac \\u0985\\u09ad\\u09bf\\u099c\\u09cd\\u099e\\u09a4\\u09be\\u0997\\u09c1\\u09b2\\u09cb \\u09b8\\u0995\\u09b2\\u09c7\\u09b0 \\u09b8\\u09be\\u09a5\\u09c7 \\u09b6\\u09c7\\u09df\\u09be\\u09b0 \\u0995\\u09b0\\u099b\\u09bf\\u0964\",\"sameAs\":[\"https:\/\/touhidapps.com\",\"https:\/\/www.facebook.com\/touhid1010\",\"#\",\"https:\/\/www.linkedin.com\/in\/touhid1010\",\"#\",\"https:\/\/twitter.com\/#\",\"#\",\"https:\/\/www.youtube.com\/touhidapps\",\"#\",\"#\",\"#\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"https:\/\/touhidapps.com\/learn\/wp-json\/wp\/v2\/posts\/8446"}],"collection":[{"href":"https:\/\/touhidapps.com\/learn\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/touhidapps.com\/learn\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/touhidapps.com\/learn\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/touhidapps.com\/learn\/wp-json\/wp\/v2\/comments?post=8446"}],"version-history":[{"count":29,"href":"https:\/\/touhidapps.com\/learn\/wp-json\/wp\/v2\/posts\/8446\/revisions"}],"predecessor-version":[{"id":8505,"href":"https:\/\/touhidapps.com\/learn\/wp-json\/wp\/v2\/posts\/8446\/revisions\/8505"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/touhidapps.com\/learn\/wp-json\/wp\/v2\/media\/8449"}],"wp:attachment":[{"href":"https:\/\/touhidapps.com\/learn\/wp-json\/wp\/v2\/media?parent=8446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/touhidapps.com\/learn\/wp-json\/wp\/v2\/categories?post=8446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/touhidapps.com\/learn\/wp-json\/wp\/v2\/tags?post=8446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}