SonarQube требует наличие Java и базы данных(PostgreSQL,MySQL,Oracle и т.д)
Установка Java
1 |
# apt-get update && apt-get install default-jdk |
1 |
# update-alternatives --config java |
1 2 |
There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java Nothing to configure. |
1 |
# nano /etc/environment |
1 |
JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64" |
1 |
# source /etc/environment |
1 |
# echo $JAVA_HOME |
1 |
/usr/lib/jvm/java-8-openjdk-amd64 |
1 |
# java -version |
1 2 3 |
openjdk version "1.8.0_181" OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-0ubuntu0.16.04.1-b13) OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode) |
В качестве базы данных используем MySQL
Установка и базовая настройка MySQL
1 |
# apt-get update && apt-get install mysql-server |
1 |
# mysql_secure_installation |
1 |
# cat /root/.my.cnf |
1 2 3 |
[client] user=root password=mypassword |
1 |
# chmod 400 /root/.my.cnf |
Создаем базу данных sonarqube ,пользователя sonarqube с правами к этой базе данных с паролем sonarpassword
1 |
# mysql -e "CREATE DATABASE sonarqube CHARACTER SET utf8 COLLATE utf8_general_ci;" |
1 |
# mysql -e "grant all privileges on sonarqube.* to sonarqube@localhost identified by 'sonarpassword'" |
1 |
# mysql -e "flush privileges;" |
Установка и настройка SonarQube
Скачиваем последнюю весрию 6 или 7-й версии SonarQube
https://sonarsource.bintray.com/Distribution/sonarqube/
Например, на момент написания статьи последня 6-я версия — 6.7.5
1 |
# cd /opt && wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-6.7.5.zip |
1 |
# unzip sonarqube-*.zip && rm -f sonarqube-*.zip && mv sonarqube-* sonarqube |
Настраиваем конфигурационный файл SonarQube
1 |
# nano /opt/sonarqube/conf/sonar.properties |
1 2 3 4 5 6 7 |
sonar.jdbc.username=sonarqube sonar.jdbc.password=sonarpassword sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false sonar.web.host=0.0.0.0 sonar.web.port=9000 sonar.web.context= |
Создание пользователя/группы sonar
1 |
# groupadd sonar |
1 |
# useradd -g sonar -m -r -s /bin/false sonar |
1 |
# chown -R sonar:sonar /opt/sonarqube |
Определяем имя пользователя, от которого будет запускаться SonarQube
1 |
# nano +48 /opt/sonarqube/bin/linux-x86-64/sonar.sh |
1 |
RUN_AS_USER=sonar |
Создание Unut-файла для запуска/остановки SonarQube
1 |
# nano /etc/systemd/system/sonar.service |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[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 |
1 |
# systemctl daemon-reload && systemctl start sonar |
1 |
# netstat -nlptu | grep 9000 |
1 |
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN 2202/java |
Логи смотрим в
1 |
# tail -f /opt/sonarqube/logs/*.log |
Настройка ротации логов SonarQube
1 |
# cat /etc/logrotate.d/nexus |
1 2 3 4 5 6 7 8 9 10 |
/opt/sonatype-work/nexus3/log/*.log { daily dateext copytruncate missingok rotate 3 compress delaycompress notifempty } |
Заходим на WEB-интерфейс SonarQube
1 |
http://<IP-address-server>:9000 |
Логин/пароль для аутентификации admin/admin
Базовая настройка SonarQube
1. Изменение пароля
1 |
My account→Security→Change Password |
2.Обновление установленных плагинов
1 |
Adminitration→Marketplace→Updates only |
3.Установка необходимых плагинов
1 |
Adminitration→Marketplace→All |
4.Отключение доступа незарегистрированных пользователей к SonarQube
1 |
Administration→Configuration→Security→Enable Force user authentication |
Настройка Nginx как обратный прокси-сервер с SSL/TLS-терминацией
Установка Nginx
1 |
# wget -q -O - https://nginx.org/keys/nginx_signing.key | apt-key add - |
1 |
# nano /etc/apt/sources.list.d/nginx.list |
1 2 |
deb http://nginx.org/packages/ubuntu/ xenial nginx deb-src http://nginx.org/packages/ubuntu/ xenial nginx |
1 |
# apt-get update && apt-get install nginx |
1 |
# systemctl enable nginx && systemctl start nginx |
Получение Let`SEncrypt-сертификата и настройка вирт.хоста Nginx для проксирвоания запросов на localhost и порт 9000
1 |
# certbot certonly --nginx -d sonarqube.mydomain.com -d www.sonarqube.mydomain.com --non-interactive --agree-tos --email user@mydomain.com |
1 |
# nano /etc/nginx/conf.d/sonarqube.mydomain.com.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
upstream sonarqube_server { server 127.0.0.1:9000 fail_timeout=0; } server { listen 80; server_name sonarqube.mydomain.com www.sonarqube.mydomain.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name sonarqube.mydomain.com www.sonarqube.mydomain.com; ssl_certificate /etc/letsencrypt/live/sonarqube.mydomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/sonarqube.mydomain.com/privkey.pem; include /etc/nginx/ssl.conf; error_log /var/log/nginx/sonarqube-error.log; access_log /var/log/nginx/sonarqube-access.log main; location / { proxy_redirect off; proxy_pass http://sonarqube_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 90; } } |
1 |
# nano /etc/nginx/ssl.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
ssl_session_cache shared:SSL:20m; ssl_session_timeout 1d; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; ssl_dhparam /etc/nginx/ssl/dhparam.pem; # ssl_ecdh_curve secp521r1; ## Improves TTFB by using a smaller SSL buffer than the nginx default ssl_buffer_size 8k; ## Enables OCSP stapling ssl_stapling on; resolver 8.8.8.8; ssl_stapling_verify on; ## Send header to tell the browser to prefer https to http #add_header Strict-Transport-Security max-age=31536000; |
1 |
# openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048 |
1 |
# nginx -t && service nginx reload |
После чего sonarqube становится доступен по адресу
1 |
https://sonarqube.mydomain.com |
Настройка автопродления сертификатов
1 |
# crontab -e |
1 2 |
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 05 3 1 */2 * /usr/bin/certbot renew --force-renewal >> /var/log/letsencrypt/mydomain.com-renew.log |
Переводим SonarqQube с прослушивания всех интерфейсов(0.0.0.0) на localhost(127.0.0.1)
1 |
# nano /opt/sonarqube/conf/sonar.properties |
1 |
sonar.web.host=127.0.0.1 |
1 |
# systemctl restart sonar |
1 |
# netstat -nlptu | grep '9000' |
1 |
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 4185/java |
Установка sonarqube-scanner/runner
sonarqube-scanner – это инструмент,который сканирует/анализирует код и передает результаты на SonarQube-сервер для визуализации через WEB-интерфейс SonarQube-сервера
Он может быть установлен,как на локальной машине разработчика,так,например, и на сервере, на котором происходит CI/CD-процессы, а также на сервере,на котором установлен сам SonarQube
В данном случае установим его на том же сервере,где установлен SonarQube-сервер
1 |
# cd /opt/ && wget http://repo1.maven.org/maven2/org/codehaus/sonar/runner/sonar-runner-dist/2.4/sonar-runner-dist-2.4.zip |
1 |
# unzip sonar-runner-dist-2.4.zip && rm -f sonar-runner-dist-2.4.zip |
1 |
# mv sonar-runner-2.4 sonar-runner |
1 |
# ln -s /opt/sonar-runner/bin/sonar-runner /usr/local/bin/sonar-runner |
Настройка подключения к SonarQube-серверу(куда sonar-сканер будет загружать результаты сканирования)
1 |
# nano /opt/sonar-runner/conf/sonar-runner.properties |
1 |
sonar.host.url=http://localhost:9000 |
Вручную выполним проверку кода в репозитарии(предварительно необходимо создать в WEB-интрефейсе SonarQube пользователя с правом Execute Analysis и сгенерировать для него токен т.к. мы отключил доступ к SonarQube-серверу без аутентификации и авторизации)
1 |
# mkdir /tmp/sonar-test; cd /tmp/sonar-test |
1 |
# git clone https://github.com/kamaok/sonar-scanning-examples.git |
1 |
# cd sonar-scanning-examples/ |
1 |
# sonar-runner -D sonar.login=token_sonar_user |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
SonarQube Runner 2.4 Java 1.8.0_181 Oracle Corporation (64-bit) Linux 4.4.114-mainline-rev1 amd64 INFO: Runner configuration file: /opt/sonar-runner/conf/sonar-runner.properties INFO: Project configuration file: /tmp/sonar-test/sonar-scanning-examples/sonar-project.properties INFO: Default locale: "en_US", source code encoding: "UTF-8" INFO: Work directory: /tmp/sonar-test/sonar-scanning-examples/./.sonar INFO: SonarQube Server 6.7.5.38563 ……. 18:58:30.392 INFO - Analysis report generated in 319ms, dir size=93 KB 18:58:30.505 INFO - Analysis reports compressed in 111ms, zip size=45 KB 18:58:31.711 INFO - Analysis report uploaded in 1206ms 18:58:31.723 INFO - ANALYSIS SUCCESSFUL, you can browse http://localhost:9000/dashboard/index/org.sonarqube:sonarqube-scanner 18:58:31.723 INFO - Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report 18:58:31.723 INFO - More about the report processing at http://localhost:9000/api/ce/task?id=AWVInA7B9AgGF_gCsnLB 18:58:31.770 INFO - Task total time: 15.335 s INFO: ------------------------------------------------------------------------ INFO: EXECUTION SUCCESS INFO: ------------------------------------------------------------------------ Total time: 23.364s Final Memory: 17M/227M INFO: ------------------------------------------------------------------------ |
Результаты были загружены в SonarQube-сервер и доступны для просмотра
1 |
https://sonarqube.mydomain.com/projects |