
Mükemmel bir dünyada başlamak için sorunsuz bir kod yazardık. Kesinlikle mükemmel bir dünyada yaşamıyoruz ve hatasız kod bir hayaldir, ancak kodumuzu analiz ediyorsak ve ortaya çıkan sorunları düzeltmek için emek harcıyorsak, daha etkili kod yazmaya devam edebiliriz. Yazımda bu bağlamda karşımıza çıkan SonarQube aracını anlatmak istedim.
SonarQube, 20’den fazla programlama dilinde hataları, kod analizlerini ve güvenlik açıklarını tespit etmek için kodun statik analizi ile otomatik incelemeler yapmak üzere kod kalitesinin sürekli denetimi için Sonar Source tarafından geliştirilen açık kaynaklı bir platformdur. SonarQube, yinelenen kod, kodlama standartları, birim testleri, kod kapsamı, kod karmaşıklığı, yorumlar, hatalar ve güvenlik açıkları hakkında raporlar sunar.Kod analizini manuel olarak gerçekleştirebilir veya Jenkins, Azure DevOps ve Bamboo gibi CICD DevOps araçlarıyla entegre edebiliriz. Ayrıca SonarQube’u Visual Studio ve Eclipse gibi IDE araçlarınızla entegre edebilirsiniz. SonarQube, kodunuzu tehlikeye atan güvenlik açıklarını düzelterek hataları ve uygulama güvenliğini önleyerek kod güvenilirliği sağlar. SonarQube açık kaynaklı bir platformdur. Statik kod analizi ve kod kalitesinin sürekli denetimi için kullanılır. SonarQube, hataları, kod kokularını ve güvenlik açıklarını algılayabilir. SonarQube, geliştiricilere daha temiz ve daha güvenli kod yazma olanağı sağlar. SonarQube, kodunuzu tehlikeye atan güvenlik açıklarını düzelterek hataları ve uygulama güvenliğini önleyerek kod güvenilirliği sağlar. SonarQube, Jenkins, Azure DevOps, GitHub, GitLab, Bitbucket ve çok daha fazlası gibi CI / CD araçlarıyla entegre olabilir.
Ön koşullar:
OS - Ubuntu 18.04 / 16.04 LTS / Debian /
Centos /Rhel 7RAM - 4GB Minimum RAM
CPU - 1vCPU
JAVA - Oracle JRE 11 or OpenJDK 11
Nedir bu SonarQube?
Projenizdeki kodların belirli kurallara uyup uymadığını denetleyen bir araçtır. Bu denetlemeyi yaparken kodu derlemez. Server olarak kurulur ve projenizdeki hataları gösterir. Ayrıca size bu hataların nasıl düzeltilebileceği konusunda örnek verir. SonarQube bu aşamada ekiplere zaman kazandırmasıyla beraber, daha güvenilir analizler sunuyor. Kaynak kod analizi tamamlandığında, yazılımın tüm güvenlik kusurlarını, kod stili ihlallerini, bağımlılık grafiklerini, blokların, işlevlerin, sınıfların, dosyaların karmaşıklığının yanı sıra kontrol ve veri akışını da analiz olarak detaylı bir şekilde gösteriyor. Jenkins, Azure DevOps, TeamCity, Bamboo gibi sürekli entegrasyon motorlarıyla da kolayca entegre olabiliyor.
Başlarken
Başlamadan önce, sisteminizi en son sürümle güncellemeniz gerekecektir. Bunu aşağıdaki komutu çalıştırarak yapabilirsiniz:
sudo apt-get update -y sudo apt-get upgrade -y
Java’yı yükleyin
SonarQube Java dilinde yazılmıştır, bu nedenle sisteminize Java yüklemeniz gerekecektir. Öncelikle, aşağıdaki komutla Java havuzunu ekleyin:
sudo add-apt-repository ppa:webupd8team/java
Ardından, depoyu güncelleyin ve aşağıdaki komutla Java’yı yükleyin:
sudo apt-get update -y sudo apt-get install oracle-java8-installer -y
Java yüklendikten sonra, aşağıdaki komutu kullanarak Java sürümünü kontrol edin:
java -version
Çıktı:
openjdk version "1.8.0_292" OpenJDK Runtime Environment (build 1.8.0_292-8u292-b10-0ubuntu1~18.04-b10) OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)
PostgreSQL’i Kurun ve Yapılandırın
Varsayılan olarak, PostgreSQL’in en son sürümü Ubuntu 18.04 varsayılan deposunda mevcut değildir. Bu nedenle, PostgreSQL deposunu sisteminize eklemeniz gerekecektir.
Bunu aşağıdaki komutla yapabilirsiniz:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list' sudo wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O - | sudo apt-key add -
Ardından, depoyu güncelleyin ve aşağıdaki komutla PostgreSQL’i kurun:
sudo apt-get update -y sudo apt-get install postgresql postgresql-contrib
Kurulum tamamlandıktan sonra, aşağıdaki komutla PostgreSQL’in durumunu kontrol edin:
sudo systemctl status postgresql
Çıktı:
postgresql.service - PostgreSQL RDBMS Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled) Active: active (exited) since Sun 2021-05-16 17:05:52 +03; 5h 47min ago Main PID: 1635 (code=exited, status=0/SUCCESS) Tasks: 0 (limit: 4663) CGroup: /system.slice/postgresql.service May 16 17:05:52 osman-Virtual-Machine systemd[1]: Starting PostgreSQL RDBMS... May 16 17:05:52 osman-Virtual-Machine systemd[1]: Started PostgreSQL RDBMS.
Ardından, aşağıdaki komutla postgres kullanıcısına geçin:
sudo su - postgres
Ardından, aşağıdaki komutla bir sonar kullanıcısı oluşturun:
createuser sonar
Ardından, aşağıdaki komutla PostgreSQL kabuğuna geçin:
psql
Ardından, sonar kullanıcısı için şifre belirleyin ve aşağıdaki komutla bir sonar veritabanı oluşturun:
ALTER USER sonar WITH ENCRYPTED password 'password'; CREATE DATABASE sonar OWNER sonar;
Ardından, PostgreSQL kabuğundan çıkarın:
\q
SonarQube’u Kurun ve Yapılandırın
Önce, aşağıdaki komutla SonarQube için bir kullanıcı oluşturun:
sudo adduser sonar
Ardından, aşağıdaki komutla SonarQube’un en son sürümünü indirin:
sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.0.zip
İndirme işlemi tamamlandığında, indirilen dosyayı aşağıdaki komutla açın:
unzip sonarqube-8.0.zip
Ardından, çıkarılan dizini aşağıdaki komutla / opt klasörüne kopyalayın:
sudo cp -r sonarqube-8.0 /opt/sonarqube
Ardından, aşağıdaki komutla sonar kullanıcısına sahiplik verin:
sudo chown -R sonar:sonar /opt/sonarqube
Daha sonra, SonarQube’u bir sonar kullanıcısı olarak çalışacak şekilde yapılandırmanız gerekecektir. Bunu aşağıdaki komutla yapabilirsiniz:
sudo vim /opt/sonarqube/bin/linux-x86-64/sonar.sh
Aşağıdaki değişiklikleri yapın:
RUN_AS_USER = sonar
Dosyayı kaydedin ve kapatın. Ardından, SonarQube varsayılan yapılandırma dosyasını açın ve veritabanı kimlik bilgilerini daha önce oluşturduğumuzla değiştirin:
sudo nano /opt/sonarqube/conf/sonar.properties
Aşağıdaki değişiklikleri yapın:
sonar.jdbc.username = sonar sonar.jdbc.password = şifre sonar.jdbc.url = jdbc: postgresql: // localhost / sonar sonar.web.host = 127.0.0.1 sonar.search.javaOpts = -Xms512m -Xmx512m
Bitirdiğinizde dosyayı kaydedin ve kapatın.
SonarQube için Systemd Hizmet dosyasını oluşturun
Ardından, SonarQube hizmetini yönetmek için bir systemd hizmet dosyası oluşturmanız gerekecektir. Bunu aşağıdaki komutla yapabilirsiniz:
sudo vim /etc/systemd/system/sonar.service
Aşağıdaki satırları ekleyin:
[Unit] Description=SonarQube service After=syslog.target network.target [Service] Type=forking ExecStart=/opt/sonarqube/bin/linux-x86-64/sonar.sh start ExecStop=/opt/sonarqube/bin/linux-x86-64/sonar.sh stop User=sonar Group=sonar Restart=always [Install] WantedBy=multi-user.target
Bitirdiğinizde dosyayı kaydedin ve kapatın. Ardından, SonarQube hizmetini başlatın ve aşağıdaki komutla önyükleme zamanında başlamasını etkinleştirin:
sudo systemctl start sonar sudo systemctl enable sonar
SonarQube hizmetinin durumunu aşağıdaki komutla kontrol edebilirsiniz:
sudo systemctl status sonar
Çıktı:
sonar.service - SonarQube service Loaded: loaded (/etc/systemd/system/sonar.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2021-05-16 18:01:27 +03; 5h 17min ago Process: 6067 ExecStop=/opt/sonarqube/bin/linux-x86-64/sonar.sh stop (code=exited, status=0/SUCCESS) Process: 6220 ExecStart=/opt/sonarqube/bin/linux-x86-64/sonar.sh start (code=exited, status=0/SUCCESS) Main PID: 6279 (wrapper) Tasks: 187 (limit: 4663) CGroup: /system.slice/sonar.service ├─6279 /opt/sonarqube/bin/linux-x86-64/./wrapper /opt/sonarqube/bin/linux-x86-64/../../conf/wrapper.conf wrapper.syslog.ident=Sonar ├─6297 java -Dsonar.wrapped=true -Djava.awt.headless=true -Xms8m -Xmx32m -Djava.library.path=./lib -classpath ../../lib/jsw/wrapper ├─6328 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInit ├─6445 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/opt/sonarqub └─6512 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/opt/sonarqub May 16 18:01:27 osman-Virtual-Machine systemd[1]: Starting SonarQube service... May 16 18:01:27 osman-Virtual-Machine sonar.sh[6220]: Starting SonarQube... May 16 18:01:27 osman-Virtual-Machine sonar.sh[6220]: Started SonarQube. May 16 18:01:27 osman-Virtual-Machine systemd[1]: Started SonarQube service.
Apache’yi SonarQube için yapılandırma
Varsayılan olarak SonarQube, 9000 numaralı bağlantı noktasını dinler. Bu nedenle, 80 numaralı bağlantı noktasını kullanarak SonarQube’ye erişmek için Apache’yi ters proxy olarak kurmanız ve yapılandırmanız gerekir.
Bunu yapmak için, aşağıdaki komutla Apache’yi kurun:
sudo apt-get install apache2 -y
Ardından, aşağıdaki komutla mod_proxy modülünü etkinleştirin:
sudo a2enmod proxy sudo a2enmod proxy_http
Ardından, aşağıdaki komutla SonarQube için bir Apache sanal ana bilgisayar dosyası oluşturun:
sudo vim /etc/apache2/sites-available/sonar.conf
Aşağıdaki satırları ekleyin:
<VirtualHost *: 80> ServerName example.com ServerAdmin [email protected] ProxyPreserveHost On ProxyPass / http://127.0.0.1:9000/ ProxyPassReverse / http://127.0.0.1:9000/ TransferLog / var / log / apache2 / sonarm_access.log ErrorLog /var/log/apache2/sonar_error.log </VirtualHost>
Example.com’u kendi alan adınızla değiştirin. Dosyayı kaydedin ve kapatın. Ardından, SonarQube sanal ana bilgisayar dosyasını aşağıdaki komutla etkinleştirin:
sudo a2ensite sonar
Son olarak, aşağıdaki komutla tüm değişiklikleri uygulamak için Apache ve SonarQube hizmetini yeniden başlatın:
sudo systemctl restart apache2 sudo systemctl restart sonar
Varsayılan olarak SonarQube, günlüklerini / opt / sonarqube / logs dizininde depolar. SonarQube günlüğünü aşağıdaki komutla kontrol edebilirsiniz:
sudo tail -f /opt/sonarqube/logs/sonar.log
Çıktı:
2021.05.16 18:01:27 INFO app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='es', ipcIndex=1, logFilenamePrefix=es]] from [/opt/sonarqube/elasticsearch]: /opt/sonarqube/elasticsearch/bin/elasticsearch -Epath.conf=/opt/sonarqube/temp/conf/es 2021.05.16 18:01:27 INFO app[][o.s.a.SchedulerImpl] Waiting for Elasticsearch to be up and running 2021.05.16 18:01:28 INFO app[][o.e.p.PluginsService] no modules loaded 2021.05.16 18:01:28 INFO app[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.transport.Netty4Plugin] 2021.05.16 18:01:36 INFO app[][o.s.a.SchedulerImpl] Process[es] is up 2021.05.16 18:01:36 INFO app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='web', ipcIndex=2, logFilenamePrefix=web]] from [/opt/sonarqube]: /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/opt/sonarqube/temp -Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError -cp ./lib/common/*:./lib/server/*:/opt/sonarqube/lib/jdbc/postgresql/postgresql-42.2.1.jar org.sonar.server.app.WebServer /opt/sonarqube/temp/sq-process7837679281658472141properties 2021.05.16 18:01:47 INFO app[][o.s.a.SchedulerImpl] Process[web] is up 2021.05.16 18:01:47 INFO app[][o.s.a.p.ProcessLauncherImpl] Launch process[[key='ce', ipcIndex=3, logFilenamePrefix=ce]] from [/opt/sonarqube]: /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/opt/sonarqube/temp -Xmx512m -Xms128m -XX:+HeapDumpOnOutOfMemoryError -cp ./lib/common/*:./lib/server/*:./lib/ce/*:/opt/sonarqube/lib/jdbc/postgresql/postgresql-42.2.1.jar org.sonar.ce.app.CeServer /opt/sonarqube/temp/sq-process3401750315698922579properties 2021.05.16 18:01:51 INFO app[][o.s.a.SchedulerImpl] Process[ce] is up 2021.05.16 18:01:51 INFO app[][o.s.a.SchedulerImpl] SonarQube is up
Aşağıdaki komutu kullanarak SonarQube web günlüğünü de kontrol edebilirsiniz:
sudo tail -f /opt/sonarqube/logs/web.log
Çıktı:
2021.05.16 18:01:47 INFO web[][o.s.s.s.RenameDeprecatedPropertyKeys] Rename deprecated property keys 2021.05.16 18:01:47 INFO web[][o.s.s.p.w.MasterServletFilter] Initializing servlet filter [email protected] [pattern=UrlPattern{inclusions=[/api/measures/component/*, ...], exclusions=[/api/properties*, ...]}] 2021.05.16 18:01:47 INFO web[][o.s.s.p.w.MasterServletFilter] Initializing servlet filter [email protected] [pattern=UrlPattern{inclusions=[/api/properties/*], exclusions=[]}] 2021.05.16 18:01:47 INFO web[][o.s.s.p.w.MasterServletFilter] Initializing servlet filter [email protected] [pattern=UrlPattern{inclusions=[/api/components/bulk_update_key, ...], exclusions=[]}] 2021.05.16 18:01:47 INFO web[][o.s.s.p.w.MasterServletFilter] Initializing servlet filter [email protected] [pattern=UrlPattern{inclusions=[/sessions/init/*], exclusions=[]}] 2021.05.16 18:01:47 INFO web[][o.s.s.p.w.MasterServletFilter] Initializing servlet filter [email protected] [pattern=UrlPattern{inclusions=[/oauth2/callback/*], exclusions=[]}] 2021.05.16 18:01:47 INFO web[][o.s.s.p.w.MasterServletFilter] Initializing servlet filter [email protected] [pattern=UrlPattern{inclusions=[/api/authentication/login], exclusions=[]}] 2021.05.16 18:01:47 INFO web[][o.s.s.p.w.MasterServletFilter] Initializing servlet filter [email protected] [pattern=UrlPattern{inclusions=[/api/authentication/logout], exclusions=[]}] 2021.05.16 18:01:47 INFO web[][o.s.s.p.w.MasterServletFilter] Initializing servlet filter [email protected] [pattern=UrlPattern{inclusions=[/api/authentication/validate], exclusions=[]}] 2021.05.16 18:01:47 INFO web[][o.s.s.p.Platform] WebServer is operational
SonarQube’a erişim
SonarQube artık kurulmuş ve yapılandırılmıştır. Web tarayıcısı üzerinden erişme zamanı.
Web tarayıcınızı açın ve http://example.com URL’si ile veya http://127.0.0.1:9000/ yazın. Aşağıdaki sayfaya yönlendirileceksiniz:
Burada Oturum Aç düğmesine tıklayın. Aşağıdaki sayfayı görmelisiniz:
Varsayılan yönetici hesabı kullanıcı adını ve şifresini admin / admin olarak girin ve Oturum Aç düğmesine tıklayın. SonarQube varsayılan kontrol panelini aşağıdaki sayfada görmelisiniz:
Tebrikler! SonarQube’u Ubuntu 18.04 sunucusuna başarıyla yüklediniz. Artık SonarQube kullanarak kolayca otomatik incelemeler gerçekleştirebilir ve bir uygulamanın sağlığını kontrol edebilirsiniz. Bir Sonraki Sonarqube basit düzeyde bir Proje nasıl test edilir ondan bahsedecedeğim. Takipte kalalım arkadaşlar 😀
Bir yanıt bırakın