{"id":30582,"date":"2025-09-29T14:40:47","date_gmt":"2025-09-29T11:40:47","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=30582"},"modified":"2025-09-29T14:40:47","modified_gmt":"2025-09-29T11:40:47","slug":"angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/","title":{"rendered":"Angular, Travis CI ve Firebase Hosting ile S\u00fcrekli Da\u011f\u0131t\u0131m"},"content":{"rendered":"<p><body><\/p>\n<h2>Angular, Travis CI ve Firebase Hosting ile S\u00fcrekli Da\u011f\u0131t\u0131m<\/h2>\n<p>S\u00fcrekli Da\u011f\u0131t\u0131m (Continuous Deployment &#8211; CD), modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinin vazge\u00e7ilmez bir par\u00e7as\u0131 haline gelmi\u015ftir. Bu yakla\u015f\u0131m, kod de\u011fi\u015fikliklerinin otomatik olarak test edilmesini, derlenmesini ve \u00fcretim ortam\u0131na da\u011f\u0131t\u0131lmas\u0131n\u0131 sa\u011flayarak, geli\u015ftirme ekiplerinin daha h\u0131zl\u0131, daha g\u00fcvenilir ve daha verimli \u00e7al\u0131\u015fmas\u0131na olanak tan\u0131r. \u00d6zellikle web uygulamalar\u0131 s\u00f6z konusu oldu\u011funda, kullan\u0131c\u0131lar\u0131n s\u00fcrekli g\u00fcncel ve hatas\u0131z bir deneyim ya\u015famas\u0131 b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Bu makalede, pop\u00fcler \u00f6n u\u00e7 \u00e7er\u00e7evesi Angular&#8217;\u0131, g\u00fc\u00e7l\u00fc s\u00fcrekli entegrasyon\/s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) hizmeti Travis CI&#8217;\u0131 ve h\u0131zl\u0131, g\u00fcvenilir hosting \u00e7\u00f6z\u00fcm\u00fc Firebase Hosting&#8217;i bir araya getirerek nas\u0131l u\u00e7tan uca bir s\u00fcrekli da\u011f\u0131t\u0131m hatt\u0131 olu\u015fturulaca\u011f\u0131n\u0131 ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>S\u00fcrekli Da\u011f\u0131t\u0131m Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>S\u00fcrekli Da\u011f\u0131t\u0131m, S\u00fcrekli Entegrasyon (Continuous Integration &#8211; CI) ve S\u00fcrekli Teslimat (Continuous Delivery &#8211; CD) kavramlar\u0131n\u0131n bir uzant\u0131s\u0131d\u0131r. CI, geli\u015ftiricilerin kodlar\u0131n\u0131 s\u0131k s\u0131k ana depoya birle\u015ftirmesini ve her bir birle\u015ftirme i\u015fleminde otomatik testlerin \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 i\u00e7erir. CD ise, bu birle\u015ftirilen ve test edilen kodun, herhangi bir insan m\u00fcdahalesi olmadan \u00fcretim ortam\u0131na otomatik olarak da\u011f\u0131t\u0131lmaya haz\u0131r hale getirilmesini sa\u011flar. S\u00fcrekli Da\u011f\u0131t\u0131m ise, bu &#8220;da\u011f\u0131t\u0131ma haz\u0131r&#8221; kodun otomatik olarak \u00fcretim ortam\u0131na g\u00f6nderilmesi s\u00fcrecidir.<\/p>\n<p>S\u00fcrekli Da\u011f\u0131t\u0131m\u0131n temel faydalar\u0131 \u015funlard\u0131r:<\/p>\n<p>*   <strong>H\u0131z ve Verimlilik:<\/strong> Geli\u015ftiriciler, kodlar\u0131n\u0131 tamamlad\u0131klar\u0131nda manuel da\u011f\u0131t\u0131m s\u00fcre\u00e7leriyle u\u011fra\u015fmak yerine do\u011frudan yeni \u00f6zellikler geli\u015ftirmeye veya hatalar\u0131 d\u00fczeltmeye odaklanabilirler. Da\u011f\u0131t\u0131m s\u00fcreci otomatiktir ve dakikalar i\u00e7inde tamamlan\u0131r.<br \/>\n*   <strong>Hata Azaltma:<\/strong> Manuel da\u011f\u0131t\u0131m s\u00fcre\u00e7leri insan hatas\u0131na a\u00e7\u0131kt\u0131r. Otomatikle\u015ftirilmi\u015f bir s\u00fcre\u00e7, bu t\u00fcr hatalar\u0131 ortadan kald\u0131r\u0131r ve da\u011f\u0131t\u0131m\u0131n her zaman tutarl\u0131 bir \u015fekilde yap\u0131lmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Daha H\u0131zl\u0131 Geri Bildirim D\u00f6ng\u00fcs\u00fc:<\/strong> Yeni \u00f6zellikler veya d\u00fczeltmeler h\u0131zla kullan\u0131c\u0131lara ula\u015ft\u0131r\u0131labildi\u011finden, geri bildirim d\u00f6ng\u00fcs\u00fc k\u0131sal\u0131r. Bu, \u00fcr\u00fcn\u00fcn daha h\u0131zl\u0131 adapte olmas\u0131na ve kullan\u0131c\u0131 ihtiya\u00e7lar\u0131na daha iyi yan\u0131t vermesine olanak tan\u0131r.<br \/>\n*   <strong>Daha Y\u00fcksek G\u00fcven:<\/strong> Otomatik testler ve da\u011f\u0131t\u0131m s\u00fcre\u00e7leri sayesinde, geli\u015ftiriciler ve payda\u015flar, \u00fcretim ortam\u0131na giden kodun kalitesine ve kararl\u0131l\u0131\u011f\u0131na daha fazla g\u00fcvenirler.<br \/>\n*   <strong>Azalt\u0131lm\u0131\u015f Risk:<\/strong> K\u00fc\u00e7\u00fck, s\u0131k yap\u0131lan da\u011f\u0131t\u0131mlar, b\u00fcy\u00fck ve nadir yap\u0131lan da\u011f\u0131t\u0131mlara g\u00f6re daha az risk ta\u015f\u0131r. Bir sorun ortaya \u00e7\u0131kt\u0131\u011f\u0131nda, sorunun kayna\u011f\u0131n\u0131 bulmak ve d\u00fczeltmek daha kolayd\u0131r.<\/p>\n<p>Bu faydalar g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, modern web uygulamalar\u0131 i\u00e7in s\u00fcrekli da\u011f\u0131t\u0131m\u0131n benimsenmesi ka\u00e7\u0131n\u0131lmazd\u0131r. Angular gibi dinamik \u00f6n u\u00e7 uygulamalar\u0131, h\u0131zl\u0131 iterasyon ve da\u011f\u0131t\u0131m gerektirdi\u011finden, bu s\u00fcre\u00e7ler i\u00e7in ideal bir adayd\u0131r.<\/p>\n<h3>Angular: Modern Web Uygulamalar\u0131n\u0131n Temeli<\/h3>\n<p>Angular, Google taraf\u0131ndan geli\u015ftirilen a\u00e7\u0131k kaynakl\u0131, TypeScript tabanl\u0131 bir \u00f6n u\u00e7 web uygulama \u00e7er\u00e7evesidir. B\u00fcy\u00fck \u00f6l\u00e7ekli ve performans odakl\u0131 tek sayfa uygulamalar\u0131 (Single Page Applications &#8211; SPA) geli\u015ftirmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bile\u015fen tabanl\u0131 mimarisi, g\u00fc\u00e7l\u00fc CLI (Command Line Interface) ara\u00e7lar\u0131, zengin ekosistemi ve g\u00fc\u00e7l\u00fc tip g\u00fcvenli\u011fi sa\u011flayan TypeScript kullan\u0131m\u0131 sayesinde geli\u015ftiricilere verimli bir geli\u015ftirme deneyimi sunar.<\/p>\n<p>Angular uygulamalar\u0131, geli\u015ftirme a\u015famas\u0131nda bir\u00e7ok mod\u00fcl ve ba\u011f\u0131ml\u0131l\u0131k i\u00e7erir. Ancak da\u011f\u0131t\u0131m i\u00e7in, bu uygulama <code>ng build --prod<\/code> komutu ile derlenir. Bu komut, uygulamay\u0131 optimize eder, kodlar\u0131 k\u00fc\u00e7\u00fclt\u00fcr (minification), birle\u015ftirir (bundling) ve statik HTML, CSS ve JavaScript dosyalar\u0131ndan olu\u015fan bir <code>dist<\/code> klas\u00f6r\u00fc olu\u015fturur. S\u00fcrekli da\u011f\u0131t\u0131m s\u00fcrecinde, bu <code>dist<\/code> klas\u00f6r\u00fcn\u00fcn \u00fcretim ortam\u0131na ta\u015f\u0131nmas\u0131 hedeflenir.<\/p>\n<h3>Travis CI: Bulut Tabanl\u0131 CI\/CD G\u00fcc\u00fc<\/h3>\n<p>Travis CI, GitHub ile entegre \u00e7al\u0131\u015fan, bulut tabanl\u0131 pop\u00fcler bir s\u00fcrekli entegrasyon ve s\u00fcrekli da\u011f\u0131t\u0131m hizmetidir. A\u00e7\u0131k kaynak projeler i\u00e7in \u00fccretsiz destek sunmas\u0131 ve kolay kurulumu sayesinde geni\u015f bir geli\u015ftirici kitlesi taraf\u0131ndan tercih edilmektedir. Travis CI, bir GitHub deposundaki kod de\u011fi\u015fikliklerini izler ve her bir push veya pull request olay\u0131nda otomatik olarak belirli g\u00f6revleri (test etme, derleme, da\u011f\u0131tma) \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n<p>Travis CI&#8217;\u0131n \u00e7al\u0131\u015fma prensibi olduk\u00e7a basittir:<\/p>\n<p>1.  <strong>GitHub Entegrasyonu:<\/strong> Travis CI hesab\u0131n\u0131z\u0131 GitHub hesab\u0131n\u0131zla ba\u011flars\u0131n\u0131z.<br \/>\n2.  <strong>Depo \u0130zleme:<\/strong> Belirledi\u011finiz GitHub depolar\u0131n\u0131 Travis CI&#8217;\u0131n izlemesi i\u00e7in etkinle\u015ftirirsiniz.<br \/>\n3.  <strong><code>.travis.yml<\/code> Dosyas\u0131:<\/strong> Projenizin k\u00f6k dizininde bulunan <code>.travis.yml<\/code> adl\u0131 bir yap\u0131land\u0131rma dosyas\u0131 olu\u015fturursunuz. Bu dosya, Travis CI&#8217;\u0131n projenizi nas\u0131l derlemesi, test etmesi ve da\u011f\u0131tmas\u0131 gerekti\u011fini ad\u0131m ad\u0131m tan\u0131mlar.<br \/>\n4.  <strong>Olay Tetikleme:<\/strong> GitHub&#8217;a yap\u0131lan her kod push&#8217;unda veya pull request&#8217;inde, Travis CI otomatik olarak tetiklenir.<br \/>\n5.  <strong>Ortam Olu\u015fturma:<\/strong> Travis CI, <code>.travis.yml<\/code> dosyas\u0131nda belirtilen ayarlara g\u00f6re (\u00f6rne\u011fin, Node.js s\u00fcr\u00fcm\u00fc) sanal bir ortam (build environment) olu\u015fturur.<br \/>\n6.  <strong>Ad\u0131mlar\u0131 Y\u00fcr\u00fctme:<\/strong> Bu ortamda, <code>.travis.yml<\/code> dosyas\u0131ndaki <code>install<\/code>, <code>script<\/code> ve <code>deploy<\/code> gibi b\u00f6l\u00fcmlerde tan\u0131mlanan komutlar\u0131 s\u0131ras\u0131yla \u00e7al\u0131\u015ft\u0131r\u0131r.<br \/>\n7.  <strong>Durum Bildirimi:<\/strong> T\u00fcm ad\u0131mlar tamamland\u0131\u011f\u0131nda, Travis CI, build&#8217;in ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 GitHub&#8217;a geri bildirir. Ba\u015far\u0131l\u0131 ise da\u011f\u0131t\u0131m ger\u00e7ekle\u015fir, ba\u015far\u0131s\u0131z ise s\u00fcre\u00e7 durdurulur ve geli\u015ftiriciye bilgi verilir.<\/p>\n<p><code>.travis.yml<\/code> dosyas\u0131, Travis CI&#8217;\u0131n beynidir. Bu dosyan\u0131n do\u011fru yap\u0131land\u0131r\u0131lmas\u0131, s\u00fcrekli da\u011f\u0131t\u0131m hatt\u0131n\u0131n sorunsuz \u00e7al\u0131\u015fmas\u0131 i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>Firebase Hosting: H\u0131zl\u0131 ve G\u00fcvenilir Web Bar\u0131nd\u0131rma<\/h3>\n<p>Firebase, Google taraf\u0131ndan sunulan bir mobil ve web uygulama geli\u015ftirme platformudur. Ger\u00e7ek zamanl\u0131 veritaban\u0131, kimlik do\u011frulama, bulut i\u015flevleri, depolama ve hosting gibi bir\u00e7ok hizmeti tek bir \u00e7at\u0131 alt\u0131nda sunar. Firebase Hosting, bu hizmetlerden biridir ve statik ve dinamik web uygulamalar\u0131 i\u00e7in h\u0131zl\u0131, g\u00fcvenli ve global olarak \u00f6l\u00e7eklenebilir bir bar\u0131nd\u0131rma \u00e7\u00f6z\u00fcm\u00fc sunar.<\/p>\n<p>Firebase Hosting&#8217;in temel \u00f6zellikleri ve avantajlar\u0131 \u015funlard\u0131r:<\/p>\n<p>*   <strong>K\u00fcresel CDN (Content Delivery Network):<\/strong> Uygulaman\u0131z\u0131n dosyalar\u0131 d\u00fcnya genelindeki bir\u00e7ok sunucuda \u00f6nbelle\u011fe al\u0131n\u0131r. Bu sayede kullan\u0131c\u0131lar, kendilerine en yak\u0131n sunucudan i\u00e7eri\u011fi al\u0131r ve bu da y\u00fckleme s\u00fcrelerini \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131salt\u0131r.<br \/>\n*   <strong>\u00dccretsiz SSL Sertifikas\u0131:<\/strong> T\u00fcm bar\u0131nd\u0131r\u0131lan siteler otomatik olarak \u00fccretsiz SSL sertifikalar\u0131 ile gelir, bu da sitenizin g\u00fcvenli ve HTTPS \u00fczerinden eri\u015filebilir olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>\u00d6zel Alan Ad\u0131 Deste\u011fi:<\/strong> Kendi \u00f6zel alan adlar\u0131n\u0131z\u0131 kolayca ba\u011flayabilirsiniz.<br \/>\n*   <strong>Tek T\u0131kla Da\u011f\u0131t\u0131m:<\/strong> <code>firebase deploy<\/code> komutu ile uygulaman\u0131z\u0131 saniyeler i\u00e7inde da\u011f\u0131tabilirsiniz.<br \/>\n*   <strong>Versiyonlama ve Geri Alma:<\/strong> Firebase Hosting, her da\u011f\u0131t\u0131m\u0131n bir versiyonunu tutar. Bu sayede, herhangi bir sorun olu\u015ftu\u011funda \u00f6nceki bir versiyona kolayca geri d\u00f6nebilirsiniz.<br \/>\n*   <strong>H\u0131zl\u0131 ve G\u00fcvenilir:<\/strong> Google&#8217;\u0131n altyap\u0131s\u0131 \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in y\u00fcksek performans ve g\u00fcvenilirlik sunar.<\/p>\n<p>Angular gibi derlenmi\u015f statik dosyalar \u00fcreten SPA&#8217;lar i\u00e7in Firebase Hosting, m\u00fckemmel bir se\u00e7imdir. <code>dist<\/code> klas\u00f6r\u00fcndeki t\u00fcm dosyalar kolayca Firebase&#8217;e da\u011f\u0131t\u0131labilir.<\/p>\n<h3>Angular, Travis CI ve Firebase Hosting Entegrasyon Ad\u0131mlar\u0131<\/h3>\n<p>\u015eimdi, bu \u00fc\u00e7 teknolojiyi bir araya getirerek bir s\u00fcrekli da\u011f\u0131t\u0131m hatt\u0131 olu\u015fturma ad\u0131mlar\u0131n\u0131 inceleyelim.<\/p>\n<h4>Ad\u0131m 1: Angular Projesi Olu\u015fturma<\/h4>\n<p>\u00d6ncelikle, yeni bir Angular projesi olu\u015fturarak veya mevcut bir projeyi kullanarak ba\u015flay\u0131n. E\u011fer yeni bir proje olu\u015fturuyorsan\u0131z, Angular CLI&#8217;\u0131 global olarak y\u00fcklemeniz gerekir:<\/p>\n<pre><code class=\"language-bash\">npm install -g @angular\/cli\nng new my-angular-app --strict --routing=false\ncd my-angular-app<\/code><\/pre>\n<p>Bu komutlar, <code>my-angular-app<\/code> ad\u0131nda yeni bir Angular projesi olu\u015fturacak ve projenin dizinine ge\u00e7ecektir. Projenizin d\u00fczg\u00fcn \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in yerel olarak \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">ng serve --open<\/code><\/pre>\n<p>Uygulaman\u0131z taray\u0131c\u0131n\u0131zda a\u00e7\u0131lacakt\u0131r.<\/p>\n<h4>Ad\u0131m 2: Git ve GitHub Entegrasyonu<\/h4>\n<p>S\u00fcrekli da\u011f\u0131t\u0131m hatt\u0131n\u0131n tetikleyicisi GitHub olaca\u011f\u0131 i\u00e7in, projenizi bir Git deposuna eklemeniz ve GitHub&#8217;a y\u00fcklemeniz gerekir.<\/p>\n<pre><code class=\"language-bash\">git init\ngit add .\ngit commit -m \"Initial Angular project setup\"\ngit branch -M main\ngit remote add origin https:\/\/github.com\/your-username\/my-angular-app.git # Kendi GitHub depo URL'nizi kullan\u0131n\ngit push -u origin main<\/code><\/pre>\n<p>Projeniz art\u0131k GitHub&#8217;da yay\u0131nlanm\u0131\u015f olmal\u0131d\u0131r.<\/p>\n<h4>Ad\u0131m 3: Firebase Projesi Olu\u015fturma ve Hosting Ayarlar\u0131<\/h4>\n<p>Firebase Console&#8217;a (console.firebase.google.com) gidin ve yeni bir proje olu\u015fturun. Projenize anlaml\u0131 bir ad verin (\u00f6rne\u011fin, <code>my-angular-app-cd<\/code>).<\/p>\n<p>Proje olu\u015fturulduktan sonra, yerel makinenizde Firebase CLI&#8217;\u0131 y\u00fcklemeniz gerekir:<\/p>\n<pre><code class=\"language-bash\">npm install -g firebase-tools<\/code><\/pre>\n<p>Daha sonra, Firebase hesab\u0131n\u0131za giri\u015f yap\u0131n:<\/p>\n<pre><code class=\"language-bash\">firebase login<\/code><\/pre>\n<p>Bu komut, taray\u0131c\u0131n\u0131z\u0131 a\u00e7acak ve Firebase hesab\u0131n\u0131zda oturum a\u00e7man\u0131z\u0131 isteyecektir. Ba\u015far\u0131l\u0131 bir \u015fekilde giri\u015f yapt\u0131ktan sonra, projenizin k\u00f6k dizininde Firebase&#8217;i ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">firebase init<\/code><\/pre>\n<p>Bu komut size birka\u00e7 soru soracakt\u0131r:<\/p>\n<p>1.  <strong>Which Firebase features do you want to set up for this directory?<\/strong> <code>Hosting<\/code> se\u00e7ene\u011fini se\u00e7in (bo\u015fluk tu\u015fu ile se\u00e7ip Enter ile devam edin).<br \/>\n2.  <strong>Please select a Firebase project for this directory:<\/strong> Daha \u00f6nce olu\u015fturdu\u011funuz Firebase projenizi se\u00e7in.<br \/>\n3.  <strong>What do you want to use as your public directory?<\/strong> Angular uygulamalar\u0131 <code>ng build --prod<\/code> komutu ile derlendi\u011finde <code>dist\/<project-name><\/code> dizinine \u00e7\u0131kt\u0131 verir. Bu nedenle, <code>dist\/my-angular-app<\/code> (veya projenizin ad\u0131n\u0131) olarak ayarlay\u0131n.<br \/>\n4.  <strong>Configure as a single-page app (rewrite all URLs to \/index.html)?<\/strong> <code>Yes<\/code> (y) se\u00e7ene\u011fini se\u00e7in. Bu, Angular&#8217;\u0131n istemci taraf\u0131 y\u00f6nlendirmesinin d\u00fczg\u00fcn \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<br \/>\n5.  <strong>Set up automatic builds and deploys with GitHub?<\/strong> <code>No<\/code> (n) se\u00e7ene\u011fini se\u00e7in, \u00e7\u00fcnk\u00fc bu makalede Travis CI&#8217;\u0131 kullanaca\u011f\u0131z.<\/p>\n<p><code>firebase init<\/code> komutu, projenizin k\u00f6k dizininde <code>firebase.json<\/code> ve <code>.firebaserc<\/code> dosyalar\u0131n\u0131 olu\u015fturacakt\u0131r. <code>firebase.json<\/code> dosyan\u0131z yakla\u015f\u0131k olarak \u015f\u00f6yle g\u00f6r\u00fcnmelidir:<\/p>\n<pre><code class=\"language-json\">{\n  \"hosting\": {\n    \"public\": \"dist\/my-angular-app\",\n    \"ignore\": [\n      \"firebase.json\",\n      \"<em><\/em>\/.*\",\n      \"<strong>\/node_modules\/<\/strong>\"\n    ],\n    \"rewrites\": [\n      {\n        \"source\": \"<em><\/em>\",\n        \"destination\": \"\/index.html\"\n      }\n    ]\n  }\n}<\/code><\/pre>\n<p>Uygulaman\u0131z\u0131 manuel olarak da\u011f\u0131tarak her \u015feyin yolunda oldu\u011fundan emin olabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">ng build --prod\nfirebase deploy --only hosting<\/code><\/pre>\n<p>Uygulaman\u0131z bir Firebase Hosting URL&#8217;sinde yay\u0131nlanacakt\u0131r.<\/p>\n<h4>Ad\u0131m 4: Travis CI Hesap Kurulumu ve GitHub Ba\u011flant\u0131s\u0131<\/h4>\n<p>Travis CI web sitesine (travis-ci.com) gidin ve GitHub hesab\u0131n\u0131zla giri\u015f yap\u0131n. Giri\u015f yapt\u0131ktan sonra, Travis CI&#8217;\u0131n GitHub depolar\u0131n\u0131za eri\u015fim izni vermeniz gerekebilir. Ayarlar b\u00f6l\u00fcm\u00fcnde (Settings), depolar\u0131n\u0131z\u0131 senkronize edin. Ard\u0131ndan, s\u00fcrekli da\u011f\u0131t\u0131m yapmak istedi\u011finiz GitHub deponuzu (\u00f6rne\u011fin, <code>my-angular-app<\/code>) bulun ve yan\u0131ndaki anahtar\u0131 a\u00e7arak Travis CI&#8217;\u0131n bu depoyu izlemesini sa\u011flay\u0131n.<\/p>\n<h4>Ad\u0131m 5: <code>.travis.yml<\/code> Dosyas\u0131n\u0131 Yap\u0131land\u0131rma<\/h4>\n<p>Projenizin k\u00f6k dizininde <code>.travis.yml<\/code> ad\u0131nda yeni bir dosya olu\u015fturun ve a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyin:<\/p>\n<pre><code class=\"language-yaml\">language: node_js\nnode_js:\n  - \"16\" # Kullanmak istedi\u011finiz Node.js s\u00fcr\u00fcm\u00fcn\u00fc belirtin (Angular projenizin gereksinimlerine g\u00f6re)\n\ncache: npm # npm paketlerini \u00f6nbelle\u011fe alarak build s\u00fcrelerini h\u0131zland\u0131r\u0131r\n\ninstall:\n  - npm install # Proje ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fckle\n\nscript:\n  - npm run lint # \u0130ste\u011fe ba\u011fl\u0131: Kod kalitesi kontrol\u00fc\n  - npm test -- --no-watch --no-progress --browsers=ChromeHeadlessCI # \u0130ste\u011fe ba\u011fl\u0131: Testleri \u00e7al\u0131\u015ft\u0131r\n  - ng build --prod # Angular uygulamas\u0131n\u0131 \u00fcretim i\u00e7in derle\n\ndeploy:\n  provider: firebase\n  token: $FIREBASE_TOKEN # Travis CI ortam de\u011fi\u015fkeni olarak saklanan Firebase token'\u0131\n  project: my-angular-app-cd # Firebase proje ID'niz\n  skip_cleanup: true # Build sonras\u0131 dist klas\u00f6r\u00fcn\u00fc silmeyi engelle\n  on:\n    branch: main # Sadece 'main' dal\u0131na yap\u0131lan push'larda da\u011f\u0131t\u0131m yap<\/code><\/pre>\n<p>Bu dosyadaki her bir b\u00f6l\u00fcm\u00fc a\u00e7\u0131klayal\u0131m:<\/p>\n<p>*   <strong><code>language: node_js<\/code><\/strong>: Projenin Node.js tabanl\u0131 oldu\u011funu belirtir.<br \/>\n*   <strong><code>node_js: - \"16\"<\/code><\/strong>: Build ortam\u0131nda kullan\u0131lacak Node.js s\u00fcr\u00fcm\u00fcn\u00fc belirtir. Angular projenizin gerektirdi\u011fi s\u00fcr\u00fcm\u00fc kulland\u0131\u011f\u0131n\u0131zdan emin olun.<br \/>\n*   <strong><code>cache: npm<\/code><\/strong>: <code>node_modules<\/code> dizinini Travis CI&#8217;\u0131n \u00f6nbelle\u011fine al\u0131r. Bu, sonraki build&#8217;lerde <code>npm install<\/code> s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r.<br \/>\n*   <strong><code>install<\/code><\/strong>: Da\u011f\u0131t\u0131m \u00f6ncesinde \u00e7al\u0131\u015ft\u0131r\u0131lacak kurulum komutlar\u0131n\u0131 i\u00e7erir. Burada <code>npm install<\/code> ile projenin ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fcklenir.<br \/>\n*   <strong><code>script<\/code><\/strong>: Uygulaman\u0131n test edilmesi ve derlenmesi gibi ana ad\u0131mlar\u0131 i\u00e7erir.<br \/>\n    *   <code>npm run lint<\/code> ve <code>npm test<\/code>: \u0130ste\u011fe ba\u011fl\u0131d\u0131r ancak CI\/CD s\u00fcrecinin \u00f6nemli bir par\u00e7as\u0131d\u0131r. Kod kalitesini ve i\u015flevselli\u011fini garanti alt\u0131na al\u0131r. <code>ChromeHeadlessCI<\/code> ile ba\u015fs\u0131z taray\u0131c\u0131da testleri \u00e7al\u0131\u015ft\u0131r\u0131r\u0131z.<br \/>\n    *   <code>ng build --prod<\/code>: Angular uygulamas\u0131n\u0131 \u00fcretim ortam\u0131 i\u00e7in derler. Bu komut, <code>dist\/my-angular-app<\/code> klas\u00f6r\u00fcn\u00fc olu\u015fturur.<br \/>\n*   <strong><code>deploy<\/code><\/strong>: S\u00fcrekli da\u011f\u0131t\u0131m\u0131n as\u0131l sihrinin ger\u00e7ekle\u015fti\u011fi b\u00f6l\u00fcmd\u00fcr.<br \/>\n    *   <strong><code>provider: firebase<\/code><\/strong>: Da\u011f\u0131t\u0131m\u0131n Firebase Hosting&#8217;e yap\u0131laca\u011f\u0131n\u0131 belirtir.<br \/>\n    *   <strong><code>token: $FIREBASE_TOKEN<\/code><\/strong>: Bu, Firebase&#8217;e da\u011f\u0131t\u0131m yapmak i\u00e7in gerekli olan kimlik do\u011frulama token&#8217;\u0131d\u0131r. <strong>Bu token&#8217;\u0131 do\u011frudan <code>.travis.yml<\/code> dosyas\u0131na yazmamal\u0131s\u0131n\u0131z.<\/strong> G\u00fcvenlik nedeniyle, bu bir Travis CI ortam de\u011fi\u015fkeni olarak saklanmal\u0131d\u0131r. Daha sonra nas\u0131l ayarlanaca\u011f\u0131n\u0131 a\u00e7\u0131klayaca\u011f\u0131z.<br \/>\n    *   <strong><code>project: my-angular-app-cd<\/code><\/strong>: Firebase projenizin ID&#8217;sidir. Firebase Console&#8217;da projenizin ayarlar\u0131nda bulabilirsiniz.<br \/>\n    *   <strong><code>skip_cleanup: true<\/code><\/strong>: Travis CI varsay\u0131lan olarak <code>script<\/code> a\u015famas\u0131ndan sonra t\u00fcm build dizinini temizler. Ancak Angular&#8217;\u0131n <code>dist<\/code> klas\u00f6r\u00fcne ihtiyac\u0131m\u0131z oldu\u011fu i\u00e7in bu ayar\u0131 <code>true<\/code> yapmal\u0131y\u0131z. Aksi takdirde, <code>dist<\/code> klas\u00f6r\u00fc silinecek ve Firebase&#8217;e da\u011f\u0131t\u0131lacak bir \u015fey kalmayacakt\u0131r.<br \/>\n    *   <strong><code>on: branch: main<\/code><\/strong>: Da\u011f\u0131t\u0131m\u0131n yaln\u0131zca <code>main<\/code> dal\u0131na yap\u0131lan push i\u015flemlerinde tetiklenmesini sa\u011flar. Bu, geli\u015ftirme dallar\u0131ndaki de\u011fi\u015fikliklerin \u00fcretim ortam\u0131na gitmesini engeller.<\/p>\n<h4>Ad\u0131m 6: Ortam De\u011fi\u015fkenleri ve G\u00fcvenlik (Firebase Token)<\/h4>\n<p>Firebase&#8217;e otomatik olarak da\u011f\u0131t\u0131m yapmak i\u00e7in bir kimlik do\u011frulama token&#8217;\u0131na ihtiyac\u0131m\u0131z var. Bu token&#8217;\u0131 elde etmek i\u00e7in yerel makinenizde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">firebase login:ci<\/code><\/pre>\n<p>Bu komut, taray\u0131c\u0131n\u0131z\u0131 a\u00e7acak ve Firebase hesab\u0131n\u0131zda oturum a\u00e7man\u0131z\u0131 isteyecektir. Ba\u015far\u0131l\u0131 bir \u015fekilde giri\u015f yapt\u0131ktan sonra, terminalinizde uzun bir alfan\u00fcmerik dize olan bir &#8220;refresh token&#8221; g\u00f6r\u00fcnt\u00fcleyecektir. <strong>Bu token&#8217;\u0131 asla GitHub deponuza veya <code>.travis.yml<\/code> dosyan\u0131za do\u011frudan eklemeyin.<\/strong> Bu token, Firebase hesab\u0131n\u0131za tam eri\u015fim sa\u011flar ve g\u00fcvenli\u011fi ihlal edilirse ciddi riskler olu\u015fturabilir.<\/p>\n<p>Bu token&#8217;\u0131 g\u00fcvenli bir \u015fekilde Travis CI ortam de\u011fi\u015fkeni olarak saklamal\u0131y\u0131z:<\/p>\n<p>1.  Travis CI web sitesinde, deponuzun ayarlar\u0131na (Settings) gidin.<br \/>\n2.  &#8220;Environment Variables&#8221; b\u00f6l\u00fcm\u00fcn\u00fc bulun.<br \/>\n3.  &#8220;Name&#8221; alan\u0131na <code>FIREBASE_TOKEN<\/code> yaz\u0131n.<br \/>\n4.  &#8220;Value&#8221; alan\u0131na <code>firebase login:ci<\/code> komutuyla ald\u0131\u011f\u0131n\u0131z token&#8217;\u0131 yap\u0131\u015ft\u0131r\u0131n.<br \/>\n5.  &#8220;Add&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n6.  <strong>\u00d6nemli:<\/strong> &#8220;Display value in build log&#8221; se\u00e7ene\u011finin i\u015faretli olmad\u0131\u011f\u0131ndan emin olun. Bu, token&#8217;\u0131n build log&#8217;lar\u0131nda g\u00f6r\u00fcnmesini engeller.<\/p>\n<p>Art\u0131k <code>.travis.yml<\/code> dosyas\u0131ndaki <code>$FIREBASE_TOKEN<\/code> de\u011fi\u015fkeni, Travis CI taraf\u0131ndan bu g\u00fcvenli ortam de\u011fi\u015fkeninin de\u011feriyle de\u011fi\u015ftirilecektir.<\/p>\n<h4>Ad\u0131m 7: S\u00fcrekli Da\u011f\u0131t\u0131m\u0131n Tetiklenmesi<\/h4>\n<p>T\u00fcm yap\u0131land\u0131rmalar\u0131 tamamlad\u0131ktan sonra, <code>.travis.yml<\/code> dosyas\u0131n\u0131 ve varsa di\u011fer de\u011fi\u015fiklikleri GitHub deponuza push edin:<\/p>\n<pre><code class=\"language-bash\">git add .travis.yml\ngit commit -m \"Add Travis CI configuration for Firebase deployment\"\ngit push origin main<\/code><\/pre>\n<p>Bu push i\u015flemi, Travis CI&#8217;\u0131 tetikleyecektir. Travis CI web sitesinde deponuzun build ge\u00e7mi\u015fini kontrol edebilirsiniz. Birka\u00e7 dakika i\u00e7inde:<\/p>\n<p>1.  Travis CI, yeni bir build ba\u015flatacak.<br \/>\n2.  Node.js ortam\u0131n\u0131 kuracak.<br \/>\n3.  <code>npm install<\/code> ile ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyecek.<br \/>\n4.  <code>ng build --prod<\/code> ile Angular uygulamas\u0131n\u0131 derleyecek.<br \/>\n5.  <code>deploy<\/code> a\u015famas\u0131nda, <code>FIREBASE_TOKEN<\/code> ortam de\u011fi\u015fkenini kullanarak Firebase&#8217;e ba\u011flanacak ve <code>dist\/my-angular-app<\/code> klas\u00f6r\u00fcndeki statik dosyalar\u0131 Firebase Hosting&#8217;e da\u011f\u0131tacakt\u0131r.<\/p>\n<p>Build ba\u015far\u0131l\u0131 oldu\u011funda, Firebase Hosting URL&#8217;nize giderek uygulaman\u0131z\u0131n g\u00fcncellendi\u011fini g\u00f6rebilirsiniz. Art\u0131k <code>main<\/code> dal\u0131na her kod push&#8217;unda uygulaman\u0131z otomatik olarak da\u011f\u0131t\u0131lacakt\u0131r!<\/p>\n<h3>S\u00fcrekli Da\u011f\u0131t\u0131m\u0131n Avantajlar\u0131 ve Faydalar\u0131<\/h3>\n<p>Bu entegrasyonu kurmakla elde edece\u011finiz ba\u015fl\u0131ca avantajlar \u015funlard\u0131r:<\/p>\n<p>*   <strong>Otomatik G\u00fcncellemeler:<\/strong> Geli\u015ftiriciler, kodlar\u0131n\u0131 <code>main<\/code> dal\u0131na birle\u015ftirdiklerinde, uygulaman\u0131n otomatik olarak g\u00fcncellendi\u011fini bilirler. Manuel da\u011f\u0131t\u0131m s\u00fcre\u00e7leriyle zaman kaybetmezler.<br \/>\n*   <strong>Tutarl\u0131 Da\u011f\u0131t\u0131mlar:<\/strong> Her da\u011f\u0131t\u0131m ayn\u0131 otomatik s\u00fcre\u00e7ten ge\u00e7er, bu da insan hatas\u0131n\u0131 ortadan kald\u0131r\u0131r ve da\u011f\u0131t\u0131m tutarl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<br \/>\n*   <strong>H\u0131zland\u0131r\u0131lm\u0131\u015f Geli\u015ftirme D\u00f6ng\u00fcs\u00fc:<\/strong> Yeni \u00f6zellikler ve hata d\u00fczeltmeleri \u00e7ok daha h\u0131zl\u0131 bir \u015fekilde kullan\u0131c\u0131lara ula\u015f\u0131r, bu da \u00fcr\u00fcn\u00fcn pazar h\u0131z\u0131n\u0131 art\u0131r\u0131r.<br \/>\n*   <strong>Geli\u015ftirici Odakl\u0131l\u0131k:<\/strong> Geli\u015ftiriciler, altyap\u0131 veya da\u011f\u0131t\u0131m s\u00fcre\u00e7leriyle u\u011fra\u015fmak yerine temel i\u015flevsellik geli\u015ftirmeye odaklanabilirler.<br \/>\n*   <strong>G\u00fcvenilirlik:<\/strong> Otomatik testler ve da\u011f\u0131t\u0131m ad\u0131mlar\u0131, \u00fcretim ortam\u0131na giden kodun kalitesini ve kararl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<h3>Potansiyel Zorluklar ve \u00c7\u00f6z\u00fcmler<\/h3>\n<p>S\u00fcrekli da\u011f\u0131t\u0131m\u0131n bir\u00e7ok faydas\u0131 olsa da, dikkat edilmesi gereken baz\u0131 potansiyel zorluklar ve bunlar\u0131n \u00e7\u00f6z\u00fcmleri vard\u0131r:<\/p>\n<p>*   <strong>Test Kapsam\u0131:<\/strong> CI\/CD hatt\u0131n\u0131n etkinli\u011fi, testlerinizin kalitesine ve kapsam\u0131na ba\u011fl\u0131d\u0131r. Yetersiz testler, otomatik da\u011f\u0131t\u0131m\u0131n hatal\u0131 kodlar\u0131 \u00fcretim ortam\u0131na g\u00f6ndermesine neden olabilir. \u00c7\u00f6z\u00fcm: Kapsaml\u0131 birim, entegrasyon ve u\u00e7tan uca testler yazmaya yat\u0131r\u0131m yap\u0131n.<br \/>\n*   <strong>Ortam Farkl\u0131l\u0131klar\u0131:<\/strong> Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131nda farkl\u0131l\u0131klar olabilir. Bu farkl\u0131l\u0131klar, beklenmedik hatalara yol a\u00e7abilir. \u00c7\u00f6z\u00fcm: T\u00fcm ortamlar\u0131n m\u00fcmk\u00fcn oldu\u011funca benzer olmas\u0131n\u0131 sa\u011flamaya \u00e7al\u0131\u015f\u0131n. Ortam de\u011fi\u015fkenlerini kullanarak yap\u0131land\u0131rma farkl\u0131l\u0131klar\u0131n\u0131 y\u00f6netin.<br \/>\n*   <strong>Rollback Stratejileri:<\/strong> Otomatik da\u011f\u0131t\u0131m\u0131n her zaman ba\u015far\u0131l\u0131 olaca\u011f\u0131 garantisi yoktur. Bir sorun durumunda h\u0131zl\u0131ca \u00f6nceki bir s\u00fcr\u00fcme geri d\u00f6nebilmek \u00f6nemlidir. \u00c7\u00f6z\u00fcm: Firebase Hosting, da\u011f\u0131t\u0131m ge\u00e7mi\u015fini tutar ve tek t\u0131klamayla \u00f6nceki bir s\u00fcr\u00fcme geri d\u00f6nmenizi sa\u011flar. Bu \u00f6zelli\u011fi kullanmay\u0131 planlar\u0131n\u0131za dahil edin.<br \/>\n*   <strong>G\u00fcvenlik:<\/strong> Ortam de\u011fi\u015fkenleri (\u00f6rne\u011fin, <code>FIREBASE_TOKEN<\/code>) gibi hassas bilgilerin g\u00fcvenli bir \u015fekilde y\u00f6netilmesi kritik \u00f6neme sahiptir. \u00c7\u00f6z\u00fcm: Bu makalede g\u00f6sterildi\u011fi gibi, hassas bilgileri Travis CI&#8217;\u0131n \u015fifrelenmi\u015f ortam de\u011fi\u015fkenleri olarak saklay\u0131n ve asla do\u011frudan kod deposuna eklemeyin.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Angular, Travis CI ve Firebase Hosting \u00fc\u00e7l\u00fcs\u00fc, modern web uygulamalar\u0131 i\u00e7in g\u00fc\u00e7l\u00fc, verimli ve g\u00fcvenilir bir s\u00fcrekli da\u011f\u0131t\u0131m hatt\u0131 olu\u015fturmak i\u00e7in m\u00fckemmel bir kombinasyondur. Bu makalede ad\u0131m ad\u0131m g\u00f6sterilen entegrasyon s\u00fcreci sayesinde, geli\u015ftiriciler kodlar\u0131n\u0131 daha h\u0131zl\u0131 bir \u015fekilde kullan\u0131c\u0131lara ula\u015ft\u0131rabilir, hata oranlar\u0131n\u0131 d\u00fc\u015f\u00fcrebilir ve genel geli\u015ftirme verimlili\u011fini art\u0131rabilirler.<\/p>\n<p>S\u00fcrekli da\u011f\u0131t\u0131m, sadece teknolojik bir kurulumdan ibaret de\u011fildir; ayn\u0131 zamanda bir k\u00fclt\u00fcr ve geli\u015ftirme felsefesidir. Otomasyona yat\u0131r\u0131m yaparak, ekipler daha g\u00fcvenle \u00e7al\u0131\u015fabilir, daha s\u0131k yineleme yapabilir ve sonu\u00e7 olarak daha iyi \u00fcr\u00fcnler sunabilirler. Bu kurulum, k\u00fc\u00e7\u00fck bir ki\u015fisel projeden b\u00fcy\u00fck \u00f6l\u00e7ekli kurumsal uygulamalara kadar her t\u00fcr Angular projesi i\u00e7in uygulanabilir ve geli\u015ftirme s\u00fcre\u00e7lerinizi bir sonraki seviyeye ta\u015f\u0131yacakt\u0131r. Gelecekte, bu hatt\u0131 daha da geli\u015ftirmek i\u00e7in bildirimler, geli\u015fmi\u015f test senaryolar\u0131 ve farkl\u0131 da\u011f\u0131t\u0131m stratejileri gibi \u00f6zellikler eklenebilir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Angular, Travis CI ve Firebase Hosting ile S\u00fcrekli Da\u011f\u0131t\u0131m\nS\u00fcrekli Da\u011f\u0131t\u0131m (Continuous Deployment &#8211; CD), modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7","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":[1488],"tags":[],"class_list":{"0":"post-30582","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-angular","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>Angular, Travis CI ve Firebase Hosting ile S\u00fcrekli Da\u011f\u0131t\u0131m - 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\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular, Travis CI ve Firebase Hosting ile S\u00fcrekli Da\u011f\u0131t\u0131m\" \/>\n<meta property=\"og:description\" content=\"Angular, Travis CI ve Firebase Hosting ile S\u00fcrekli Da\u011f\u0131t\u0131m S\u00fcrekli Da\u011f\u0131t\u0131m (Continuous Deployment - CD), modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-29T11:40:47+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=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Angular, Travis CI ve Firebase Hosting ile S\u00fcrekli Da\u011f\u0131t\u0131m\",\"datePublished\":\"2025-09-29T11:40:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/\"},\"wordCount\":3075,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Angular\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/\",\"name\":\"Angular, Travis CI ve Firebase Hosting ile S\u00fcrekli Da\u011f\u0131t\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-09-29T11:40:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular, Travis CI ve Firebase Hosting ile S\u00fcrekli Da\u011f\u0131t\u0131m\"}]},{\"@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":"Angular, Travis CI ve Firebase Hosting ile S\u00fcrekli Da\u011f\u0131t\u0131m - 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\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/","og_locale":"tr_TR","og_type":"article","og_title":"Angular, Travis CI ve Firebase Hosting ile S\u00fcrekli Da\u011f\u0131t\u0131m","og_description":"Angular, Travis CI ve Firebase Hosting ile S\u00fcrekli Da\u011f\u0131t\u0131m S\u00fcrekli Da\u011f\u0131t\u0131m (Continuous Deployment - CD), modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7","og_url":"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-09-29T11:40:47+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Angular, Travis CI ve Firebase Hosting ile S\u00fcrekli Da\u011f\u0131t\u0131m","datePublished":"2025-09-29T11:40:47+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/"},"wordCount":3075,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Angular"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/","url":"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/","name":"Angular, Travis CI ve Firebase Hosting ile S\u00fcrekli Da\u011f\u0131t\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-09-29T11:40:47+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/angular-travis-ci-ve-firebase-hosting-ile-surekli-dagitim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Angular, Travis CI ve Firebase Hosting ile S\u00fcrekli Da\u011f\u0131t\u0131m"}]},{"@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\/30582","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=30582"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30582\/revisions"}],"predecessor-version":[{"id":30583,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/30582\/revisions\/30583"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=30582"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=30582"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=30582"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}