Kod Analizi ve Güvenliği İçin Azure DevOps Pipeline İçerisinde Sonarqube Kullanımı

Ömer Faruk URHAN
5 min readMay 2, 2021

--

Merhaba, bu yazıda başlıkta da belirtildiği gibi Azure DevOps ile Sonarqube entegrasyonu yaparak basit bir java uygulaması için CI sürecini oluşturacağız. Konuya detaylı olarak başlamadan önce Azure DevOps ve Sonarqube’den kısaca bahsedelim.

Azure DevOps, Microsoft firması tarafından geliştirilmiş DevOps süreçlerini Public Cloud ortamında sunulan çeşitli imkanlar ile yönetmeniizi sağlayan bir platformdur. CI/CD süreçlerini AzureDevOps kullanarak pratik bir şekilde hayata geçirebilirsiniz. Esnek yapısı ile farklı bileşenleri bir araya getirip CI/CD süreçlerinize dahil edebilirsiniz. https://azure.microsoft.com/tr-tr/services/devops/#overview adresinden detaylı bilgi elde edebilirsiniz.

Sonarqube ise yazdığınız kodun kalitesini ve güvenliğini sürekli olarak kontrol eden ve belirli kriterlere göre kodunuzu değerlendirerek kodunuza geçer not veren ya da vermeyen bir araçtır. CI süreçlerine entegre edilerek kodunuzun “build” aşamasında kalitesini ölçmenizi sağlar. Detaylı bilgi için https://www.sonarqube.org/ adresini ziyaret edebilirisiniz.

Konumuza gelecek olursak, amacımız Azure DevOps’ta yer alan basit bir java uygulamasını build pipeline içerisinde öncesinde kuracağımız bir sonarqube endpointine göndererek taratmak ve geçer notu almış ise build işlemini devam ettirmek olacaktır. Mimarimiz aşağıdaki gibi olacaktır.

Azure DevOps projemizde, Sonarqube yazılımının kodu okuyup yazabilmesi için bir PAT (Personel Access Token) oluşturuyoruz. (Code > Read & Write)

Oluşan tokenı sonarqube Azure DevOps ALM (Application Lifecycle Management) entegrasyonu için kullanacağız.

PAT oluşturup tokenımızı kopyaladıktan sonra, Azure DevOps üzerinden erişebileceğimiz bir Sonarqube endpointine ihtiyaç duymaktayız. Bunun için Sonarqube yazılımını docker üzerinde hızlıca ayağı kaldırıyoruz. (Bu kurulum yalnızca demo maksatlı yapılmıştır. Production seviyesi Sonarqube kurulumu için Sonarqube sitesini ziyaret edebilirsiniz.)

NOT: Sonarqube konteynerini NAT arkasındaki bir network üzerinde ayağı kaldırıyorsanız, Azure DevOpsun erişebilmesi için port yönlendirmeye ihtiyaç duyulmaktadır.

docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest

Sonarqube konteyneri çalıştıktan sonra tarayıcıdan erişim sağlayıp kullanıcı adı parola (admin, admin) ile login oluyoruz.

Login olduktan sonra sonarqube üzerinde Azure Devops projemizi ALM (Application Lifecycle Management) olarak eklemek için; “Administration>ALM İntegrations>Azure DevOps>Create Configuration” adımını izliyoruz.

Create Configuration adımında Personel Access Token alanına Azure DevOps’ta oluşturulan PAT kopyalanmalıdır.

Daha sonra “Check Configuration” seçeneğini tıklayarak yapılandırmanızı doğrulayabilirsiniz.

Sonarqube yazılımında anasayfa geri gelerek yeni Azure DevOps projesi ekle seçeneği tıklanır.

Bu aşamada yine Azure DevOpsta oluşturulan PAT girilir.

List Repositories seçeneği ile Azure DevOpsta yer alan repositroy’ler listelenir.

İlgili repository seçilerek “Set up selected repository” seçeneği tıklanır.

Açılan yeni ekranda projenin nasıl analiz edileceği seçilir. Burada Azure pipelineları ile analiz edeğimiz için “With Azure Pipelines” seçeneğini tıklıyoruz.

Açılan ekranda projeyi Azure DevOps pipeline’ı ile tarayabilmek için adım adım hangi işlemlerin yapılması gerektiğini sonarqube bize tarif ediyor.

İlk adımda Azure DevOps’a Sonarqube uzantısının yüklenmesi isteniyor

Bunun için “Sonarqube extention” linki açlılır ve “Get it free” seçeneğine tıklanarak Azure DevOpsa sonarqube eklentisi kurulur.

İkinci adımda Azure DevOps projesinin Sonarqube endpointine erişebilmesi için “service connection” eklenmesi tarif ediliyor. Belirtilen adımlar izlenerek “service connection” eklenir.

Üçüncü adımda build işlemini nasıl yaptıracağınızı seçmeniz isteniyor. Burada test uygulamamız java ile yazıldığı için “Maven” ile build ettirmek istiyoruz. Maven’ı seçtiğinizde Azure DevOpsta adım adım neler yapmanız gerektiği anlatılıyor.

  1. Build pipeline içerisinde build işlemi öncesi “Prepare Analysis Configuration” taskı eklenir ve devamında “Sonarqube Server Endpoint” olarak daha önce tanımladığımız “service connection” seçilir. “Choose the way to run the analysis” bölümünde “Integrate with Maven or Gradle” işareti tıklanır ve son olarak Advanced>Additional Properties bölümüne sonarqubede belirtilen “sonar.projectkey” değişkeni eklenir.

2. Pipeline’a Maven task eklenir ve “Code Analyz” bölümü altında “Run SonarQube or SonarCloud Analyz” seçeneği işaretlenir.

3. Pipeline’a “Publish Quality Gate Result” adımı eklenerek sonuçların Azure DevOps’tan Sonarqube raporlanması sağlanır.

4. Son adım olarak pipeline’da “Triggers” bölümünde “Enable continuous integration” tıklanıp projenin master brach’i seçilir. Böylece ayarlar tamamlanmış olacaktır.

E

Reponuza bir commit yaptığınızda veya pipeline’nı doğrudan çalıştırdığınızda proje kodlarınız taranacak ve ilgili rapor sonarqubede yer alan projenizin altına gönderilecektir. Kodunuzun uygunluk durumuna göre build işlemi başarılı veya başarısız olarak tamamlanacaktır. Şimdi pipeline’ı tetikleyip akışı izleyelim.

Pipeline çalışması tamamlandığında aşağıdaki gibi bir rapor görünteleyeceksiniz.

Bu aşamada sonarqube uygulamasında oluşturduğunuz projeye giderek raporu görüntüleyebilirsiniz.

Raporun detaylarını incelediğinizde kodunuzla ilgili sunulan öneriler/düzeltmeler ve güvenlik tarafında yapmanız gereken iyileştirmeleri ayrıntılı olarak görüntüleyebilirsiniz. Yazıda test olarak kullanılan java uygulamasına https://github.com/omerurhan/spring adresinden erişip test maksatlı olarak kullanabilirsiniz. İyi çalışmalar.

--

--