Статьи

Создание проектов Sonarqube

Sonarqube (урожденная Sonar) — это бомба. Это не то, что вы должны проверять ежедневно, но если вы серьезно относитесь к качеству, вы проверите это во время планирования спринта, если не еженедельно.

Посмотрите пример проекта на nemo.sonarqube.com , например, OpenJPA , чтобы понять, какая информация доступна. Сначала вы можете сосредоточиться на конкретном компоненте, например, OpenJPA JDBC .

Как разработчик, меня больше всего интересуют «проблемы» (в основном FindBugs и Squid) и «покрытие модульных тестов». Как архитектор, меня больше всего интересуют «индекс путаницы пакетов» и «сложность» — первая — это мера правильной инкапсуляции и развязки, а вторая — мера ремонтопригодности.

Важно просматривать эти цифры с соответствующим количеством соли. Они дают ценную информацию, но для их наилучшего использования требуется небольшой опыт. Вот почему важно держать эту информацию подальше от счетчиков компонентов, которые будут устанавливать необоснованные стандарты, такие как охват кода 90% во всех модульных тестах. (Это может быть невозможно достичь, если у вас есть богатая обработка исключений, но нет способа издеваться над классами, которые будут генерировать эти исключения. Только дурак может обменять надежность кода на более высокий балл.)

Установка Sonarqube

Это просто установить Sonarqube. Он поставляется в комплекте с собственным сервером веб-приложений и встроенной базой данных, поэтому вы можете проверить его, просто распаковав его и запустив скрипт запуска. Производственная система должна использовать реальную базу данных. Поддерживаются несколько баз данных.

Проверьте сайт sonarqube для деталей.

Создание нашего проекта

Я признаю это — создание проекта очень нелогично. Короче говоря, все обрабатывается путем отправки данных на сервер без предварительного создания чего-либо на сервере sonarqube. (Вы все еще хотите создать пользователей-администраторов на сервере sonarqube.)

На практике это означает, что мы добавляем плагин maven. Это дорогой плагин, поэтому обычно используют пользовательский профиль, например, «sonar» (для устаревшего имени).

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
    <profiles>
        <profile>
            <id>sonar</id>
            <properties>
                <sonar.language>java</sonar.language>
                <sonar.host.url>http://chaos:9000</sonar.host.url>
                <sonar.jdbc.url>jdbc:postgresql://chaos/sonar</sonar.jdbc.url>
                <sonar.jdbc.username>sonar</sonar.jdbc.username>
                <sonar.jdbc.password>sonar</sonar.jdbc.password>
            </properties>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.jacoco</groupId>
                        <artifactId>jacoco-maven-plugin</artifactId>
                        <version>0.6.4.201312101107</version>
                        <executions>
                            <execution>
                                <id>default-prepare-agent</id>
                                <goals>
                                    <goal>prepare-agent</goal>
                                </goals>
                            </execution>
                            <execution>
                                <id>default-prepare-agent-integration</id>
                                <goals>
                                    <goal>prepare-agent-integration</goal>
                                </goals>
                            </execution>
                            <execution>
                                <id>default-report</id>
                                <goals>
                                    <goal>report</goal>
                                </goals>
                            </execution>
                            <execution>
                                <id>default-report-integration</id>
                                <goals>
                                    <goal>report-integration</goal>
                                </goals>
                            </execution>
                            <execution>
                                <id>default-check</id>
                                <goals>
                                    <goal>check</goal>
                                </goals>
                                <configuration>
                                    <rules>
                                        <!-- implmentation is needed only for Maven 2 -->
                                        <rule implementation="org.jacoco.maven.RuleConfiguration">
                                            <element>BUNDLE</element>
                                            <limits>
                                                <!-- implmentation is needed only for Maven 2 -->
                                                <limit implementation="org.jacoco.report.check.Limit">
                                                    <counter>COMPLEXITY</counter>
                                                    <value>COVEREDRATIO</value>
                                                    <minimum>0.60</minimum>
                                                </limit>
                                            </limits>
                                        </rule>
                                    </rules>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

Обновление нашего проекта

Плагин сонара дорогой, поэтому его не следует запускать как часть обычной сборки. Распространенной практикой является планирование ночной сборки на сервере CI (Hudson, Continuum и т. Д.). Разработчики могут также захотеть выполнять внеплановые сборки, работая над невыполненной задачей — одно исправление нередко представляет другое с более низким приоритетом. проблемы.

Исходный код

Пример проекта, использующего этот плагин, находится по адресу https://github.com/beargiles/project-student [github] и http://beargiles.github.io/project-student/ [github pages].

Этот проект иллюстрирует необходимость понимания того, как мы интерпретируем результаты. Я использую два распространенных метода — выбрасывать внутреннее исключение вместо возврата нулевого значения и использовать настраиваемое исключение «UnitTestException» для проверки кода ошибки, не загромождая журналы посторонней информацией. Код выглядит так же, как сомнительный код, поэтому он правильно помечен, но, похоже, нет способа заставить замолчать предупреждения squid. (Findbugs имеет собственную аннотацию SuppressWarnings.)

В целом это все еще огромная победа.

(Обновление: можно контролировать предупреждения squid через вкладку sonarqube «Профили качества». Это можно использовать для снижения уровня серьезности до «info», но я не решаюсь сразу отключить эти тесты, поскольку они иногда являются допустимыми предупреждениями. почему я настоятельно предпочитаю использовать аннотации FindBugs SuppressWarnings для каждого экземпляра вместо изменения этих уровней предупреждений.)

Ссылка: Создание проектов Sonarqube от нашего партнера по JCG Bear Giles в блоге Invariant Properties .