.NET Core MVC Projelerinde Azure DevOps ile Uygulama Versiyonu Göstermek

Emre Kayacık
Ford Otosan
Published in
5 min readOct 13, 2023

Yazılım takımlarının portföylerinde birçok uygulama ve proje bulunuyor. Bu projelerin sayısı arttıkça, hangi projenin hangi sürümünde olduğunu takip etmek de bir hayli zorlaşıyor. Ayrıca iş birimi tarafından mail ile veya ekran görüntüsü ile gelen hataların uygulamanın hangi sürümünden olduğunu belirlemek bazı durumlarda içinden çıkılmaz bir hal alabiliyor. Bazen iletilen hata, yazılım takımına ulaşana kadar uygulamaya yeni bir release çıkılmış, dolayısıyla uygulamanın sürümü değişmiş olabiliyor. Bu gibi durumlarda uygulamalarımızın hangi sürümünde olduğunu göstermek bizlere birçok yarar sağlıyor. Bu yazıda, Azure DevOps ile .NET Core uygulamalarında uygulama versiyonunun/release numarasının basit bir şekilde nasıl gösterilebileceğini konu edineceğim.

Uygulama Versiyonu Göstermek Neden Önemlidir?

Uygulama versiyonu göstermek, projenizin daha iyi yönetilmesini, iletişimin artmasını, hataların tespitinin kolaylaşmasını ve sorunların daha hızlı çözülmesini sağlar.

1- Takip, İzleme Kolaylığı ve Proje Yönetiminin Kolaylaşması:

Uygulamalarda release numarasını göstermek, özellikle portföyünde birçok uygulama bulunan takımlar için proje yönetimini kolaylaştırır, hangi projenin hangi sürümünde olduğunu kolaylıkla tespit edebilmeyi sağlar. Bu, geliştirme sürecini ve sürümleri daha iyi yönetmenize katkı sağlar.

2- Hata Tespiti ve Sorun Giderme:

Her bir sürüm veya pipeline için bir numara veya kimlik belirlemek, daha sonra bunları uygulamada göstermek hata tespiti ve sorun gidermeyi kolaylaştırır. Bir hata raporu veya geri bildirim aldığınızda, hangi sürümün veya pipeline’ın etkilendiğini hızlıca belirleyebilirsiniz.

3- Sürüm Yönetimi ve Geri Dönme İmkânı:

Eğer bir sürümde beklenmedik bir sorun ortaya çıkarsa, size gelen hata raporu, mail veya ekran görüntüsündeki uygulama versiyonu sayesinde önceki sürümlere kolaylıkla geri dönme imkânınız olur. Böylece acil bir durumda hızlıca düzeltme yapabilirsiniz.

Dilerseniz adımları uygulamaya başlayalım.

ASP.NET Core MVC projelerinde versiyonlama

1- ASP.NET Core MVC projemizde appsettings.json dosyamıza “Application” içerisine ApplicationVersion key’i ile bir variable tanımlayalım. Değerini şimdilik boş bırakabiliriz.

"Application": {
"ApplicationVersion": ""
}

2- Tanımladığımız bu variable’ı uygulamanın versiyonunu göstermek istediğimiz dosyada kullanalım. Bunun için 2 farklı yol göstereceğim, ben ikinci seçeneği daha düzenli bulduğum için onu tercih ediyorum. Alternatif çözümleri 2.1 ve 2.2 şeklinde aktarıyor olacağım, seçim tamamen size ait.

2.1- Örneğin Layout view’ımızda veya navbar’ımızda “@Configuration.GetSection(“Application”)[“ApplicationVersion”]” Kodu ile ilgili variable’a ait value’yu getirebiliriz. Bu kısımda .cshtml dosyamızda ilgili using ve inject’i sayfanın en üstüne ekleyelim.

@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration

Daha sonra .cshtml dosyamızda versiyonu göstermek istediğimiz yere ilgili kodu ekliyoruz (Örneğin Layout).

@Configuration.GetSection("Application")["ApplicationVersion"]

2.2- Bu çözüme alternatif olarak daha düzenli bir çözüm olan “Options Pattern” da kullanabiliriz.

Öncelikle appsettings.json’daki “Application” bölümünü almak istediğimiz için Appsettings.cs isminde bir dosya oluşturalım ve içine ilk adımda tanımladığımız “Application” içindeki ilgili key’leri ekleyelim.

public class AppSettings
{
public string ApplicationVersion { get; set; }
}

Daha sonra .NET Core MVC uygulamamızın Program.cs (.NET 6 dan öncesi için Startup.cs) dosyasında ilgili sınıfı daha sonra kullanabilmek için konfigüre edelim.

var Builder = WebApplication.CreateBuilder(args);
...

IMvcBuilder builder = Builder.Services.AddRazorPages();
...

builder.Services.Configure<AppSettings>
(Builder.Configuration.GetSection("Application"));

Daha sonra versiyonu göstermek istediğimiz .cshtml dosyamızda (örneğin Layout) ilgili using ve inject’i sayfanın en üstüne ekleyelim. Buradaki using AppSettings.cs dosyasının bulunduğu namespace.

@using FordOtosan.Project.Common.AppSettings;
@inject Microsoft.Extensions.Options.IOptions<AppSettings> AppSettings

Daha sonra .cshtml dosyamızda versiyonu göstermek istediğimiz yere ilgili kodu ekleyelim (Örneğin Layout).

<p>
@AppSettings.Value.ApplicationVersion
</p>

Böylelikle appsettings.json içinde uygulama versiyonunu tutan bir key tanımladık ve bunu uygulama içinde kullandık.

Şimdi Azure DevOps CI/CD üzerinde, pipeline her tetiklendiğinde bu versiyonu nasıl güncelleyebileceğimize geçelim.

3- Azure DevOps üzerinde Pipelines > Releases a gidelim

Azure DevOps Menü

4- Versiyonlamak istediğimiz uygulamayı soldan seçip “Edit” butonuna basalım

Releases

5- Düzenleme ekranında job’larımızın ve task’larımızın olduğu bölüme girelim.

Eğer DEV-TEST-PROD gibi ortamlarınız varsa, test sistemi için TEST kısmına veya prod için PROD kısmına vb. aynı aşamaları uygulamamız gerekiyor.

6- Açılan ekranda File Transform task’ına girelim. Bu task Azure tarafından sağlanan bir task. Mantık olarak içinde Variable Substitution olan taskı kullanıyoruz çünkü biraz sonra appsettings.json dosyamızdaki ApplicationVersion değişkenini her release çıkıldığında değiştirmek (substitute) istiyoruz. Şu anda bunu XML ve JSON olarak yapabiliriz.

Biz uygulamalarımızın CI/CD süreçlerinde File Transform kullandığımız için bu task üzerinden anlatıyor olacağım, farklı bir task da kullanabilirsiniz (Azure App Service Deploy vb.) detaylı bilgi için bkz: File transforms and variable substitution reference

7- File Transform task’ımızın özelliklerini aşağıda gösterildiği şekilde değiştirelim. Burada görüldüğü üzere XML ve JSON olmak üzere iki seçeneğimiz var. Biz uygulamamızda appsettings.json kullandığımız için bu kısımda JSON olarak ilerliyoruz.

Package or folder: Paket veya bir uygulamanın bulunduğu klasörün dosya yolu. Bu kısımda Wildcard karakterler destekleniyor. Örneğin, $(System.DefaultWorkingDirectory)/**/*.zip

File format: JSON veya XML seçebiliriz. XML seçersek, uygulamanın ayarlarının bulunduğu dosyada(örneğin Web.Config), appSettings içinde “key” olarak tanımladığımız değişkenleri değiştirebiliyoruz(substitute). JSON için ise .json uzantılı dosyaların içindeki, json yapılarının değişkenlerini değiştirebiliyoruz(substitute).

Target files: Değişkenlerini değiştirmek(substitude) istediğimiz dosyaların yolunu belirlediğimiz yer. Burada enter tuşu ile yeni satıra geçerek birden çok dosya da tanımlayabiliyoruz. Dosya adlarını kök klasöre göre gösteriyoruz.

Böylece; uygulamamızın klasörünü, hangi dosya formatını kullanacağımızı ve klasörün içindeki appsettings.json dosyasının yolunu belirlemiş olduk.

8- Yukarıdan “Variables” sekmesine geçelim

ve “Pipeline Variables” bölümüne girelim.

9- Yeni bir variable ekleyelim.

Name: Application.ApplicationVersion

Value: $(Release.ReleaseName)

Scope: TEST(versiyonlama hangi ortamda yapılacaksa)

Settable at release time: checked

Not: Value kısmında göstermek istediğimiz wildcard’ı kullanabiliriz. Örneğin $(Release.ReleaseName) Release Name’i(v4.7, Release47 vb.) gösterirken $(Build.BuildNumber) pipeline build numarasını gösterir. Hatta bunlara ek olarak release’in çıktığı tarihi vb. de gösterebilirsiniz. Örneğin: $(Date:yyyyMMdd)

Tümü için bkz: Classic release and artifacts variables

10- Değişiklikleri “Save” butonuna basarak kaydedelim.

11- Uygulamamızdaki değişiklikleri TEST(veya işlemler hangi ortam için yapıldıysa) ortamına aktaralım ve pipeline’ı Pipelines sekmesinden manuel olarak veya otomatik olarak çalıştıralım.

Sonuç:

Release66

Yeni bir release çıktığımızda:

Release67

Sonuç olarak; yazılım projelerinde uygulama versiyonunu göstermek geliştirme süreçlerini daha verimli hale getiren, geliştiriciler için hata yönetimini kolaylaştıran ve iletişimi artıran önemli bir uygulamadır.

--

--