İyi kod yazmak, pratik ve zaman gerektirir. Günümüzde yeni teknolojileri öğrenmek, temiz ve bakımı kolay kod yazma becerilerini geliştirmekten daha cazip geliyor.
Bir yazılım ürününde en önemli konulardan biri kod kalitesidir. Kod kalitesinin belirlenmesinde kullanılan beş temel başlık vardır: güvenilirlik (reliability), güvenlik (security), verimlilik (Efficiency), sürdürülebilirlik (maintainability) ve boyut (size) dır. Bu başlıklar hakkında daha detaylı bilgi için buraya bakabilirsiniz. Tabi bu bahsedilen başlıkların gereklerini yerine getirmek ürünün geliştirme süresini uzatsa bile uzun vadede kalitenin korunmasını sağlayacaktır. Eğer kaliteden ödün verilir ise ileriki zamanlarda ödün verilen durumlarda düzeltmeye gitmek ya da değişime gitmek maliyetli olabilir ki bu gibi senaryoya Teknik Borç (Technical Debt) denilmekte.
Teknik Borç (Technical Debt): Özetle, kaliteli kod yazmak yerine hızlı teslimata öncelik verilmesi sonucu oluşan durum. Detaylı bilgi için buraya bakabilirsiniz.
Kısa bir şekilde kod kalitesi ve sonuçlarına değindikten sonra gelelim kod kalitesini nasıl ölçüp önlem alacağımız mevzusuna.
Bu yazının da konusu olan ve statik kod analizi yapan araçlardan biri olan SonarQube bize bir yukarıda bahsedilen durumlar için bir çözüm sunmaktadır. SonarQube yazılan kodu çeşitli başlıklar altında analiz eder, kaliteyi artırma önerilerinde bulunur ve rapor hazırlar. Genel olarak bu araç server tarafında CI/CD hattında kodun kalitesini artırmak için kullanılır. Hadi SonarQube aracını dockerize edip SonarLint aracına bakalım.
SonarQube
SonarQube’yi kayıtları kalıcı olarak tutması için Postgresql ile birlikte docker-compose.yml kullanarak kurulumu yapacağız.
İlk olarak sonar elastic stack kullandığından kurulumda yetersiz bellek hatası verebilmektedir. Detay için buraya bakabilirsiniz. Bu hatayı önlemek için aşağıdaki konutlar sırası ile çalıştırılmalıdır. Docker Engine kapatılıp açıldığında aşağıdaki komut tekrarlanmalıdır.
Windows için:
wsl -d docker-desktop
sysctl -w vm.max_map_count=262144
Daha sonra docker-compose.yml dosyası içine aşağıdaki komutları kaydediyoruz.
version: "2"
services:
sonarqube:
container_name: sonarqube
image: sonarqube:8.7.1-community
depends_on:
- db
ports:
- "7000:9000"
networks:
- sonarnet
environment:
- sonar.jdbc.username=sonar
- sonar.jdbc.password=sonar
- sonar.jdbc.url=jdbc:postgresql://db:5432/sonar
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
- sonarqube_temp:/opt/sonarqube/temp
ulimits:
nofile:
soft: 65536
hard: 65536
db:
container_name: postgres_sonar
image: postgres
ports:
- "7001:5432"
networks:
- sonarnet
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
volumes:
- postgresql:/var/lib/postgresql
- postgresql_data:/var/lib/postgresql/data
networks:
sonarnet:
driver: bridge
volumes:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:
sonarqube_temp:
postgresql:
postgresql_data:
Burada SonarQube portu 7000 ve Postgresql portu 7001 olarak belirledik. docker-compose up
komutu ile instanceleri ayağa kaldırıyoruz. VsCode terminalinden veya command windowdan kolaylıkla yapılabilir.
Yukarıda görüldüğü gibi ortamlarımız çalışmakta.
İlk olarak SonarQube’nin oluşturduğu veritabanına ve tablolarına bakalım. “localhost:7001” username: “sonar” password: “sonar” bilgilerini kullanarak veritabanına bağlanıyoruz.
SonarQube arayüzüne girmek için “localhost:7000” bağlantısını kullanıyoruz. Default kullanıcı adı ve şifre ile giriş yapıyoruz.
Username: admin
Password: admin
Giriş sonrasında şifre değiştirmemiz isteniyor. Şifre değişiminden sonra bizi boş bir sayfa karşılıyor.
Create new project butonuna tıklayarak “Manually” seçeneği ile projemizi oluşturuyoruz.
Proje için token oluşturuyoruz.
Buradan çalışacağımız .Net versiyonu için SonarScanner indiriyoruz. İndirilen zip dosyasını C://sonar-scanner
dizinine çıkartıp EnvironmentPath olarak kaydediyoruz. SonarScanner Java kullandığı için JavaSDK nın bilgisayarınızda yüklü olması gerekiyor.
Java SDK install: https://www.oracle.com/java/technologies/javase-jdk16-downloads.html
Not: Bu aşamada gözüken login anahtarını bir kenara kaydediyoruz.
Environment Path olarak kayıt
“SonarQube.Analysis.xml” dosyasını docker ortamımızı gösterecek şekilde değiştiriyoruz.
<SonarQubeAnalysisProperties
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.sonarsource.com/msbuild/integration/2015/1">
<Property Name="sonar.host.url">http://localhost:7000</Property>
<Property Name="sonar.login">admin</Property>
<Property Name="sonar.password">sonar</Property>
</SonarQubeAnalysisProperties>
Konsol üzerinden dotnet için sonar scanner aracını yüklüyoruz.
dotnet tool install --global dotnet-sonarscanner
SonarScanner’ı initialize ediyoruz. Bu komutu projemizin bulunduğu konumda çalıştırıyoruz. Bazı parametreler kurulumunuza göre faklılık gösterecektir.
dotnet sonarscanner begin /k:"test_project_key" /d:sonar.host.url="http://localhost:7000" /d:sonar.login="9d965b5e36167ba2bee7d745044123e5ca05c6b0"
Projemizi build ediyoruz.
dotnet build TestProject.sln
SonarScanner’i çalıştırıp kodumuzu analiz ettiriyoruz.
dotnet sonarscanner end /d:sonar.login="9d965b5e36167ba2bee7d745044123e5ca05c6b0"
Bu işlemler için SonarQube dokümanına buradan başvurabilirsiniz.
SonarQube portalda gezinerek keşfedebilir, kendinize göre analiz kuralları belirleyebilirsiniz.
SonarLint
SonarLint’e gelecek olursak, kod yazarken kalite sorunlarını tespit etmenize ve düzeltmenize yardımcı olan bir IDE eklentisidir.
Aşağıdaki resimde görüleceği gibi “S1186
” kodu ile koddaki sıkıntıyı belirtiyor. “S1186
” koduna tıklayarak sıkıntı hakkında detaylı bilgi edinilebilir.
Bu yazımda .Net için gerekli aşamaları gösterdim. Diğer diller için de analiz aşamalarına buradan bakabilirsiniz.
Sonuç: