シェルスクリプトの静的解析とステップ数をJenkinsで監視 | ShellCheck と Cloc

この記事は約6分で読めます。

Linux や WSL で仕事をしているとちょっとした作業ならシェルスクリプトで作ることも多いかと思います。規模が小さいうちは問題ないのですが、シェルスクリプトは大きくなってくると結構バグりやすいのでなにかしら対策を打ちたいところです。

そこで今回は「静的解析ツール」で危険な書き方を減らして「ステップ数計測ツール」で規模をチェックしたいと思います。せっかくなら指摘数とステップ数の推移も見たいので これらを Jenkins で回して見える化したいと思います

スポンサーリンク

ShellCheck

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

GitHub - koalaman/shellcheck: ShellCheck, a static analysis tool for shell scripts
ShellCheck, a static analysis tool for shell scripts - koalaman/shellcheck
スポンサーリンク

cloc

シェルスクリプトが肥大すると手に負えなくなるので行数も監視したいところです。今回は、下記の記事でも紹介した cloc を使いたいと思います。こちらも導入は簡単。

コードのステップ数計測ツール cloc
本邦の伝統的な企業、いわゆるJTCにてプログラミングに従事していると、お客さんや偉い人から「ステップ数を出せ!」と言われることありますよね。いまどきステップ数(LOC)がいったい何の役にたつのか不明ではありますが、積極的にケンカを売ってもい...
スポンサーリンク

Jenkins プラグイン

上記の2つのツールを扱うために Jenkins に入れる必要のあるプラグインは2つです。

まずステップ数を集計する SLOCCountプラグインをインストールします。普通にプラグインマネージャからインストールすればOKです。ちなみに公式サイトは下記です。

SLOCCount
This plugin parses SLOCCount output files to produce project and build reports.

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

Warnings
Collects compiler warnings or issues reported by static analysis tools and visualizes the results. It has built-in suppo...
スポンサーリンク

Jenkinsfile の例

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


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 の結果

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

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

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

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

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

スポンサーリンク

まとめ

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

コメント