Установка связки Jenkins,Maven,Nexus,SonarQube рассмотрена в предыдущей статье
Maven будет собирать проект, загружать артифакты на Nexus-репозитарий, а SonarQube будет анализировать код
Выполним это в трех вариантах:
1 2 3 |
1) Без Jenkins ( с помощью командной строки и команд mvn) 2) С помощью Freestyle проекта в Jenkins 3) С помощью Pipeline проекта в Jenkins |
Рассмотрим первый вариант — Без Jenkins ( с помощью командной строки и команд mvn)
Maven ищет конфигурационный файл settings.xml в двух местах
— в директории,где установлен Maven, в каталоге conf
1 |
${maven.home}/conf/settings.xml |
— в домашнем каталоге пользователя в каталоге.m2
1 |
${user.home}/.m2/settings.xml |
Если оба файла существуют, то они объединяются Maven-ом с приоритетом содержания пользовательского settings.xml файла
Для примера, пользователь, под которым будем выполнять команды mvn — jenkins
1. Синтаксис/шаблон settings.xml берем из ${maven.home}/conf/settings.xml
2. Создаем файл с доступами в Nexus-репозитарий в домашнем каталоге пользователя Jenkins/.m2/settings.xml
1 |
# cat /var/lib/jenkins/.m2/settings.xml |
1 2 3 4 5 6 7 8 9 10 11 12 |
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> <servers> <server> <id>my-nexus-maven-repo</id> <username>my-maven-user</username> <password>my-maven-password</password> </server> </servers> </settings> |
3.В WEB-интерфейсе Nexus создаем
А) репозитарий Maven с именем my-maven-repo c типом hosted и форматом maven2
Б) Пользователя my-maven-user с паролем my-maven-password
4. В корневом pom.xml файле проекта проверяем/добавляем
1 2 3 4 5 6 7 8 9 10 11 |
<distributionManagement> <repository> <id>my-nexus-maven-repo</id> <url>http://<IP-address_or_servername_Nexus_server>:8081/repository/my-maven-repo</url> </repository> <snapshotRepository> <id>my-nexus-maven-repo</id> <url>http:// <IP-address_or_servername_Nexus_server>:8081/repository/my-maven-repo</url> </snapshotRepository> </distributionManagement> |
5.Переключаемся на пользователя jenkins
1 |
# su -l jenkins -s /bin/bash |
и выполняем загрузку кода, сборку Maven-ом проекта и загрузку артифактов на Nexus-сервер
1 |
git clone https://github.com/kamaok/course.git; cd course && mvn clean deploy |
Подключаем SonarQube для анализа кода проекта
1. Добавить в домашний каталог пользователя, под которым запускаем mvn-команду, в файл settings.xml
Мы выполняем команду под пользователем jenkins
переключимся на пользователя jenkins
1 |
# su -l jenkins -s /bin/bash |
поэтому в его домашнем каталоге по пути
~/.m2/settings.xml добавим следующий код для SonarQube
1 |
# cat ~/.m2/settings.xml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<pluginGroups> <pluginGroup>org.sonarsource.scanner.maven</pluginGroup> </pluginGroups> <profiles> <profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <!-- Optional URL to server. Default value is http://localhost:9000 --> <sonar.host.url> http://<IP-address_or_servername_SonarQube>:9000 </sonar.host.url> </properties> </profile> </profiles> |
2.После чего выполнить команду, находясь под пользователем Jenkins
1 |
# mvn clean deploy sonar:sonar |
В результате на SonqrQube сервера появится проанализированный проект, который собрал maven
Если используется аутентификация в SonarQube(Для включения аутентификации в SonarQube заходим в WEB-интерфейс-Configuration→Security→Force user authentication)
,тогда необходимо использовать либо токен либо логин/пароль для аутентификации на SonarQube-сервере
— если использовать токен
1 |
# mvn clean deploy sonar:sonar -Dsonar.login=token_value |
— если использовать логин/пароль
1 |
# mvn clean deploy sonar:sonar -Dsonar.login=login_name -Dsonar.password=password |
Предварительно в SonarQube после включения принудительной аутентификации необходимо создать пользователя с правами Execute Analysis через WEB-интерфейс SonarQube
Источник:
https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Maven
http://jagadesh4java.blogspot.com/2016/08/sonar-integration-with-maven.html
Рассмотрим второй и третий варинты — С помощью Freestyle и Pipeline проекта в Jenkins
Первые три пункта общие
1.Установить плагин SonarQube для jenkins
https://plugins.jenkins.io/sonar
2.Настройка SonarQube server в jenkins
1 2 3 |
Mange Jenkins→Configure system→ Name→my-sonarqube-demo ServerURL: http://192.168.1.105:9000 |
Также включаем вставку переменных окружения SonarQube-сервера при сборке
1 |
Manage Jenkins→Configure system→SonarQube servers→Environment variables→Enable injection of SonarQube server configuration as build environment variables |
Если SonarQube требует аутентификации,то создаем в WEB-интрефейсе SonarQube пользователя с правом Execute Analysis и генерируем для него токен. Значение этого токена добавляем в поле
Server authentication token
3.Настройка Sonar-runner в jenkins
1 2 3 |
Manage Jenkins→Global Tool configuration→SonarQube Scanner→Add Sonar Qube scanner Name→my-sonarqube-scanner SONAR_RUNNER_HOME→/opt/sonar-runner |
Настройка Freestyle проекта Jenkins для сбора проекта с помощью Maven с последующим анализом кода SonarQube
Если SonarQube требует аутентификации И в глобальной конфигурации SonarQube не указан токен пользователя (см. Пункт 2), тогда необходимо в свойствах (Properties) в расширенных настройках Maven сборки указать значение токена или логин/пароль пользователя для аутентификации в SonarQube
Например, при использовании токена вид Maven-шага будет таким
Настройка Pipeline проекта Jenkins для сбора проекта с помощью Maven с последующим анализом кода SonarQube
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
node { def mvnHome stage('Preparation') { // for display purposes // Get some code from a GitHub repository git 'https://github.com/kamaok/course.git'; // Get the Maven tool. // ** NOTE: This 'maven-demo' Maven tool must be configured // ** in the global configuration. mvnHome = tool 'maven-demo' } stage('Deploy') { // Run the maven deploy sh "'${mvnHome}/bin/mvn' -Dmaven.test.failure.ignore clean deploy" } stage('SonarQube analysis') { withSonarQubeEnv('my-sonarqube-demo') { sh "'${mvnHome}/bin/mvn' sonar:sonar" // If SonarQube require authentication and token absent in Global Jenkins configuration //sh "'${mvnHome}/bin/mvn' sonar:sonar -Dsonar.login=token_value" } } } |
Если не использовать Maven вообще(например, просто анализ кода SonarQube-ом),
FreeStyle-проект для анализа кода средствами SonarQube имеет вид
Если не указан токен пользователя SonarQube в глобальних параметрах Jenkins, то в сборке в свойствах SonarQube сканер в поле Analysis properties добавляем параметр
sonar.login=token_value
В корне проекта(если путь в строке path_to_project_properties установлен как на рисунке./sonar-project-properties) должен находиться файл с именем sonar-project-properties.
Минимальный набор параметров,который он должен содержать
https://docs.sonarqube.org/display/SONAR/Analysis+Parameters
1 2 |
sonar.projectKey= sonar.sources= |
Определить все необходимые или дополнительные параметры также можно и в поле Analysis properties
Pipeline сборка для анализа кода с помощью SonarQube будет иметь вид
1 2 3 4 5 6 7 8 9 10 11 12 |
node { def sonarscannerHome stage('Preparation') { // for display purposes git 'https://github.com/kamaok/sonar-scanning-examples.git'; sonarscannerHome = tool 'my-sonarqube-scanner' } stage('SonarQube analysis') { withSonarQubeEnv('my-sonarqube-demo') { sh "'${sonarscannerHome}/bin/sonar-runner' -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_AUTH_TOKEN" } } } |