ちょっとした作業ならシェルスクリプトで行うことも多いと思いますが大きくなるとメンテナンスが大変です。 そこで Jenkins にて静的解析ツールとステップ数計測ツールを実行する方法を説明します。


ShellCheck

シェルスクリプトにおいて他言語の Lint に該当するのが ShellCheckです。 公式サイト shellcheck に各OSでのインストールの方法も書かれています。 Ubuntu なら普通に apt install するだけです。

cloc

シェルスクリプトが肥大すると手に負えなくなるので行数も監視したいところです。 今回は、コードのステップ数計測ツール cloc でも紹介した cloc を例として使いたいと思います。

Jenkins プラグイン

上記の2つのツールを扱うために Jenkins に入れる必要のあるプラグインは2つです。 まずステップ数を集計する SLOCCount プラグインをインストールします。普通にプラグインマネージャからインストールすればOKです。

行数や静的解析の指摘数の推移をグラフで表示するためにWarnings Next Generationをインストールします。 これも普通にプラグインマネージャからインストールすればOKです。

Jenkinsfile の例

では早速 Jenkinsfile のサンプルを示します。この例では2つのGitリポジトリをクローンし、それに対して ShellCheck と cloc を実行しています。

 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
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
pipeline {
    agent {
        label {
            label "master"
            /* ワークスペースの設定. 任意の場所でOK. */
            customWorkspace "/mnt/SSD/jenkins/$JOB_NAME/"
        }
    }

    stages {
        stage ('ワークスペースの初期化') {
            steps {
                /* 念のためワークスペースのクリア. */
                deleteDir()
            }
        }

        stage ('スクリプトダウンロード') {
            steps {
                /* 1つめのリポジトリ. */
                sh 'mkdir -p hoge'
                dir("hoge") {
                    git branch: 'master', changelog: false,
                        credentialsId: 'sample_1', poll: true,
                        url: 'https://git.sample_1.com/hoge.git'
                    sh 'git reset --hard' /* 念のため. */
                    sh 'git clean -df'    /* 念のため. */
                }

                /* 2つめのリポジトリ. */
                sh 'mkdir -p fuga'
                dir("fuga") {
                    git branch: 'master', changelog: false,
                        credentialsId: 'sample_2', poll: true,
                        url: 'ssh://git.sample_2.com/fuga.git'
                    sh 'git reset --hard' /* 念のため. */
                    sh 'git clean -df'    /* 念のため. */
                }
            }
        }

        stage ('静的解析') {
            steps {
                /* シェバンを検索して bash, sh なら shellcheck を実行.
                 * カレントディレクトリ以下のファイルのステップ数をカウントして xml 形式で出力.
                 * 「\」のエスケープを忘れずに.
                 */
                sh '''
                    grep -rIl '^#![[:blank:]]*/bin/\\(bash\\|sh\\)' --exclude-dir=.git --exclude=*.sw?  | xargs shellcheck -f checkstyle > checkstyle-result.xml || :
                    cloc --by-file --xml --out=cloc.xml .
                '''
            }
        }

        stage ('集計') {
            steps {
                sloccountPublish encoding: '', ignoreBuildFailure: true, pattern: 'cloc.xml'
                recordIssues(tools: [checkStyle()])
            }
        }
    }
}

Jenkins の結果

下記のようにグラフにて表示されます。ビルド数が少ないのでわかりづらいですが……。実際はもっとたくさんあるのでちゃんとしたグラフになります。

Jenkinsでシェルスクリプトの行数推移グラフ

ステップ数はグラフだけでなく例えば下記のように言語ごとに表示することも可能です。

ShellCheckによる静的解析結果の言語別表示

件数の推移だけでなく深刻度におうじた円グラフなんかも表示されます。

ShellCheck指摘の深刻度別円グラフ

さらに指摘箇所は下記のようにコード中に表示されるのでとてもわかりやすい。

ShellCheckの指摘内容がコード中に表示された画面

こんな感じにいい感じにシェルスクリプトの状況が見える化できて素敵だと個人的には思っています。

まとめ

シェルスクリプトの静的解析ツールの ShellCheck とコードステップ数計測ツールを Jenkins で実行する方法でした。 サンプルのJenkinsfileも書いているのですぐにでも実践できるかなと思います!ぜひお試しください!