5- Continuous Integration ve Continuous Delivery nedir? Neden kullanılmalı?

Hamit SEYREK
Devops Türkiye☁️ 🐧 🐳 ☸️
5 min readMar 7, 2022

Yazılımda, bir şey acı verici olduğunda, acıyı azaltmanın yolu onu daha sık yapmaktır, daha az değil.
David Farley, Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation

İleri seviye Yazılım Geliştirme makale serisinin yine çok önemli bir konusu ile karşınızdayım. DevOps’un olmazsa olmazı CI/CD konusuna değineceğim bu yazıda. Seriyi okuyarak buraya kadar gelmişseniz sorun yok. Eğer direk bu makaleye gelmişseniz 0- İleri Seviye Yazılım Geliştirme makalesini okumanızı öneririm.

CI/CD terimini Gerek iş dünyasında gerek kendi çalışmalarınızda yaptığınız araştırmalarda duymuş olma ihtimaliniz yüksektir. Bir önceki makalenin konusu olan DevOps’un ayrılmaz bir parçasıdır.

CI (Continous Integration — Sürekli Entegrasyon) kodların geliştirildikten sonra entegre olmadan sürekli bir kontrol mekanizmasının olmasıdır. Tüm geliştiriciler belirli aralıklarla (genellikle günlük) yaptıkları değişiklikleri ana sunucuya gönderilirler. Yapılan bu değişikliklerin birbirini etkilememesi veya yeni bir soruna sebep olmaması çok önemlidir. Geliştiriciler yaptıkları her değişikliği merge etmeden önce eski commitleri incelemesi gerekmektedir. İlk başlarda pek sorun teşkil etmese de büyüyen projelerde yapılan bir değişikliğin sistem içerisinde başka bir soruna neden olup olmadığının manuel olarak kontrol edilmesi hem masraflı hem de zor olmaktadır. Çünkü orada daha önce yapılmış yüzlerce hatta binlerce merge işlemi yer alabilir. Bu durum için Integration Hell (Entegrasyon Cehennemi) tabiri kullanılır.

Bu sorunu çözmek için otomatik testler kullanılır. Testlerin bir CI sunucusunda çalıştırılması entegrasyonun sağlanması için testlerin geçilmesini gerektirdiği gibi bu tür sunucular analizler, performans ölçme ve kaynak kodun QA süreçlerini de kolaylaştırır.

Bu sürekli kalite kontrol (QA)sayesinde hem yazılım kalitesi iyileşmekte hem de entegrasyon için ayrı bir zaman harcanması gerekmediği için işlerin daha hızlı teslim edilmesi sağlanmaktadır.

CI/CD Tools

CD (Continous Delivey — Continous Deployment) sürekli doğrulama ve sürekli dağıtım manasına gelmektedir. CI ile başlayan sürekli entegrasyon CD ile sürekli olarak dağıtılır. Testler CI aşamasında çalıştırılıp uygulamanın yeni sürümü CD aşamasında dağıtılır.

CI geri besleme döngüsü kısa sürede verilen tüm proje için testlerin otomatik gerçekleşmesini sağlayarak geliştiriciye otomatik geri bildirim sağlar.

CI/CD pipeline (bir dizi işlemin gerçekleştiği boru hattı) bazı çevrelerce gereksiz görüldüğüne veya ek yük olarak aktarıldığına şahit olmuş olabilirsiniz. Ama bu tamamen yanlıştır. Çünkü bir yazılım ürününün yeni bir sürümünün ortaya çıkarılabilmesi için uygulanması gereken bazı adımlar vardır.

Yukarıdaki resimde gördüğünüz adımları arada bir CI/CD pipeline olmadan manuel olarak gerçekleştirmek çok daha fazla zaman alacağından ekibin daha düşük performans ile çalışmasına sebep olur. Bu da doğal olarak bir yazılımın maliyetini arttırır.

İyi bir Pipeline şu ana kısımlardan oluşur:

Kodun derlenmesi ve test edilmesi (Sürekli Entegrasyon)

Koddan dağıtılmaya hazır bir yapı oluşturma (Sürekli Teslimat)

Uygulamayı bir sunucuya otomatik olarak dağıtma (Sürekli Dağıtım)

İyi bir Pipeline içeren bir CI/CD ardışık düzeninde ilk adım otomatik bir tetikleme sisteminin olmasıdır. Bunun en kolay yolu CI/CD aracını bir Git deposundaki değişiklikleri kontrol edecek şekilde yapılandırmaktır. Pipeline botu hattını manuel olarak çalıştırılacak şekilde kurgularsanız bu hem maliyeti arttırır hem de bazen unutulabilir. Otomatik tetiklenen bir sistemde kodunuzun her değişiklikte test edileceğini bilmenin verdiği bir rahatlık yaşarsınız.

Otomatik tetikleme işleminden sonra tetiklenen CI aracı, kullanın Github, Bitbucket vb deposundaki kodu kontrol eder. Kodun derlenmesi ile devam eden ardışık düzen bunu Docker ile çok kolay yapabilmektedir. Docker üzerine kurulacak container yapıları ile oluşturulacak yeni ortamlarda dile uygun derleme yapılır.

Derleme aşamasından sonra test aşamasına geçilir. Testlerin doğru yürütülebilmesi için CI/CD aracı doğru yapılandırılmalıdır. Testlerin uygulanıp başarılı bir şekilde geçilmesi kadar sürdürülebilir olması da çok önemlidir. Eğer uygulamayı geliştirmeye ve yeni modüller eklemeye devam ediyorsanız ama testleri aynı doğrultuda geliştirmiyorsanız bu uygulamanın sürdürülebilirliğini tehlikeye atacaktır.

Testlerinizin büyük kısmı birim testleri olmalıdır. Birim testleri, paranızın karşılığını verir. Yazması kolay, çalıştırması ucuz ve bakımı en düşük maliyetlidir. Martin Fowler

Tüm testler başarılı bir şekilde geçildikten sonra kodu paketleme aşamasına geçebilirsiniz. Paketlemeyi nasıl yapacağınız kullandığınız programlama diline veya hedef ortamınıza bağlıdır. DevOps içinde sık kullanılan Docker’ı kullanıyorsanız bir “Docker Image” oluşturabilirsiniz.

Paketleme işlemini yaptığımıza göre artık kabul testlerine başlayabiliriz. Kabul testleri, yazılımınızın yapması gerekeni yaptığından ve orijinal gereksinimleri karşıladığından emin olmanın bir yoludur. Otomatik kabul testleri için web sitlerini açma ve bazı yerlere tıklama yapabilme gibi kullanıcı davranışlarını simüle edebilen Selenium aracını kullanabilirsiniz.

Kabul testlerini başarılı bir şekilde geçen yazılımımız son aşama olan “Teslimat ve Dağıtım” aşamasına geçebilir artık. Continous Delivery aşamasına gelmiş yazılımımızı artık Kubernetes gibi dağıtım yapmayı sağlayan bir araç sayesinde dağıtabilirsiniz (Continous Deployment).

Bundan sonra yazılımda yapacağınız her kod değişikliği tetikleme aşaması ile başlayıp gene aynı aşamalardan geçecektir. CI/CD Pipeline’nın başarılı olması için testlere, kullanım kolaylığına ve güvenliğe çok dikkat edilmelidir.

Böylece deployment, tüm proje bittikten sonra bir defa yapılan büyük korkutucu bir iş olmaktan çıkar ve düzenli yapılan kolay bir işlem halini alır.

Kusurları ne kadar erken yakalarsanız, düzeltmeleri o kadar ucuz olur.David Farley, Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation

CI/CD, yazılım geliştirme sektöründeki en etkili değişikliklerden biridir. Yazılım geliştirme sürecinizde CI/CD’yi benimsemenin bir kaç avantajını şu şekilde sıralayabiliriz:

  • CI/CD, şirketlerin yazılımlarını daha hızlı güncellemelerini ve teslim etmelerini sağladı.
  • Kontrollü remote çalışma olanağını mümkün kıldı.
  • Sürekli uygulanan testler ile daha sağlam ilerlemeyi sağladı.
  • Hataların anında geri bildirim ile developerlere iletilmesi ile hataların büyümeden çözülmesini sağladığı için zamandan tasarrufu sağladı.
  • Teslimat adımının kolaylaşmasını sağladı.

En çok kullanılan CI/CD araçları: Jenkins, CircleCI, Bamboo, TeamCity, GitLab, Travis CI, Buddy …

Bu araçların CI/CD aksiyonlarını araştırarak daha fazla kaynağa ulaşabilirsiniz. Kullanmış olduğunuz dil hangisi olursa olsun muhakkak CI/CD araçlarından bir kaç tanesi ile alakalı uygulamaya çalışın diryerek bu makaleyi sonlandırayım :)

İleri Seviye Yazılım Geliştirme serisinde:

Önceki makale: “4- DevOps nedir? Faydaları nelerdir? Ne tür araçlar kullanır?”.

Sonraki makale: “6- Agile scrum metodolojisi nedir? Yazılım geliştirme ekiplerine olan faydaları nelerdir?

Eğer faydalı olduğuna inanıyorsanız beğenmeyi unutmayın :)

Hep daha iyiye…

--

--