Linux や WSL で仕事をしているとちょっとした作業ならシェルスクリプトで作ることも多いかと思います。規模が小さいうちは問題ないのですが、シェルスクリプトは大きくなってくると結構バグりやすいのでなにかしら対策を打ちたいところです。
そこで今回は「静的解析ツール」で危険な書き方を減らして「ステップ数計測ツール」で規模をチェックしたいと思います。せっかくなら指摘数とステップ数の推移も見たいので これらを Jenkins で回して見える化したいと思います
ShellCheck
シェルスクリプトにおいて他言語の Lint に該当するのが ShellCheck です。公式サイトは下記です。そこに各OSでのインストールの方法も書いています。
Ubuntu なら普通に apt install するだけです。
cloc
シェルスクリプトが肥大すると手に負えなくなるので行数も監視したいところです。今回は、下記の記事でも紹介した cloc を使いたいと思います。こちらも導入は簡単。
Jenkins プラグイン
上記の2つのツールを扱うために Jenkins に入れる必要のあるプラグインは2つです。
まずステップ数を集計する SLOCCountプラグインをインストールします。普通にプラグインマネージャからインストールすればOKです。ちなみに公式サイトは下記です。
行数や静的解析の指摘数の数位をグラフで表示するためにWarnings Next Generationをインストールします。これも普通にプラグインマネージャからインストールすればOKです。ちなみに公式サイトは下記です。
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 も書いているのですぐにでも実践できるかなと思います!ぜひお試しください!
コメント