SonarQube + PostgreSql + Docker + .NET Core

İ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.

C://sonar-scanner dizini

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ç:

guest
0 Comments
Inline Feedbacks
View all comments
0
Düşünceleriniz değerlidir, lütfen yorum yapın.x
()
x