{"id":31565,"date":"2025-10-11T09:41:14","date_gmt":"2025-10-11T06:41:14","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31565"},"modified":"2025-10-11T09:41:14","modified_gmt":"2025-10-11T06:41:14","slug":"android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/","title":{"rendered":"Android Uygulamalar\u0131n\u0131 Jenkins ile Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Android Uygulamalar\u0131n\u0131 Jenkins ile Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i mobil uygulama pazar\u0131nda, h\u0131zl\u0131 ve g\u00fcvenilir bir \u015fekilde uygulama geli\u015ftirmek ve da\u011f\u0131tmak, yaz\u0131l\u0131m geli\u015ftirme ekipleri i\u00e7in kritik \u00f6neme sahiptir. Android uygulamalar\u0131 geli\u015ftiren ekipler, kod yazma, derleme, test etme ve da\u011f\u0131tma gibi s\u00fcre\u00e7leri s\u00fcrekli olarak tekrarlamak zorundad\u0131r. Bu manuel s\u00fcre\u00e7ler, zaman al\u0131c\u0131 olman\u0131n yan\u0131 s\u0131ra hata yapma potansiyelini de art\u0131r\u0131r. \u0130\u015fte bu noktada S\u00fcrekli Entegrasyon (CI) ve S\u00fcrekli Da\u011f\u0131t\u0131m (CD) pratikleri devreye girer. CI\/CD, yaz\u0131l\u0131m geli\u015ftirme ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc otomatikle\u015ftirerek, geli\u015ftiricilerin daha h\u0131zl\u0131, daha g\u00fcvenilir ve daha verimli bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Jenkins, a\u00e7\u0131k kaynakl\u0131 ve geni\u015fletilebilir bir otomasyon sunucusu olarak, CI\/CD s\u00fcre\u00e7lerini uygulamak i\u00e7in en pop\u00fcler ara\u00e7lardan biridir. Esnek yap\u0131s\u0131, zengin eklenti ekosistemi ve geni\u015f topluluk deste\u011fi sayesinde Jenkins, Android uygulama geli\u015ftirme s\u00fcre\u00e7lerini otomatikle\u015ftirmek i\u00e7in ideal bir platform sunar. Bu makale, Jenkins kullanarak Android uygulamalar\u0131n\u0131 nas\u0131l derleyece\u011finizi, test edece\u011finizi ve da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klamay\u0131 hedeflemektedir. Ba\u015flang\u0131\u00e7 seviyesinden ileri seviyeye kadar t\u00fcm s\u00fcre\u00e7leri kapsayacak, b\u00f6ylece geli\u015ftirme ekipleriniz i\u00e7in sa\u011flam bir CI\/CD altyap\u0131s\u0131 kurabileceksiniz.<\/p>\n<h3>CI\/CD ve Jenkins Temelleri<\/h3>\n<p>S\u00fcrekli Entegrasyon (CI) ve S\u00fcrekli Da\u011f\u0131t\u0131m (CD) kavramlar\u0131, modern yaz\u0131l\u0131m geli\u015ftirmenin temel ta\u015flar\u0131d\u0131r. Bu pratikler, geli\u015ftirme s\u00fcre\u00e7lerini h\u0131zland\u0131rmak, hatalar\u0131 erken yakalamak ve yaz\u0131l\u0131m\u0131n kalitesini art\u0131rmak i\u00e7in tasarlanm\u0131\u015ft\u0131r.<\/p>\n<h4>S\u00fcrekli Entegrasyon (CI) Nedir?<\/h4>\n<p>S\u00fcrekli Entegrasyon (CI), geli\u015ftiricilerin kod de\u011fi\u015fikliklerini ana kod taban\u0131na d\u00fczenli olarak entegre etmelerini gerektiren bir yaz\u0131l\u0131m geli\u015ftirme prati\u011fidir. Her entegrasyon genellikle otomatik bir derleme ve bir dizi otomatik test ile do\u011frulan\u0131r. Bu, entegrasyon hatalar\u0131n\u0131 erken tespit etmeye ve \u00e7\u00f6zmeye yard\u0131mc\u0131 olur, b\u00f6ylece b\u00fcy\u00fck entegrasyon sorunlar\u0131n\u0131n \u00f6n\u00fcne ge\u00e7ilir. Android geli\u015ftirme ba\u011flam\u0131nda CI, her kod de\u011fi\u015fikli\u011finde uygulaman\u0131n derlenmesi, lint kontrollerinin yap\u0131lmas\u0131 ve birim testlerinin \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 anlam\u0131na gelir.<\/p>\n<h4>S\u00fcrekli Da\u011f\u0131t\u0131m (CD) Nedir?<\/h4>\n<p>S\u00fcrekli Da\u011f\u0131t\u0131m (CD), CI&#8217;n\u0131n bir uzant\u0131s\u0131d\u0131r ve yaz\u0131l\u0131m de\u011fi\u015fikliklerinin otomatik olarak test edildikten ve onayland\u0131ktan sonra \u00fcretim ortam\u0131na veya bir da\u011f\u0131t\u0131m kanal\u0131na (\u00f6rne\u011fin, Google Play Store, Firebase App Distribution) da\u011f\u0131t\u0131lmas\u0131 s\u00fcrecidir. S\u00fcrekli Teslimat (Continuous Delivery) ise, yaz\u0131l\u0131m\u0131n her zaman da\u011f\u0131t\u0131ma haz\u0131r olmas\u0131n\u0131 sa\u011flayan ancak manuel bir onay ad\u0131m\u0131 gerektirebilen benzer bir kavramd\u0131r. Bu makalede her ikisini de kapsayacak \u015fekilde &#8220;CD&#8221; terimini kullanaca\u011f\u0131z. Android i\u00e7in CD, test edilmi\u015f APK veya AAB dosyalar\u0131n\u0131n otomatik olarak hedef platformlara y\u00fcklenmesi anlam\u0131na gelir.<\/p>\n<h4>Jenkins Nedir ve Neden Android \u0130\u00e7in Uygundur?<\/h4>\n<p>Jenkins, Java ile yaz\u0131lm\u0131\u015f, a\u00e7\u0131k kaynakl\u0131 bir otomasyon sunucusudur. Yaz\u0131l\u0131m projelerinin derlenmesi, test edilmesi, da\u011f\u0131t\u0131lmas\u0131 ve di\u011fer otomasyon g\u00f6revlerini ger\u00e7ekle\u015ftirmek i\u00e7in kullan\u0131l\u0131r. Jenkins&#8217;in temel \u00f6zellikleri \u015funlard\u0131r:<\/p>\n<p>*   <strong>A\u00e7\u0131k Kaynak ve Geni\u015fletilebilir:<\/strong> Geni\u015f bir eklenti ekosistemine sahiptir, bu sayede hemen hemen her t\u00fcr geli\u015ftirme arac\u0131 ve platformuyla entegre olabilir.<br \/>\n*   <strong>Kullan\u0131c\u0131 Dostu Aray\u00fcz:<\/strong> Web tabanl\u0131 aray\u00fcz\u00fc sayesinde kolayca yap\u0131land\u0131r\u0131labilir ve y\u00f6netilebilir.<br \/>\n*   <strong>Da\u011f\u0131t\u0131lm\u0131\u015f Yap\u0131:<\/strong> Master-Agent mimarisi sayesinde i\u015f y\u00fck\u00fcn\u00fc birden fazla makineye da\u011f\u0131tabilir, bu da b\u00fcy\u00fck projelerde performans ve \u00f6l\u00e7eklenebilirlik sa\u011flar.<br \/>\n*   <strong>Pipeline (Boru Hatt\u0131) Deste\u011fi:<\/strong> Jenkins Pipeline, t\u00fcm CI\/CD s\u00fcrecini kod olarak tan\u0131mlaman\u0131za olanak tan\u0131r. Bu, s\u00fcre\u00e7lerin s\u00fcr\u00fcm kontrol\u00fc alt\u0131nda olmas\u0131n\u0131, tekrarlanabilirli\u011fini ve anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<p>Android geli\u015ftirme i\u00e7in Jenkins&#8217;in uygun olmas\u0131n\u0131n ba\u015fl\u0131ca nedenleri:<\/p>\n<p>*   <strong>Gradle Entegrasyonu:<\/strong> Android projeleri genellikle Gradle build sistemini kullan\u0131r. Jenkins, Gradle eklentisi ve shell komutlar\u0131 arac\u0131l\u0131\u011f\u0131yla Gradle komutlar\u0131n\u0131 kolayca \u00e7al\u0131\u015ft\u0131rabilir.<br \/>\n*   <strong>Ortam De\u011fi\u015fkenleri Y\u00f6netimi:<\/strong> Android SDK ve JDK yollar\u0131n\u0131 ortam de\u011fi\u015fkenleri olarak ayarlayarak tutarl\u0131 bir derleme ortam\u0131 sa\u011flar.<br \/>\n*   <strong>Kaynak Kodu Y\u00f6netimi (SCM) Entegrasyonu:<\/strong> Git, SVN gibi pop\u00fcler SCM ara\u00e7lar\u0131yla sorunsuz entegrasyon sunar.<br \/>\n*   <strong>Esnek Test ve Raporlama:<\/strong> Birim testleri, enstr\u00fcmantasyon testleri ve lint raporlar\u0131n\u0131 toplay\u0131p yay\u0131nlayabilir.<br \/>\n*   <strong>Artifact Y\u00f6netimi:<\/strong> Derlenmi\u015f APK ve AAB dosyalar\u0131n\u0131 otomatik olarak ar\u015fivleyebilir ve da\u011f\u0131t\u0131m i\u00e7in haz\u0131r hale getirebilir.<\/p>\n<h3>\u00d6n Ko\u015fullar ve Ortam Kurulumu<\/h3>\n<p>Jenkins ile Android uygulamalar\u0131n\u0131 derlemeye ba\u015flamadan \u00f6nce, uygun bir ortam\u0131n kurulmas\u0131 gerekmektedir. Bu b\u00f6l\u00fcm, Jenkins sunucusunun ve Android derleme ortam\u0131n\u0131n nas\u0131l kurulaca\u011f\u0131n\u0131 a\u00e7\u0131klar.<\/p>\n<h4>Jenkins Kurulumu<\/h4>\n<p>Jenkins&#8217;i kurmak i\u00e7in birka\u00e7 farkl\u0131 y\u00f6ntem bulunmaktad\u0131r. Genellikle bir Linux sunucusu \u00fczerinde kurulum tercih edilir, ancak Windows veya Docker konteyneri i\u00e7inde de \u00e7al\u0131\u015ft\u0131r\u0131labilir.<\/p>\n<p>1.  <strong>\u0130\u015fletim Sistemi Se\u00e7imi:<\/strong> Ubuntu, Debian gibi Linux da\u011f\u0131t\u0131mlar\u0131 veya Windows Server tercih edilebilir. Bu rehberde genel ad\u0131mlar anlat\u0131lacakt\u0131r.<br \/>\n2.  <strong>Java Development Kit (JDK) Kurulumu:<\/strong> Jenkins Java ile \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in bir JDK&#8217;ye ihtiya\u00e7 duyar. OpenJDK 11 veya \u00fcst\u00fc \u00f6nerilir.<br \/>\n    *   <strong>Linux (Ubuntu\/Debian \u00f6rne\u011fi):<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt update\n        sudo apt install openjdk-11-jdk<\/code><\/pre>\n<p>    *   <code>JAVA_HOME<\/code> ortam de\u011fi\u015fkenini ayarlad\u0131\u011f\u0131n\u0131zdan emin olun.<br \/>\n3.  <strong>Jenkins \u0130ndirme ve Kurulumu:<\/strong><br \/>\n    *   <strong>Linux (Debian tabanl\u0131 sistemler):<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo wget -O \/usr\/share\/keyrings\/jenkins-keyring.asc \\\n          https:\/\/pkg.jenkins.io\/debian-stable\/jenkins.io-2023.key\n        echo \"deb [signed-by=\/usr\/share\/keyrings\/jenkins-keyring.asc] \\\n          https:\/\/pkg.jenkins.io\/debian-stable binary\/\" | sudo tee \\\n          \/etc\/apt\/sources.list.d\/jenkins.list > \/dev\/null\n        sudo apt-get update\n        sudo apt-get install jenkins\n        sudo systemctl start jenkins\n        sudo systemctl enable jenkins<\/code><\/pre>\n<p>    *   Di\u011fer i\u015fletim sistemleri i\u00e7in Jenkins&#8217;in resmi web sitesindeki talimatlar\u0131 takip edebilirsiniz.<br \/>\n4.  <strong>\u0130lk Yap\u0131land\u0131rma:<\/strong><br \/>\n    *   Jenkins varsay\u0131lan olarak 8080 portunda \u00e7al\u0131\u015f\u0131r. Taray\u0131c\u0131n\u0131zdan <code>http:\/\/<sunucu_ip_adresi>:8080<\/code> adresine gidin.<br \/>\n    *   \u0130lk a\u00e7\u0131l\u0131\u015fta sizden bir y\u00f6netici \u015fifresi isteyecektir. Bu \u015fifreyi <code>\/var\/lib\/jenkins\/secrets\/initialAdminPassword<\/code> (Linux) veya <code>C:\\Program Files\\Jenkins\\secrets\\initialAdminPassword<\/code> (Windows) yolundaki dosyadan alabilirsiniz.<br \/>\n    *   &#8220;Install suggested plugins&#8221; se\u00e7ene\u011fini se\u00e7erek temel eklentileri kurun. Daha sonra Git, Gradle, Pipeline, Blue Ocean gibi eklentileri manuel olarak da kurabilirsiniz.<br \/>\n    *   Y\u00f6netici kullan\u0131c\u0131 olu\u015fturma ad\u0131mlar\u0131n\u0131 tamamlay\u0131n.<\/p>\n<h4>Android Geli\u015ftirme Ortam\u0131 Kurulumu (Jenkins Agent \u00fczerinde)<\/h4>\n<p>Jenkins, derleme i\u015flemlerini genellikle &#8220;agent&#8221; ad\u0131 verilen ayr\u0131 makinelerde \u00e7al\u0131\u015ft\u0131r\u0131r. Bu, Jenkins master sunucusunun kaynaklar\u0131n\u0131 serbest b\u0131rak\u0131r ve derleme ortamlar\u0131n\u0131 izole etmenizi sa\u011flar. Android derleme i\u00e7in bir Jenkins agent&#8217;\u0131na a\u015fa\u011f\u0131daki bile\u015fenlerin kurulmas\u0131 gerekir:<\/p>\n<p>1.  <strong>JDK Kurulumu:<\/strong> Android SDK&#8217;n\u0131n gerektirdi\u011fi bir JDK s\u00fcr\u00fcm\u00fcn\u00fc (genellikle OpenJDK 11 veya \u00fcst\u00fc) kurun. Bu, Jenkins master&#8217;daki JDK&#8217;den farkl\u0131 olabilir.<br \/>\n2.  <strong>Android SDK Kurulumu:<\/strong><br \/>\n    *   Android SDK&#8217;y\u0131 manuel olarak indirin veya <code>sdkmanager<\/code> komutunu kullanarak kurun.<br \/>\n    *   <strong>Linux:<\/strong><\/p>\n<pre><code class=\"language-bash\"># SDK Tools'u indirin\n        wget https:\/\/dl.google.com\/android\/repository\/commandlinetools-linux-X.zip\n        # \u0130ndirilen zip dosyas\u0131n\u0131 bir dizine a\u00e7\u0131n, \u00f6rne\u011fin \/opt\/android-sdk\n        sudo mkdir -p \/opt\/android-sdk\n        sudo unzip commandlinetools-linux-X.zip -d \/opt\/android-sdk\n        # tools dizini i\u00e7inde latest\/bin dizinini olu\u015fturun\n        sudo mv \/opt\/android-sdk\/cmdline-tools \/opt\/android-sdk\/cmdline-tools\/latest<\/code><\/pre>\n<p>    *   <strong>Ortam De\u011fi\u015fkenleri:<\/strong><br \/>\n        <code>ANDROID_HOME<\/code> ve <code>PATH<\/code> ortam de\u011fi\u015fkenlerini ayarlay\u0131n. Bu de\u011fi\u015fkenler Jenkins agent kullan\u0131c\u0131s\u0131n\u0131n ortam\u0131nda veya Jenkins global ara\u00e7 yap\u0131land\u0131rmas\u0131nda ayarlanmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-bash\">export ANDROID_HOME=\/opt\/android-sdk\n        export PATH=$PATH:$ANDROID_HOME\/cmdline-tools\/latest\/bin:$ANDROID_HOME\/platform-tools<\/code><\/pre>\n<p>    *   <strong>Gerekli SDK Bile\u015fenlerini Kurma:<\/strong> <code>sdkmanager<\/code> kullanarak gerekli platform ara\u00e7lar\u0131n\u0131, build ara\u00e7lar\u0131n\u0131 ve Android platformlar\u0131n\u0131 kurun.<\/p>\n<pre><code class=\"language-bash\">sdkmanager \"platform-tools\" \"build-tools;34.0.0\" \"platforms;android-34\" # Gerekli s\u00fcr\u00fcmleri belirtin<\/code><\/pre>\n<p>    *   <strong>SDK Lisans Anla\u015fmalar\u0131n\u0131 Kabul Etme:<\/strong> Bu ad\u0131m \u00e7ok \u00f6nemlidir, aksi takdirde derleme s\u0131ras\u0131nda hata al\u0131rs\u0131n\u0131z.<\/p>\n<pre><code class=\"language-bash\">yes | sdkmanager --licenses<\/code><\/pre>\n<p>3.  <strong>Gradle Kurulumu (\u0130ste\u011fe Ba\u011fl\u0131):<\/strong> Android projeleri genellikle Gradle Wrapper kulland\u0131\u011f\u0131 i\u00e7in manuel Gradle kurulumu genellikle gerekli de\u011fildir. Ancak, projenizde Gradle Wrapper yoksa veya belirli bir Gradle s\u00fcr\u00fcm\u00fcn\u00fc kullanman\u0131z gerekiyorsa, Gradle&#8217;\u0131 kurup <code>PATH<\/code>&#8216;e eklemeniz gerekebilir.<br \/>\n4.  <strong>Git Kurulumu:<\/strong> Kaynak kodunu \u00e7ekmek i\u00e7in Git kurulu olmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-bash\">sudo apt install git<\/code><\/pre>\n<h3>Basit Bir Android Projesi Olu\u015fturma (\u00d6rnek)<\/h3>\n<p>Jenkins ile derleme s\u00fcrecini g\u00f6stermek i\u00e7in basit bir Android projesine ihtiyac\u0131m\u0131z var. Android Studio kullanarak yeni bir &#8220;Empty Activity&#8221; projesi olu\u015fturabilir ve bu projeyi bir Git deposuna y\u00fckleyebilirsiniz.<\/p>\n<p>1.  <strong>Android Studio ile Proje Olu\u015fturma:<\/strong><br \/>\n    *   Android Studio&#8217;yu a\u00e7\u0131n.<br \/>\n    *   &#8220;New Project&#8221; se\u00e7ene\u011fini t\u0131klay\u0131n.<br \/>\n    *   &#8220;Empty Activity&#8221; \u015fablonunu se\u00e7in ve &#8220;Next&#8221;e t\u0131klay\u0131n.<br \/>\n    *   Uygulaman\u0131za bir isim verin (\u00f6rn. <code>JenkinsDemoApp<\/code>), paket ad\u0131n\u0131 ve kaydetme konumunu belirleyin. Minimum SDK s\u00fcr\u00fcm\u00fcn\u00fc ve dilini (Kotlin veya Java) se\u00e7in.<br \/>\n    *   &#8220;Finish&#8221;e t\u0131klay\u0131n.<br \/>\n2.  <strong>Projenin Git Deposuna Y\u00fcklenmesi:<\/strong><br \/>\n    *   Projenizi yerel bir Git deposuna ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">cd JenkinsDemoApp\n        git init\n        git add .\n        git commit -m \"Initial commit of Jenkins Demo App\"<\/code><\/pre>\n<p>    *   Projenizi GitHub, GitLab veya Bitbucket gibi uzak bir depoya y\u00fckleyin. \u00d6rne\u011fin, GitHub i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">git remote add origin https:\/\/github.com\/kullaniciadi\/JenkinsDemoApp.git\n        git branch -M main\n        git push -u origin main<\/code><\/pre>\n<p>Bu proje, temel <code>build.gradle<\/code> dosyalar\u0131na sahip olacak ve Jenkins&#8217;in derleme komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmas\u0131 i\u00e7in haz\u0131r olacakt\u0131r.<\/p>\n<h3>Jenkins ile \u0130lk Android Build \u0130\u015flemi<\/h3>\n<p>Art\u0131k Jenkins sunucunuz ve Android derleme ortam\u0131n\u0131z haz\u0131r oldu\u011funa g\u00f6re, ilk Android build i\u015flemini olu\u015fturabiliriz. Bu b\u00f6l\u00fcmde, &#8220;Freestyle project&#8221; kullanarak basit bir derleme i\u015flemi yap\u0131land\u0131raca\u011f\u0131z.<\/p>\n<p>1.  <strong>Yeni Bir Jenkins \u0130\u015flemi Olu\u015fturma:<\/strong><br \/>\n    *   Jenkins paneline giri\u015f yap\u0131n.<br \/>\n    *   Sol men\u00fcden &#8220;New Item&#8221; veya &#8220;Yeni \u00d6\u011fe&#8221; se\u00e7ene\u011fine t\u0131klay\u0131n.<br \/>\n    *   \u00d6\u011feye bir isim verin (\u00f6rn. <code>Android-JenkinsDemoApp-Freestyle<\/code>).<br \/>\n    *   &#8220;Freestyle project&#8221; veya &#8220;Serbest Stil Proje&#8221; se\u00e7ene\u011fini se\u00e7in ve &#8220;OK&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n.<\/p>\n<p>2.  <strong>Genel Ayarlar:<\/strong><br \/>\n    *   &#8220;General&#8221; sekmesinde, projeniz i\u00e7in k\u0131sa bir a\u00e7\u0131klama girebilirsiniz.<br \/>\n    *   &#8220;Restrict where this project can be run&#8221; se\u00e7ene\u011fini i\u015faretleyerek, bu i\u015fin yaln\u0131zca Android SDK&#8217;n\u0131n kurulu oldu\u011fu Jenkins agent&#8217;\u0131 \u00fczerinde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayabilirsiniz. Agent&#8217;\u0131n\u0131za bir etiket (label) verip buraya yaz\u0131n (\u00f6rn. <code>android-agent<\/code>).<\/p>\n<p>3.  <strong>Kaynak Kodu Y\u00f6netimi (SCM):<\/strong><br \/>\n    *   &#8220;Source Code Management&#8221; b\u00f6l\u00fcm\u00fcnde &#8220;Git&#8221; se\u00e7ene\u011fini i\u015faretleyin.<br \/>\n    *   &#8220;Repository URL&#8221; alan\u0131na Android projenizin Git deposu URL&#8217;sini yap\u0131\u015ft\u0131r\u0131n (\u00f6rn. <code>https:\/\/github.com\/kullaniciadi\/JenkinsDemoApp.git<\/code>).<br \/>\n    *   E\u011fer depo \u00f6zel ise, &#8220;Credentials&#8221; a\u00e7\u0131l\u0131r men\u00fcs\u00fcnden kimlik bilgilerinizi ekleyin. &#8220;Add&#8221; -> &#8220;Jenkins&#8221; se\u00e7ene\u011fiyle &#8220;Username with password&#8221; veya &#8220;SSH Username with private key&#8221; ekleyebilirsiniz.<br \/>\n    <em>   &#8220;Branches to build&#8221; b\u00f6l\u00fcm\u00fcnde <code><\/em>\/main<\/code> veya <code>*\/master<\/code> gibi derlemek istedi\u011finiz branch&#8217;i belirtin.<\/p>\n<p>4.  <strong>Build Tetikleyicileri:<\/strong><br \/>\n    *   &#8220;Build Triggers&#8221; b\u00f6l\u00fcm\u00fcnde, derlemenin ne zaman tetiklenece\u011fini belirleyebilirsiniz:<br \/>\n        <em>   <strong>Poll SCM:<\/strong> Belirli aral\u0131klarla SCM&#8217;yi kontrol eder ve de\u011fi\u015fiklik varsa derlemeyi ba\u015flat\u0131r. \u00d6rne\u011fin, <code>H\/15 <\/em> <em> <\/em> *<\/code> her 15 dakikada bir kontrol eder.<br \/>\n        *   <strong>GitHub hook trigger for GITScm polling:<\/strong> GitHub webhooks ile entegrasyon i\u00e7in kullan\u0131l\u0131r. Git deposunda bir <code>push<\/code> olay\u0131 oldu\u011funda derlemeyi otomatik olarak ba\u015flat\u0131r. Bu, daha verimli bir yakla\u015f\u0131md\u0131r.<\/p>\n<p>5.  <strong>Build Ad\u0131mlar\u0131 (Execute Shell\/Batch Command):<\/strong><br \/>\n    *   &#8220;Build Steps&#8221; b\u00f6l\u00fcm\u00fcnde &#8220;Add build step&#8221; -> &#8220;Execute shell&#8221; (Linux\/macOS) veya &#8220;Execute Windows batch command&#8221; (Windows) se\u00e7ene\u011fini se\u00e7in.<br \/>\n    *   Android projenizi derlemek i\u00e7in Gradle Wrapper kullanaca\u011f\u0131z. Projenizin k\u00f6k dizininde <code>gradlew<\/code> (Linux\/macOS) veya <code>gradlew.bat<\/code> (Windows) beti\u011fi bulunur.<br \/>\n    *   <strong>Temizleme ve Hata Ay\u0131klama APK&#8217;s\u0131 Derleme:<\/strong><\/p>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n        export ANDROID_HOME=\/opt\/android-sdk # Jenkins agent'\u0131n\u0131zdaki SDK yolu\n        export PATH=$PATH:$ANDROID_HOME\/cmdline-tools\/latest\/bin:$ANDROID_HOME\/platform-tools\n\n        .\/gradlew clean assembleDebug<\/code><\/pre>\n<p>        *   <code>export ANDROID_HOME<\/code> ve <code>export PATH<\/code> sat\u0131rlar\u0131, Jenkins&#8217;in do\u011fru SDK&#8217;y\u0131 bulmas\u0131n\u0131 sa\u011flar. Bu de\u011fi\u015fkenler Jenkins global yap\u0131land\u0131rmas\u0131nda da ayarlanabilir.<br \/>\n        *   <code>clean<\/code> g\u00f6revi \u00f6nceki derleme \u00e7\u0131kt\u0131lar\u0131n\u0131 temizler.<br \/>\n        *   <code>assembleDebug<\/code> g\u00f6revi, hata ay\u0131klama (debug) APK&#8217;s\u0131n\u0131 derler.<\/p>\n<p>6.  <strong>Post-Build Ad\u0131mlar\u0131:<\/strong><br \/>\n    *   &#8220;Post-build Actions&#8221; b\u00f6l\u00fcm\u00fcnde &#8220;Add post-build action&#8221; se\u00e7ene\u011fini se\u00e7in:<br \/>\n        *   <strong>Archive the artifacts:<\/strong> Derlenmi\u015f APK dosyas\u0131n\u0131 Jenkins&#8217;in derleme ge\u00e7mi\u015finde saklamak i\u00e7in kullan\u0131l\u0131r.<br \/>\n            <em>   &#8220;Files to archive&#8221; alan\u0131na <code>app\/build\/outputs\/apk\/debug\/<\/em>.apk<\/code> yaz\u0131n. Bu, derlenen t\u00fcm debug APK dosyalar\u0131n\u0131 ar\u015fivleyecektir.<br \/>\n        *   <strong>E-mail Notification:<\/strong> Derlemenin ba\u015far\u0131l\u0131 veya ba\u015far\u0131s\u0131z olmas\u0131 durumunda e-posta bildirimi g\u00f6ndermek i\u00e7in yap\u0131land\u0131r\u0131labilir.<\/p>\n<p>7.  <strong>Kaydet ve \u00c7al\u0131\u015ft\u0131r:<\/strong><br \/>\n    *   &#8220;Save&#8221; d\u00fc\u011fmesine t\u0131klayarak i\u015fi kaydedin.<br \/>\n    *   Sol men\u00fcden &#8220;Build Now&#8221; veya &#8220;\u015eimdi Olu\u015ftur&#8221; se\u00e7ene\u011fine t\u0131klayarak ilk derlemeyi ba\u015flat\u0131n.<br \/>\n    *   Derleme ba\u015flad\u0131ktan sonra, &#8220;Build History&#8221; b\u00f6l\u00fcm\u00fcndeki derleme numaras\u0131n\u0131n yan\u0131ndaki oka t\u0131klay\u0131p &#8220;Console Output&#8221; se\u00e7ene\u011fini se\u00e7erek derleme loglar\u0131n\u0131 takip edebilirsiniz.<\/p>\n<p>Ba\u015far\u0131l\u0131 bir derleme sonucunda, ar\u015fivlenmi\u015f APK dosyas\u0131n\u0131 derleme sayfas\u0131nda &#8220;Artifacts&#8221; b\u00f6l\u00fcm\u00fcnde bulabilirsiniz.<\/p>\n<h3>Geli\u015fmi\u015f Jenkins Pipeline ile Android Build<\/h3>\n<p>Freestyle projeler basit derlemeler i\u00e7in yeterli olsa da, daha karma\u015f\u0131k CI\/CD s\u00fcre\u00e7leri, s\u00fcr\u00fcm kontrol\u00fc alt\u0131nda tutulabilirlik ve daha iyi y\u00f6netilebilirlik i\u00e7in Jenkins Pipeline tercih edilir. Pipeline, t\u00fcm derleme s\u00fcrecini bir <code>Jenkinsfile<\/code> i\u00e7inde kod olarak tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<h4>Neden Pipeline?<\/h4>\n<p>*   <strong>Kod Olarak Altyap\u0131 (Infrastructure as Code):<\/strong> CI\/CD s\u00fcrecinizi kod olarak tan\u0131mlars\u0131n\u0131z, bu da s\u00fcr\u00fcm kontrol\u00fc alt\u0131nda tutulmas\u0131n\u0131, tekrarlanabilirli\u011fini ve payla\u015f\u0131labilirli\u011fini sa\u011flar.<br \/>\n*   <strong>S\u00fcr\u00fcm Kontrol\u00fc:<\/strong> <code>Jenkinsfile<\/code> projenizin kaynak koduyla birlikte Git deposunda saklan\u0131r. Bu, derleme s\u00fcrecinin kendisinin de s\u00fcr\u00fcm kontrol\u00fc alt\u0131nda oldu\u011fu anlam\u0131na gelir.<br \/>\n*   <strong>Esneklik ve Geni\u015fletilebilirlik:<\/strong> Daha karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131, paralel ad\u0131mlar, ko\u015fullu mant\u0131k ve manuel onay ad\u0131mlar\u0131 kolayca tan\u0131mlanabilir.<br \/>\n*   <strong>Okunabilirlik:<\/strong> S\u00fcre\u00e7, a\u015famal\u0131 (stages) bir yap\u0131da tan\u0131mland\u0131\u011f\u0131 i\u00e7in daha anla\u015f\u0131l\u0131r ve takip edilebilir olur.<\/p>\n<h4>Jenkinsfile Olu\u015fturma<\/h4>\n<p><code>Jenkinsfile<\/code>, projenizin k\u00f6k dizinine yerle\u015ftirilen bir metin dosyas\u0131d\u0131r. \u0130ki ana Pipeline syntax&#8217;\u0131 vard\u0131r: Declarative (bildirimsel) ve Scripted (betiksel). Declarative Pipeline daha modern ve okunabilir oldu\u011fu i\u00e7in genellikle tercih edilir.<\/p>\n<p><strong>\u00d6rnek Bir Jenkinsfile:<\/strong><\/p>\n<p>A\u015fa\u011f\u0131da, bir Android projesi i\u00e7in tipik bir Declarative Pipeline \u00f6rne\u011fi verilmi\u015ftir. Bu \u00f6rnek, ortam kurulumu, testler, derleme ve ar\u015fivleme ad\u0131mlar\u0131n\u0131 i\u00e7erir.<\/p>\n<pre><code class=\"language-groovy\">\/\/ Jenkinsfile\npipeline {\n    agent { label 'android-agent' } \/\/ Bu pipeline'\u0131n \u00e7al\u0131\u015faca\u011f\u0131 Jenkins agent'\u0131n\u0131 belirtir\n\n    environment {\n        \/\/ Android SDK ve Java yollar\u0131n\u0131 burada tan\u0131mlay\u0131n\n        \/\/ Bu yollar Jenkins agent'\u0131n\u0131zdaki ger\u00e7ek yollarla e\u015fle\u015fmelidir\n        ANDROID_HOME = '\/opt\/android-sdk'\n        JAVA_HOME = '\/usr\/lib\/jvm\/java-11-openjdk-amd64' \/\/ Veya agent'\u0131n\u0131zdaki JDK yolu\n        PATH = \"${ANDROID_HOME}\/cmdline-tools\/latest\/bin:${ANDROID_HOME}\/platform-tools:${JAVA_HOME}\/bin:${PATH}\"\n    }\n\n    stages {\n        stage('Checkout') {\n            steps {\n                echo 'Checking out source code...'\n                git branch: 'main', credentialsId: 'github-credentials', url: 'https:\/\/github.com\/kullaniciadi\/JenkinsDemoApp.git'\n                \/\/ 'github-credentials' Jenkins Credentials'da tan\u0131mlanm\u0131\u015f olmal\u0131d\u0131r.\n                \/\/ E\u011fer depo public ise credentialsId sat\u0131r\u0131 kald\u0131r\u0131labilir.\n            }\n        }\n\n        stage('Environment Setup') {\n            steps {\n                echo 'Setting up Android environment...'\n                \/\/ SDK lisanslar\u0131n\u0131 kabul etme (e\u011fer daha \u00f6nce yap\u0131lmad\u0131ysa)\n                sh 'yes | sdkmanager --licenses'\n            }\n        }\n\n        stage('Lint and Static Analysis') {\n            steps {\n                echo 'Running Android Lint...'\n                sh '.\/gradlew lintDebug'\n                \/\/ Lint raporlar\u0131n\u0131 ar\u015fivle\n                archiveArtifacts artifacts: 'app\/build\/reports\/lint-results-debug.xml', fingerprint: true\n            }\n        }\n\n        stage('Unit Tests') {\n            steps {\n                echo 'Running Unit Tests...'\n                sh '.\/gradlew testDebugUnitTest'\n                \/\/ Test raporlar\u0131n\u0131 yay\u0131nla\n                junit 'app\/build\/test-results\/testDebugUnitTest\/*.xml'\n            }\n        }\n\n        stage('Build Debug APK') {\n            steps {\n                echo 'Building Debug APK...'\n                sh '.\/gradlew assembleDebug'\n            }\n        }\n\n        stage('Build Release AAB (Signed)') {\n            \/\/ Bu a\u015fama i\u00e7in imzalama bilgileri Jenkins Credentials'da saklanmal\u0131\n            \/\/ ve build.gradle dosyas\u0131na g\u00fcvenli bir \u015fekilde aktar\u0131lmal\u0131d\u0131r.\n            \/\/ \u00d6rnek: Jenkins Credentials'da 'KEYSTORE_PASSWORD', 'KEY_ALIAS' ve 'KEY_PASSWORD' ad\u0131nda Secret Text tan\u0131mlay\u0131n.\n            \/\/ build.gradle (app\/build.gradle) dosyan\u0131zda imzalama blo\u011fu \u015f\u00f6yle olabilir:\n            \/*\n            android {\n                ...\n                signingConfigs {\n                    release {\n                        storeFile file(System.getenv(\"KEYSTORE_PATH\") ?: \"keystore.jks\") \/\/ Keystore dosyas\u0131n\u0131n yolu\n                        storePassword System.getenv(\"KEYSTORE_PASSWORD\") ?: \"default_store_password\"\n                        keyAlias System.getenv(\"KEY_ALIAS\") ?: \"default_key_alias\"\n                        keyPassword System.getenv(\"KEY_PASSWORD\") ?: \"default_key_password\"\n                    }\n                }\n                buildTypes {\n                    release {\n                        ...\n                        signingConfig signingConfigs.release\n                    }\n                }\n            }\n            *\/\n            \/\/ Keystore dosyas\u0131n\u0131 Jenkins agent'\u0131na g\u00fcvenli bir \u015fekilde aktarmak gereklidir.\n            \/\/ Bu genellikle Jenkins Credentials ile File tipi secret olarak veya agent'ta sabit bir konumda tutularak yap\u0131l\u0131r.\n\n            when {\n                \/\/ Sadece 'main' branch'inde bu a\u015famay\u0131 \u00e7al\u0131\u015ft\u0131r\n                branch 'main'\n            }\n            steps {\n                echo 'Building Signed Release AAB...'\n                withCredentials([\n                    file(credentialsId: 'android-keystore-file', variable: 'KEYSTORE_PATH'), \/\/ Keystore dosyas\u0131n\u0131 ba\u011fla\n                    string(credentialsId: 'KEYSTORE_PASSWORD', variable: 'KEYSTORE_PASSWORD'),\n                    string(credentialsId: 'KEY_ALIAS', variable: 'KEY_ALIAS'),\n                    string(credentialsId: 'KEY_PASSWORD', variable: 'KEY_PASSWORD')\n                ]) {\n                    sh '.\/gradlew bundleRelease'\n                }\n            }\n        }\n\n        stage('Archive Artifacts') {\n            steps {\n                echo 'Archiving build artifacts...'\n                archiveArtifacts artifacts: 'app\/build\/outputs\/apk\/debug\/<em>.apk, app\/build\/outputs\/bundle\/release\/<\/em>.aab', fingerprint: true\n            }\n        }\n\n        stage('Deploy to Firebase App Distribution') {\n            when {\n                \/\/ Sadece 'main' branch'inde ve ba\u015far\u0131l\u0131 buildlerde da\u011f\u0131t\n                branch 'main'\n                expression { currentBuild.currentResult == 'SUCCESS' }\n            }\n            steps {\n                echo 'Deploying to Firebase App Distribution...'\n                \/\/ Firebase App Distribution eklentisi veya fastlane ile entegrasyon\n                \/\/ \u00d6rnek: fastlane kullan\u0131yorsan\u0131z\n                \/\/ sh 'bundle install && bundle exec fastlane firebase_distribute'\n                \/\/ Veya Firebase CLI do\u011frudan:\n                \/\/ sh \"firebase appdistribution:distribute app\/build\/outputs\/bundle\/release\/*.aab --app <your-app-id> --release-notes 'New build from Jenkins' --groups 'testers'\"\n                \/\/ Firebase CLI i\u00e7in 'FIREBASE_TOKEN' ortam de\u011fi\u015fkeni veya Jenkins Credentials ile kimlik do\u011frulama gerekir.\n            }\n        }\n    }\n\n    post {\n        always {\n            echo 'Pipeline finished.'\n            \/\/ Temizleme i\u015flemleri\n            sh 'rm -rf build'\n        }\n        success {\n            echo 'Build successful! Sending notifications...'\n            \/\/ Ba\u015far\u0131l\u0131 bildirimler (e-posta, Slack vb.)\n            \/\/ mail to: 'dev@example.com', subject: \"Android Build SUCCESS: ${env.JOB_NAME} #${env.BUILD_NUMBER}\"\n        }\n        failure {\n            echo 'Build failed! Sending notifications...'\n            \/\/ Ba\u015far\u0131s\u0131z bildirimler\n            \/\/ mail to: 'dev@example.com', subject: \"Android Build FAILED: ${env.JOB_NAME} #${env.BUILD_NUMBER}\"\n        }\n    }\n}<\/code><\/pre>\n<h4>Jenkins \u0130\u015flemi Yap\u0131land\u0131rmas\u0131 (Pipeline projesi)<\/h4>\n<p>1.  <strong>Yeni Bir Jenkins \u0130\u015flemi Olu\u015fturma:<\/strong><br \/>\n    *   Jenkins paneline giri\u015f yap\u0131n.<br \/>\n    *   &#8220;New Item&#8221; se\u00e7ene\u011fine t\u0131klay\u0131n.<br \/>\n    *   \u00d6\u011feye bir isim verin (\u00f6rn. <code>Android-JenkinsDemoApp-Pipeline<\/code>).<br \/>\n    *   &#8220;Pipeline&#8221; se\u00e7ene\u011fini se\u00e7in ve &#8220;OK&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n2.  <strong>Genel Ayarlar:<\/strong><br \/>\n    *   A\u00e7\u0131klama girin.<br \/>\n    *   &#8220;Restrict where this project can be run&#8221; se\u00e7ene\u011fini i\u015faretleyerek <code>android-agent<\/code> etiketini kullan\u0131n.<br \/>\n3.  <strong>Pipeline Tan\u0131m\u0131:<\/strong><br \/>\n    *   &#8220;Pipeline&#8221; b\u00f6l\u00fcm\u00fcne gidin.<br \/>\n    *   &#8220;Definition&#8221; a\u00e7\u0131l\u0131r men\u00fcs\u00fcnden &#8220;Pipeline script from SCM&#8221; se\u00e7ene\u011fini se\u00e7in.<br \/>\n    *   &#8220;SCM&#8221; olarak &#8220;Git&#8221;i se\u00e7in.<br \/>\n    *   &#8220;Repository URL&#8221; ve &#8220;Credentials&#8221; bilgilerini Freestyle projesindeki gibi doldurun.<br \/>\n    <em>   &#8220;Branches to build&#8221; k\u0131sm\u0131na <code><\/em>\/main<\/code> yaz\u0131n.<br \/>\n    *   &#8220;Script Path&#8221; alan\u0131na <code>Jenkinsfile<\/code> yaz\u0131n (e\u011fer <code>Jenkinsfile<\/code> projenizin k\u00f6k dizininde ise). Farkl\u0131 bir yolda ise, o yolu belirtin (\u00f6rn. <code>jenkins\/Jenkinsfile<\/code>).<br \/>\n4.  <strong>Kaydet ve \u00c7al\u0131\u015ft\u0131r:<\/strong><br \/>\n    *   &#8220;Save&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n    *   &#8220;Build Now&#8221; ile pipeline&#8217;\u0131 ba\u015flat\u0131n.<br \/>\n    *   &#8220;Pipeline Stage View&#8221; veya &#8220;Blue Ocean&#8221; aray\u00fcz\u00fc sayesinde pipeline&#8217;\u0131n a\u015famalar\u0131n\u0131 g\u00f6rsel olarak takip edebilirsiniz.<\/p>\n<p><strong>Keystore Y\u00f6netimi:<\/strong> Release APK\/AAB imzalama i\u00e7in Keystore dosyas\u0131n\u0131n ve \u015fifrelerinin g\u00fcvenli bir \u015fekilde y\u00f6netilmesi kritik \u00f6neme sahiptir. Jenkins Credentials Manager, bu bilgileri g\u00fcvenli bir \u015fekilde saklamak i\u00e7in kullan\u0131l\u0131r. <code>withCredentials<\/code> blo\u011fu, bu bilgileri pipeline ad\u0131mlar\u0131na ortam de\u011fi\u015fkenleri olarak enjekte etmenin g\u00fcvenli bir yoludur. Keystore dosyas\u0131n\u0131 Jenkins agent&#8217;\u0131na g\u00fcvenli bir \u015fekilde aktarmak i\u00e7in Jenkins File Credential tipi kullan\u0131labilir veya dosya agent&#8217;ta sabit bir yolda tutulup yolu <code>Jenkinsfile<\/code> i\u00e7inde belirtilebilir.<\/p>\n<h3>Ek Entegrasyonlar ve \u0130pu\u00e7lar\u0131<\/h3>\n<p>Jenkins ve Android CI\/CD s\u00fcrecinizi daha da g\u00fc\u00e7lendirmek i\u00e7in \u00e7e\u015fitli ek entegrasyonlar ve optimizasyonlar yapabilirsiniz.<\/p>\n<h4>Test Otomasyonu<\/h4>\n<p>*   <strong>Unit Testler:<\/strong> <code>gradlew test<\/code> komutuyla \u00e7al\u0131\u015ft\u0131r\u0131lan birim testler, h\u0131zl\u0131 geri bildirim sa\u011flar ve hatalar\u0131 erken yakalar. Jenkins Pipeline&#8217;da <code>junit<\/code> ad\u0131m\u0131yla test raporlar\u0131n\u0131 yay\u0131nlayabilirsiniz.<\/p>\n<pre><code class=\"language-groovy\">junit 'app\/build\/test-results\/testDebugUnitTest\/*.xml'<\/code><\/pre>\n<p>*   <strong>Enstr\u00fcmantasyon Testleri:<\/strong> UI testleri (\u00f6rne\u011fin Espresso) gibi enstr\u00fcmantasyon testleri, ger\u00e7ek bir cihaz veya em\u00fclat\u00f6r \u00fczerinde \u00e7al\u0131\u015ft\u0131r\u0131lmal\u0131d\u0131r. Jenkins agent&#8217;\u0131nda bir Android em\u00fclat\u00f6r\u00fcn\u00fc ba\u015flatmak veya fiziksel cihazlara ba\u011flanmak daha karma\u015f\u0131k olabilir. AVD (Android Virtual Device) Manager ile Jenkins agent&#8217;\u0131nda sanal cihaz olu\u015fturup ba\u015flatabilir ve <code>gradlew connectedDebugAndroidTest<\/code> komutuyla testleri \u00e7al\u0131\u015ft\u0131rabilirsiniz. Bu genellikle daha fazla kaynak gerektirir.<\/p>\n<h4>Kod Kalitesi Ara\u00e7lar\u0131<\/h4>\n<p>*   <strong>Android Lint:<\/strong> Android Lint, kodunuzdaki potansiyel hatalar\u0131 ve stil sorunlar\u0131n\u0131 bulur. <code>gradlew lintDebug<\/code> komutuyla \u00e7al\u0131\u015ft\u0131r\u0131labilir ve raporlar\u0131 ar\u015fivlenebilir.<br \/>\n*   <strong>Detekt \/ SonarQube:<\/strong> Detekt (Kotlin i\u00e7in) veya SonarQube gibi statik analiz ara\u00e7lar\u0131, kod kalitesini art\u0131rmak i\u00e7in daha derinlemesine analizler sunar. Jenkins eklentileri arac\u0131l\u0131\u011f\u0131yla veya do\u011frudan komut sat\u0131r\u0131ndan entegre edilebilirler.<\/p>\n<h4>Bildirimler<\/h4>\n<p>*   <strong>E-posta:<\/strong> Jenkins&#8217;in yerle\u015fik e-posta bildirimleri eklentisi ile derleme durumu hakk\u0131nda ekiplere otomatik e-postalar g\u00f6nderebilirsiniz.<br \/>\n*   <strong>Slack\/Microsoft Teams:<\/strong> Pop\u00fcler mesajla\u015fma platformlar\u0131 i\u00e7in Jenkins eklentileri bulunur. Derleme durumunu, ba\u011flant\u0131lar\u0131 ve di\u011fer bilgileri do\u011frudan ilgili kanallara g\u00f6nderebilirsiniz.<\/p>\n<h4>G\u00fcvenlik<\/h4>\n<p>*   <strong>Keystore Y\u00f6netimi:<\/strong> Release derlemeleri i\u00e7in kullan\u0131lan Keystore dosyalar\u0131 ve \u015fifreleri, asla do\u011frudan <code>Jenkinsfile<\/code> i\u00e7ine veya Git deposuna eklenmemelidir. Jenkins Credentials Manager, bu hassas bilgileri g\u00fcvenli bir \u015fekilde saklamak i\u00e7in en iyi \u00e7\u00f6z\u00fcmd\u00fcr.<br \/>\n*   <strong>Ortam De\u011fi\u015fkenleri:<\/strong> Hassas bilgiler (API anahtarlar\u0131, token&#8217;lar) do\u011frudan <code>Jenkinsfile<\/code> i\u00e7inde tan\u0131mlanmamal\u0131, bunun yerine Jenkins Credentials veya ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla g\u00fcvenli bir \u015fekilde enjekte edilmelidir.<br \/>\n*   <strong>Kullan\u0131c\u0131 ve Rol Y\u00f6netimi:<\/strong> Jenkins&#8217;in kendi kullan\u0131c\u0131 ve rol tabanl\u0131 yetkilendirme sistemi vard\u0131r. Hangi kullan\u0131c\u0131n\u0131n hangi i\u015fleri yap\u0131land\u0131rabilece\u011fini veya \u00e7al\u0131\u015ft\u0131rabilece\u011fini k\u0131s\u0131tlayarak g\u00fcvenli\u011fi art\u0131rabilirsiniz.<\/p>\n<h4>Docker ile Jenkins Agent<\/h4>\n<p>*   <strong>Tutarl\u0131 Ortamlar:<\/strong> Docker konteynerleri kullanarak Jenkins agent&#8217;lar\u0131 i\u00e7in tutarl\u0131 ve izole derleme ortamlar\u0131 olu\u015fturabilirsiniz. Android SDK, JDK ve di\u011fer t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 i\u00e7eren bir Docker imaj\u0131 olu\u015fturarak, her derleme i\u00e7in ayn\u0131 ortam\u0131 garanti edersiniz.<br \/>\n*   <strong>Dockerfile \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-dockerfile\">FROM openjdk:11-jdk\n\n    ENV ANDROID_SDK_ROOT \/opt\/android-sdk\n    ENV PATH $PATH:$ANDROID_SDK_ROOT\/cmdline-tools\/latest\/bin:$ANDROID_SDK_ROOT\/platform-tools\n\n    # Install Android SDK Command-line Tools\n    RUN mkdir -p ${ANDROID_SDK_ROOT}\/cmdline-tools && \\\n        wget -q https:\/\/dl.google.com\/android\/repository\/commandlinetools-linux-X.zip -O android-sdk-tools.zip && \\\n        unzip -q android-sdk-tools.zip -d ${ANDROID_SDK_ROOT}\/cmdline-tools && \\\n        mv ${ANDROID_SDK_ROOT}\/cmdline-tools\/cmdline-tools ${ANDROID_SDK_ROOT}\/cmdline-tools\/latest && \\\n        rm android-sdk-tools.zip\n\n    # Accept Android SDK licenses\n    RUN yes | sdkmanager --licenses\n\n    # Install necessary SDK components\n    RUN sdkmanager \"platform-tools\" \"build-tools;34.0.0\" \"platforms;android-34\"\n\n    # Install Git\n    RUN apt-get update && apt-get install -y git\n\n    # Set working directory\n    WORKDIR \/home\/jenkins<\/code><\/pre>\n<p>    Bu Dockerfile ile bir imaj olu\u015fturup Jenkins&#8217;in Docker eklentisi veya Kubernetes eklentisi ile dinamik olarak agent&#8217;lar sa\u011flayabilirsiniz.<\/p>\n<h4>Performans Optimizasyonu<\/h4>\n<p>*   <strong>Paralel Build Ad\u0131mlar\u0131:<\/strong> Jenkins Pipeline, farkl\u0131 derleme a\u015famalar\u0131n\u0131 (\u00f6rn. birim testleri ve lint analizi) paralel olarak \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r, bu da toplam derleme s\u00fcresini azalt\u0131r.<br \/>\n*   <strong>Gradle \u00d6nbellekleme:<\/strong> Gradle, derleme performans\u0131n\u0131 art\u0131rmak i\u00e7in \u00f6nbellekleme kullan\u0131r. Jenkins agent&#8217;\u0131nda Gradle \u00f6nbelle\u011fini koruyarak veya Docker volume&#8217;lar\u0131n\u0131 kullanarak \u00f6nbelle\u011fi kal\u0131c\u0131 hale getirebilirsiniz.<br \/>\n*   <strong>Jenkins Agent Kaynaklar\u0131:<\/strong> Jenkins agent&#8217;lar\u0131n\u0131n yeterli CPU, RAM ve disk alan\u0131na sahip oldu\u011fundan emin olun. \u00d6zellikle b\u00fcy\u00fck Android projeleri ve enstr\u00fcmantasyon testleri i\u00e7in yeterli kaynaklar kritik \u00f6neme sahiptir.<\/p>\n<h3>Sorun Giderme ve Yayg\u0131n Hatalar<\/h3>\n<p>Jenkins ile Android derleme s\u00fcre\u00e7lerinde kar\u015f\u0131la\u015fabilece\u011finiz baz\u0131 yayg\u0131n sorunlar ve \u00e7\u00f6z\u00fcmleri:<\/p>\n<p>*   <strong><code>JAVA_HOME<\/code> veya <code>ANDROID_HOME<\/code> Sorunlar\u0131:<\/strong> En s\u0131k kar\u015f\u0131la\u015f\u0131lan sorunlardan biridir. Bu ortam de\u011fi\u015fkenlerinin Jenkins agent&#8217;\u0131nda do\u011fru \u015fekilde ayarland\u0131\u011f\u0131ndan ve Jenkins kullan\u0131c\u0131s\u0131n\u0131n eri\u015febildi\u011finden emin olun. <code>echo $JAVA_HOME<\/code> veya <code>echo $ANDROID_HOME<\/code> komutlar\u0131n\u0131 Jenkins shell ad\u0131m\u0131nda \u00e7al\u0131\u015ft\u0131rarak do\u011frulayabilirsiniz.<br \/>\n*   <strong>SDK Lisans Kabul\u00fc Hatalar\u0131:<\/strong> <code>Failed to install the following Android SDK components<\/code> veya <code>You have not accepted the license agreements<\/code> gibi hatalar al\u0131yorsan\u0131z, <code>yes | sdkmanager --licenses<\/code> komutunu Jenkins agent&#8217;\u0131nda \u00e7al\u0131\u015ft\u0131rmay\u0131 unutmu\u015fsunuz demektir.<br \/>\n*   <strong>Gradle Daemon Sorunlar\u0131:<\/strong> Gradle daemon, derleme s\u00fcrelerini h\u0131zland\u0131rmak i\u00e7in arka planda \u00e7al\u0131\u015f\u0131r. Bazen tak\u0131labilir veya bellek sorunlar\u0131 ya\u015fayabilir. <code>gradlew --stop<\/code> komutuyla daemon&#8217;u durdurup tekrar deneyebilirsiniz.<br \/>\n*   <strong>Bellek Yetersizli\u011fi:<\/strong> \u00d6zellikle b\u00fcy\u00fck projelerde veya testler \u00e7al\u0131\u015ft\u0131r\u0131l\u0131rken Jenkins agent&#8217;\u0131 veya Gradle i\u015flemi bellek yetersizli\u011fi ya\u015fayabilir. JVM&#8217;ye daha fazla bellek ay\u0131rmak i\u00e7in <code>_JAVA_OPTIONS=\"-Xmx2048m\"<\/code> gibi ortam de\u011fi\u015fkenleri kullanabilir veya agent&#8217;a daha fazla RAM ekleyebilirsiniz.<br \/>\n*   <strong>Yetkilendirme Sorunlar\u0131 (Git, Keystore):<\/strong> Git deposuna eri\u015fim veya Keystore dosyas\u0131na eri\u015fim izinleri nedeniyle hatalar alabilirsiniz. Jenkins Credentials&#8217;\u0131n do\u011fru yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131ndan ve agent&#8217;\u0131n dosya izinlerine sahip oldu\u011fundan emin olun.<br \/>\n*   <strong>Jenkins Loglar\u0131n\u0131 Okuma:<\/strong> Herhangi bir sorunla kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131zda, Jenkins&#8217;in &#8220;Console Output&#8221; b\u00f6l\u00fcm\u00fcndeki loglar\u0131 dikkatlice inceleyin. Hata mesajlar\u0131 genellikle sorunun k\u00f6k nedenini g\u00f6sterir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Android uygulamalar\u0131n\u0131 Jenkins ile otomatikle\u015ftirmek, geli\u015ftirme ekiplerinin verimlili\u011fini, uygulama kalitesini ve da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. S\u00fcrekli Entegrasyon ve S\u00fcrekli Da\u011f\u0131t\u0131m pratikleri sayesinde, kod de\u011fi\u015fiklikleri h\u0131zl\u0131 bir \u015fekilde entegre edilir, otomatik testlerle do\u011frulan\u0131r ve g\u00fcvenilir bir \u015fekilde da\u011f\u0131t\u0131ma haz\u0131r hale getirilir.<\/p>\n<p>Bu makalede, Jenkins&#8217;in temel kurulumundan ba\u015flayarak, bir Android derleme ortam\u0131n\u0131n nas\u0131l haz\u0131rlanaca\u011f\u0131n\u0131, Freestyle ve Pipeline projeleriyle basit ve geli\u015fmi\u015f derleme s\u00fcre\u00e7lerinin nas\u0131l yap\u0131land\u0131r\u0131laca\u011f\u0131n\u0131 ayr\u0131nt\u0131l\u0131 bir \u015fekilde ele ald\u0131k. Ayr\u0131ca, test otomasyonu, kod kalitesi ara\u00e7lar\u0131, g\u00fcvenlik, Docker entegrasyonu gibi ek konulara ve yayg\u0131n sorun giderme ipu\u00e7lar\u0131na de\u011findik.<\/p>\n<p>Jenkins&#8217;in esnekli\u011fi ve geni\u015f eklenti ekosistemi, Android geli\u015ftirme s\u00fcre\u00e7lerinizi tamamen \u00f6zelle\u015ftirmenize ve otomatikle\u015ftirmemize olanak tan\u0131r. Ba\u015flang\u0131\u00e7ta biraz \u00e7aba gerektirse de, kurulan sa\u011flam bir CI\/CD altyap\u0131s\u0131, uzun vadede geli\u015ftirme s\u00fcrecinize b\u00fcy\u00fck de\u011fer katacak ve ekiplerinizin daha yenilik\u00e7i i\u015flere odaklanmas\u0131n\u0131 sa\u011flayacakt\u0131r. Unutmay\u0131n, CI\/CD bir yolculuktur ve s\u00fcrekli iyile\u015ftirme gerektirir. S\u00fcre\u00e7lerinizi d\u00fczenli olarak g\u00f6zden ge\u00e7irin, yeni ara\u00e7lar\u0131 ve pratikleri entegre edin ve otomasyonun faydalar\u0131n\u0131 en \u00fcst d\u00fczeye \u00e7\u0131kar\u0131n.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Android Uygulamalar\u0131n\u0131 Jenkins ile Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber\nGiri\u015f\nG\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i mobil uygulama pazar\u0131nda, h\u0131zl\u0131 ve g","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-31565","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Android Uygulamalar\u0131n\u0131 Jenkins ile Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Android Uygulamalar\u0131n\u0131 Jenkins ile Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Android Uygulamalar\u0131n\u0131 Jenkins ile Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber Giri\u015f G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i mobil uygulama pazar\u0131nda, h\u0131zl\u0131 ve g\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-11T06:41:14+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Android Uygulamalar\u0131n\u0131 Jenkins ile Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-10-11T06:41:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/\"},\"wordCount\":3469,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/\",\"name\":\"Android Uygulamalar\u0131n\u0131 Jenkins ile Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-11T06:41:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Android Uygulamalar\u0131n\u0131 Jenkins ile Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Android Uygulamalar\u0131n\u0131 Jenkins ile Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Android Uygulamalar\u0131n\u0131 Jenkins ile Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber","og_description":"Android Uygulamalar\u0131n\u0131 Jenkins ile Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber Giri\u015f G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i mobil uygulama pazar\u0131nda, h\u0131zl\u0131 ve g","og_url":"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-11T06:41:14+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Android Uygulamalar\u0131n\u0131 Jenkins ile Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber","datePublished":"2025-10-11T06:41:14+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/"},"wordCount":3469,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/","name":"Android Uygulamalar\u0131n\u0131 Jenkins ile Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-11T06:41:14+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/android-uygulamalarini-jenkins-ile-otomatiklestirme-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Android Uygulamalar\u0131n\u0131 Jenkins ile Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31565","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31565"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31565\/revisions"}],"predecessor-version":[{"id":31566,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31565\/revisions\/31566"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31565"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31565"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}