ぽらろいどの日記

新しい知見を得たり、得られた知見を記録したり共有したりする場を予定しています。

Gradle × Codenarc × Spockをオフラインで実行する一例

概要

Gradleをオフラインで実行したい場合、どのようにCodenarcとSpockを合わせて使えば良いかの一例を示す。

初めの準備

全て書くのは煩雑なので、gradle initを実行する。

$ gradle init

Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 2

Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6] 2

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1

Project name (default: sample):
Source package (default: sample):

> Task :init

BUILD SUCCESSFUL in 35s

この時点でのレイアウト

$ tree
.
├── app
│   ├── build.gradle
│   └── src
│       ├── main
│       │   ├── groovy
│       │   │   └── sample
│       │   │       └── App.groovy
│       │   └── resources
│       └── test
│           ├── groovy
│           │   └── sample
│           │       └── AppTest.groovy
│           └── resources
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle

build.gradleの変更

codenarcとspockを使えるようにするために、build.gradleを変更する。

具体的に、記述は以下の通りになる(不要な列は略記)。

plugins {
    id 'groovy'
    id 'codenarc'
}

repositories {
    flatDir {
        dirs "/home/sample/lib", "/home/sample2/lib"
    }
}

dependencies {
    // ビルド時に必要な、Groovyの複数jarファイル
    implementation fileTree(dir: '/home/sample/lib', include: '*.jar')

    testImplementation 'org.spockframework:spock-core:2.0-groovy-4.0'

    // codenarcの実行時に必要なjarファイル
    codenarc fileTree(dir: '/home/sample/lib', include: '*.jar')
    codenarc fileTree(dir: '/home/sample2/lib', include: '*.jar')
}

codenarc {
    // デフォルトのバージョン以外のcodenarcを指定する
    toolVersion = '3.1.0'
    // 実行結果をhtmlファイルではなく、consoleに出力する
    reportFormat = 'console'
}

補足として、repositoriesにローカルを指定する方法は、他の方法もある。

torutk.hatenablog.jp

また、codenarcの実行設定は、他にも幾つか設定可能な項目がある。

docs.gradle.org

codenarc.xmlの作成

codenarcは、指定されたコーディング規則だけをチェックするが、そのチェックする規則はcodenarc.xmlで指定できる。

ファイルは、デフォルトのレイアウトでは、以下の通りになるように配置する。

$ tree
.
├── app
│   ├── build.gradle
│   └── src
│       ├── main
│       │   ├── groovy
│       │   │   └── sample
│       │   │       └── App.groovy
│       │   └── resources
│       └── test
│           ├── groovy
│           │   └── sample
│           │       └── AppTest.groovy
│           └── resources
├── config
│   └── codenarc
│       └── codenarc.xml <- これ
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle

xmlのベースは、サンプルとして以下があるのでこれを利用する。

また、指定する規則の一覧は以下にあるので、こちらから選んで指定する。

具体的に、記述は以下の通りになる。

<ruleset xmlns="http://codenarc.org/ruleset/1.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://codenarc.org/ruleset/1.0 http://codenarc.org/ruleset-schema.xsd"
        xsi:noNamespaceSchemaLocation="http://codenarc.org/ruleset-schema.xsd">

        <ruleset-ref path='rulesets/basic.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/braces.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/comments.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/concurrency.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/convention.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/design.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/dry.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/exceptions.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/formatting.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/generic.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/groovyism.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/imports.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/jdbc.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/junit.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/logging.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/naming.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/security.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/serialization.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/size.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/unnecessary.xml'></ruleset-ref>
        <ruleset-ref path='rulesets/unused.xml'></ruleset-ref>

</ruleset>

補足として、要件に応じてjarファイルをタスクの依存関係に加える。

また、Gradleでは以下のルールはうまく適用できないものを含むので、除外する。

これに関して、以下を参考。

実行

この状態になれば、あとはコマンドを実行し、codenarcを実行できる。

$ gradle codenarcMain
$ gradle codenarcTest
$ gradle check # 上記2つを実行する

また、コマンドを実行して、テストも実行できる。

$ gradle test