Sürüm ve Versiyon Yönetimini Nasıl Yapıyoruz?

Bir uygulamanın canlı (production) sunucularda çalışabilir hale gelmesi için bu uygulamanın bir sürümünün (release) oluşturulması gerekmektedir. Her sürüm belli bir versiyon numarasına sahip olup, kullanıma açılmak istenen (deployment) uygulama özelliklerini ihtiva etmektedir. Biz geliştirdiğimiz uygulamalarımızda semantik versiyonlama yöntemini kullanıyoruz. Örneğin 2.1.4.20 şeklinde bir versiyon numarasında 2 majör, 1 ise minör değişikliklere işaret etmektedir. 4 rakamı bu minör versiyonda yapılan bugfixleri (patch) ihtiva etmektedir. 20 rakamı bu minör sürümde aldığımız build adedidir.
Majör değişiklikler genelde API genelinde büyük değişikliklerin habercisidir ve kullanıcılarının (client) yeniden yapılandırılmalarını gerekli kılabilirler. Buna kıyasla minör değişiklikler kullanıcı için bir problem teşkil etmezler ve bu seviyede birbirleri ile kullanım açısından uyumludurlar. Bu yazımda bizim versiyon ve sürüm yönetimini nasıl yaptığımızı sizlerle paylaşmak istiyorum. Geliştirmekte olduğumuz uygulama aşağıdaki diagramda yer alan komponentlerden oluşuyor.

Backend komponenti Java ve Spring boot ile implemente ettiğimiz ve mobil uygulamalarımız tarafından kullanılan API’yi ihtiva ediyor. Bunun yanı sıra backend bünyesinde angular ile implemente ettiğimiz yönetim panelleri (Web UI) var. Backend’i API ve Web UI komponentlerinin bir arada yer aldığı bir monolit olarak deploy ediyoruz, bu yüzden aynı versiyon numarasını taşıyorlar.
Mobil uygulamalarımızı flutter ile geliştiriyoruz. Orada da semantik versiyonlama yöntemi ile gerekli sürümleri oluşturuyoruz. Görüldüğü gibi mobil uygulamalar backend bünyesinde yer alan API’ye bağımlılar ve orada meydana gelen değişiklikler mobil uygulamaları doğrudan etkilemekte. Normal şartlar altında backend ve mobil uygulamalar kendilerine has farklı versiyon numaları taşırlar. Biz bahsettiğim bağımlılığı sürüm yönetimi bazında daha iyi yönetebilmek için her iki tarafı da aynı versiyon numarası ile yapılandırıyoruz.

Uygulama sürüm alınacak aşamaya geldikten sonra yazılımı durdurarak (code freeze) öncelikle mobil uygulamalar ve backend için birer git release branch oluşturuyoruz.

Bu noktadan itibaren develop bünyesinde uygulamanın geliştirilmesine devam edilebilir. Sürüm için gerekli tüm değişiklikler ve bugfixler release branch bünyesinde yapılır. Bu değişikliler daha sonra develop branch’ına backport edilir.
Mobil uygulamalar backend ile iletişimlerini belli bir adres üzerinden HTTPS protokolü aracılığı ile gerçekleştiriyorlar. Bu noktada mobil uygulamaları ve backend’i birlikte uyumlu çalışmaya zorlayan bir mekanizma mevcut değil. Teknik olarak mobil uygulamalar belli bir backend versiyonuna bağımlı değiller. Bunu API son noktalarını (endpoint) versiyonlayarak yapmak mümkün. Burada da yine aktif olarak versiyonların yönetilmesi hatta parallelde birden fazla versiyonun çalışır durumda olması gerekebilmekte. Biz bunun yerine mobil uygulamaların en son çalışır halde olduğu backend kodundan mobil uygulamanın versiyon numarası ile sürüm oluşturuyoruz. Bunu backend tarafında mobil uygulama versiyon numarasını taşıyan bir relese branch (release/2.1.4) oluşturarak, başlatıyoruz.
Bizi bu şekilde versiyonlamaya iten başka bir neden daha bulunuyor. Geliştirdiğimiz mobil uygulamaların appstore ve playstore bünyesinde kullanılabilir hale gelmeleri için değişik test evrelerinden geçmeleri gerekiyor ve uygulamaların bu platformların sahipleri tarafından onaylanması zaman alan bir süreç. Bu zaman zarfından çıkılan uygulamanın çalıştığı bir backend versiyonunun çalışır durumda tutulması gerekiyor, çünkü bu platformları işletenler uygulamayı çalışır halde gözden geçirmek istiyorlar. Bu durumda canlı sunucularına herhangi bir backend versiyonunu çıkmak test evresindeki uygulamaları çalışmaz hale getirebilmekte. Bu sebeple appstore ve playstore için yeni bir sürüm oluşturduğumuzda, backend kodunu aynı versiyon ile sürüm haline getirip, canlıya alıyoruz. Bu işlemi her yeni uygulama sürümü ile tekrarlıyoruz. Yeni bir backend sürümü oluşturmayı tetikleyen her daim appstore ve playstore için oluşturduğumuz yeni uygulama sürümü oluyor.
EOF (End Of Fun)
Özcan Acar