第35章 Sonarプラグイン

You may wish to use the new Sonar Runner Plugin instead of this plugin. In particular, only the Sonar Runner plugin supports Sonar 3.4 and higher.

このプラグインの代わりに、新しくできたSonnar Runnerを使いたくなる場面もあるかもしれません。 特に、Sonar3.4以上をサポートしているのはSonar Runnerプラグインだけです。

The Sonar plugin provides integration with Sonar, a web-based platform for monitoring code quality. The plugin adds a sonarAnalyze task that analyzes the project to which the plugin is applied, as well as its subprojects. The results are stored in the Sonar database. The plugin is based on the Sonar Runner and requires Sonar 2.11 or higher.

Sonarプラグインは、コード品質モニタリングのためのWebベースのプラットフォームであるSonarとの統合機能を提供します。 プラグインにより追加されるsonarAnalyzeタスクは、プラグインが適用されたプロジェクト、およびそのサブプロジェクトを解析することができます。結果はSonarデータベースに格納されます。 このプラグインはベースにSonar Runnerが使われていて、Sonar 2.11以上を必要とします。

The sonarAnalyze task is a standalone task that needs to be executed explicitly and doesn't depend on any other tasks. Apart from source code, the task also analyzes class files and test result files (if available). For best results, it is therefore recommended to run a full build before the analysis. In a typical setup, analysis would be performed once per day on a build server.

sonarAnalyzeタスクは明示的に実行する必要のあるスタンドアロンタスクで、 他のいかなるタスクにも依存しません。 ソースコードだけでなく、タスクはクラスファイルと(可能であれば)テスト結果ファイルも解析します。 そのため、最大限の結果を得るために、解析の前にフルビルドを実行することが推奨されます。 典型的なセットアップでは、解析はビルドサーバー上で1日1回実行されるようにします。

35.1. 使用方法 Usage

At a minimum, the Sonar plugin has to be applied to the project.

必要最小限、Sonarプラグインがプロジェクトに適用されている必要があります。

例35.1 Sonarプラグインの適用

build.gradle

apply plugin: "sonar"

Unless Sonar is run locally and with default settings, it is necessary to configure connection settings for the Sonar server and database.

Sonarがデフォルト設定でローカル実行されるのでなければ、Sonarサーバーとデータベースへの接続設定も必要になります。

例35.2 Sonar接続設定のコンフィグレーション

build.gradle

sonar {
    server {
        url = "http://my.server.com"
    }
    database {
        url = "jdbc:mysql://my.server.com/sonar"
        driverClassName = "com.mysql.jdbc.Driver"
        username = "Fred Flintstone"
        password = "very clever"
    }
}

Alternatively, some or all connection settings can be set from the command line (see 「コマンドラインでSonarの設定を行う Configuring Sonar Settings from the Command Line).

代わりに、いくつかの、または全ての接続設定をコマンドラインで設定することもできます(「コマンドラインでSonarの設定を行う Configuring Sonar Settings from the Command Line参照)。

Project settings determine how the project is going to be analyzed. The default configuration works well for analyzing standard Java projects and can be customized in many ways.

プロジェクト設定によって、プロジェクトをどのように解析するのかが決まります。 標準的なJavaプロジェクトに対してはデフォルト設定で事が足りますが、さまざまな方法でカスタマイズも可能です。

例35.3 Sonarプロジェクト設定のコンフィグレーション

build.gradle

sonar {
    project {
        coberturaReportPath = file("$buildDir/cobertura.xml")
    }
}

The sonar, server, database, and project blocks in the examples above configure objects of type SonarRootModel, SonarServer, SonarDatabase, and SonarProject, respectively. See their API documentation for further information.

サンプルのsonarserverdatabase、およびproject ブロックは、それぞれコンフィグレーションオブジェクト SonarRootModelSonarServerSonarDatabase、 およびSonarProjectに対応します。 詳細はAPIドキュメントを参照してください。

35.2. マルチプロジェクトビルドの解析 Analyzing Multi-Project Builds

The Sonar plugin is capable of analyzing a whole project hierarchy at once. This yields a hierarchical view in the Sonar web interface with aggregated metrics and the ability to drill down into subprojects. It is also faster than analyzing each project separately.

Sonarプラグインはプロジェクト階層全体を一度に解析する機能をもちます。 集約されたメトリクスとサブプロジェクトへのドリルダウン機能を含む階層ビューをSonarのWebインターフェースに生成でき、 個別のプロジェクトごとに解析を行うよりも高速でもあります。

To analyze a project hierarchy, the Sonar plugin needs to be applied to the top-most project of the hierarchy. Typically (but not necessarily) this will be the root project. The sonar block in that project configures an object of type SonarRootModel. It holds all global configuration, most importantly server and database connection settings.

プロジェクト階層を解析するには、Sonarプラグインを階層の最上位のプロジェクトに適用する必要があります。 これは、典型的には(必須ではないですが)ルートプロジェクトです。 そのプロジェクトのsonarブロックが SonarRootModel型のオブジェクトを構成します。 これはすべてのグローバルコンフィグレーションを保持しますが、 最も重要なのはサーバーとデータベース接続設定です。

例35.4 マルチプロジェクトビルドにおけるグローバルコンフィグレーション

build.gradle

apply plugin: "sonar"

sonar {
    server {
        url = "http://my.server.com"
    }
    database {
        url = "jdbc:mysql://my.server.com/sonar"
        driverClassName = "com.mysql.jdbc.Driver"
        username = "Fred Flintstone"
        password = "very clever"
    }
}

Each project in the hierarchy has its own project configuration. Common values can be set from a parent build script.

階層の各プロジェクトは独自のプロジェクトコンフィグレーションを持ちます。 共通の値は親のビルドスクリプトから設定可能です。

例35.5 マルチプロジェクトビルドにおける共通のプロジェクトコンフィグレーション

build.gradle

subprojects {
    sonar {
        project {
            sourceEncoding = "UTF-8"
        }
    }
}

The sonar block in a subproject configures an object of type SonarProjectModel.

サブプロジェクトのsonarブロックは SonarProjectModel型のオブジェクトを構成します.

Projects can also be configured individually. For example, setting the skip property to true prevents a project (and its subprojects) from being analyzed. Skipped projects will not be displayed in the Sonar web interface.

プロジェクトを個別に構成することもできます。 例えば、skipプロパティをtrueに設定することで、 プロジェクト(およびそのサブプロジェクト)を解析対象から除外することができます。 スキップされたプロジェクトはSonar Webインターフェースには表示されません。

例35.6 マルチプロジェクトビルドにおけるプロジェクト個別コンフィグレーション

build.gradle

project(":project1") {
    sonar {
        project {
            skip = true
        }
    }
}

Another typical per-project configuration is the programming language to be analyzed. Note that Sonar can only analyze one language per project.

プロジェクト単位のコンフィグレーションでもう一つ典型的なのは、解析対象のプログラム言語です。 Sonarはプロジェクトあたり一つの言語しか解析できないことに注意してください。

例35.7 解析対象の言語のコンフィグレーション

build.gradle

project(":project2") {
    sonar {
        project {
            language = "groovy"
        }
    }
}

When setting only a single property at a time, the equivalent property syntax is more succinct:

一度に単一のプロパティしか設定しないときは、等価なプロパティの文法はより簡潔になります:

例35.8 プロパティ文法の利用

build.gradle

project(":project2").sonar.project.language = "groovy"

35.3. カスタムソースセットの解析 Analyzing Custom Source Sets

By default, the Sonar plugin will analyze the production sources in the main source set and the test sources in the test source set. This works independent of the project's source directory layout. Additional source sets can be added as needed.

デフォルトでは、Sonarプラグインはmainソースセットのプロダクションソースと、 testソースセットのテストソースを解析します。 これはプロジェクトのソースディレクトリレイアウトとは独立して動作します。 ソースセットは必要に応じて追加できます。

例35.9 カスタムソースセットの解析

build.gradle

sonar.project {
    sourceDirs += sourceSets.custom.allSource.srcDirs
    testDirs += sourceSets.integTest.allSource.srcDirs
}

35.4. Java言語以外の解析 Analyzing languages other than Java

To analyze code written in a language other than Java, install the corresponding Sonar plugin, and set sonar.project.language accordingly:

Java以外の言語で書かれたコードを解析するには、対応するSonarプラグインをインストールして、次のようにsonar.project.languageを設定してください。

例35.10 Java言語以外の解析

build.gradle

sonar.project {
    language = "grvy" // set language to Groovy
}

As of Sonar 3.4, only one language per project can be analyzed. You can, however, set a different language for each project in a multi-project build.

Sonarでは、バージョン3.4現在、一プロジェクトにつき一つの言語の解析しかできません。しかし、マルチプロジェクトで、それぞれのプロジェクトに異なる言語を設定することはできます。

35.5. カスタムSonarプロパティの設定 Setting Custom Sonar Properties

Eventually, most configuration is passed to the Sonar code analyzer in the form of key-value pairs known as Sonar properties. The SonarProperty annotations in the API documentation show how properties of the plugin's object model get mapped to the corresponding Sonar properties. The Sonar plugin offers hooks to post-process Sonar properties before they get passed to the code analyzer. The same hooks can be used to add additional properties which aren't covered by the plugin's object model.

最終的には、コンフィグレーションのほとんどは、 Sonarプロパティとして知られるkey-valueペアの形でSonarコードアナライザに渡されます。 プラグインのオブジェクトモデルのプロパティが対応するSonarプロパティにどのようにしてマップされるかは、 APIドキュメントのSonarPropertyアノテーションが示してます。 Sonarプラグインは、Sonarプロパティがコードアナライザに渡される前の後処理のためのフックを提供します。 このフックは、プラグインのオブジェクトモデルがカバーしていないプロパティを追加するためにも利用できます。

For global Sonar properties, use the withGlobalProperties hook on SonarRootModel:

グローバルSonarプロパティに対しては、SonarRootModelwithGlobalPropertiesフックを利用してください:

例35.11 カスタムグローバルプロパティ設定

build.gradle

sonar.withGlobalProperties { props ->
    props["some.global.property"] = "some value"
    // non-String values are automatically converted to Strings
    props["other.global.property"] = ["foo", "bar", "baz"]
}

For per-project Sonar properties, use the withProjectProperties hook on SonarProject:

プロジェクト毎のSonarプロパティに対しては、SonarProjectwithProjectPropertiesフックを利用してください:

例35.12 カスタムプロジェクトプロパティ設定

build.gradle

sonar.project.withProjectProperties { props ->
    props["some.project.property"] = "some value"
    // non-String values are automatically converted to Strings
    props["other.project.property"] = ["foo", "bar", "baz"]
}

A list of available Sonar properties can be found in the Sonar documentation. Note that for most of these properties, the Sonar plugin's object model has an equivalent property, and it isn't necessary to use a withGlobalProperties or withProjectProperties hook. For configuring a third-party Sonar plugin, consult the plugin's documentation.

使用できるSonarプロパティはSonarのドキュメントで調べることができます。 ただし、これらのプロパティのほとんどはプラグインのオブジェクトモデルに対応するプロパティがあり、withGlobalPropertieswithProjectPropertiesフックを使って設定する必要はありません。 サードパーティのSonarプラグインに対しては、それらのドキュメントを参照してください。

35.6. コマンドラインでSonarの設定を行う Configuring Sonar Settings from the Command Line

The following properties can alternatively be set from the command line, as task parameters of the sonarAnalyze task. A task parameter will override any corresponding value set in the build script.

次に示すプロパティは、sonarAnalyzeタスクのパラメーターとしてコマンドラインからでも設定できます。 タスクパラメーターは、ビルドスクリプト内の対応する値を全て上書きします。

  • server.url
  • database.url
  • database.driverClassName
  • database.username
  • database.password
  • showSql
  • showSqlResults
  • verbose
  • forceAnalysis

Here is a complete example:

以下に使用例を示します。

gradle sonarAnalyze --server.url=http://sonar.mycompany.com --database.password=myPassword --verbose

If you need to set other properties from the command line, you can use system properties to do so:

他の値をコマンドラインから設定する必要がある場合は、システムプロパティが使用できます。

例35.13 カスタムのコマンドラインプロパティを実装する

build.gradle

sonar.project {
    language = System.getProperty("sonar.language", "java")
}

However, keep in mind that it is usually best to keep configuration in the build script and under source control.

ただ、たいていの場合は設定値をビルドスクリプトに格納し、ソースコード管理システムで管理するのが一番良い方法だということは頭に留めておいてください。

35.7. タスク Tasks

The Sonar plugin adds the following tasks to the project.

Sonarプラグインはプロジェクトに以下のタスクを追加します。

表35.1 Sonarプラグイン - タスク Sonar plugin - tasks

タスク名 Task name 依存先 Depends on タイプ Type 説明 Description
sonarAnalyze - SonarAnalyze プロジェクト階層全体を解析し、結果をSonarデータベースに格納。 Analyzes a project hierarchy and stores the results in the Sonar database.