jenkinsでsjisチェックをかける
プロジェクト内のファイルは基本的にutf-8で統一していますが、たまにshift-jisなど別の文字コードでgitにpushされる事があり、早めに気づきたいと思いました。
jenkinsのシェル実行でチェックしてみます。
jenkinsの設定
jenkins > project > 設定 > ビルド > ビルド手順の追加 > シェルの実行
シェルの中身の例
find $WORKSPACE/ -type f -not -name '*.txt' -print0 | xargs --null file -i | egrep -v '^\./(java|html)|charset=(binary|utf-8|us-ascii)' > $WORKSPACE/check-charset.txt && true
diff -w $WORKSPACE/check-charset.txt $WORKSPACE/check-charset.orig
分解して説明します
まず一行目のおはなし
find $WORKSPACE/ -type f -not -name '*.txt' -print0
ワークスペース以下に対して拡張子txtを除くファイルを検索します。「-print0」 オプションはパス内にスペースが含まれていても処理できるようにしています。後続のxargsの「--null」オプションと組み合わせる必要あり。詳細は調べればたくさん出てくるので割愛します。
xargs --null file -i
先ほどのfindで挙がったパスをfileコマンドに渡しています。「-i」オプションでmimeタイプ文字列の出力にでき、そこにcharsetが含まれるので今回はこれを使います。
egrep -v '^\./(java|html)|charset=(binary|utf-8|us-ascii)'
ここで正規表現を使って不要な行を弾いています。前半の「^\./(java|html)」は先頭ディレクトリがjavaもしくはhtmlの場合を弾く、後半の「charset=(binary|utf-8|us-ascii)」は先ほどのfileコマンドで出力されるcharsetでバイナリやutf-8などチェックしたいもの以外を入れて弾きます。
> $WORKSPACE/check-charset.txt && true
最後のこの部分は結果を「check-charset.txt」に出力し、trueを返す事でシェル実行自体は成功としています
次に二行目のおはなし
diff -w $WORKSPACE/check-charset.txt $WORKSPACE/check-charset.orig
これは素直にdiff取っているだけです。「-w」オプションはスペースの違いを無視するものです。これで差分が出るとビルド失敗、差が無ければ成功になります。
比較用ファイルの準備
上記のシェルスクリプトで分かるように、今回はdiffが無ければ合格となる仕組みになっています。よって比較対象のファイル「$WORKSPACE/check-charset.orig」が必要です。
これは空ファイルにしても良いですし、何か除外したいものでも構いません。ただ、上記のシェルスクリプトの結果と比較するものなので手作業で作るよりは一度実行させた結果をリネームして加工するのが楽です。
まとめ
取り敢えずこれで簡易的なチェックが出来るようになりました。
ディレクトリの除外はfind側でも可能です。今回はegrepで処理しましたがfind側の方が高速になると思います。
著者:t.n