at-sushiのブログ

日記、音楽、プログラミング

CircleCI上でastyleのスタイルチェックを行う

astyleはArtistic Styleの略で、C, C++, C#, Javaソースコードのインデントや整形を行うことができるツールである。

こういった整形ツールは非常に便利だが、実行し忘れるとなんの意味もない。

gitのpre-commit hookに設定する方法もあるが、できればCI上で確認をしてからマージをしたい。

今回はCircleCI上でastyleのスタイルチェックを行った。

astyle設定ファイルの作成

まず、コーディング規約を決定する。

今回はC#向けにここを参考に作成した。

// .astyle

# c#のファイルとして認識する
mode=cs
# allmanスタイルにする
style=allman
# インデントにスペースを使う
indent=spaces=2
# namespace文の中をインデントする
indent-namespaces
# switch文の中をインデントする
indent-switches
# case文の中をインデントする
indent-cases
# 1行ブロックを許可する
keep-one-line-blocks
# 1行文を許可する
keep-one-line-statements
# プリプロセッサをソースコード内のインデントと合わせる
indent-preproc-cond
# if, while, switchの後にpaddingを入れる
pad-header
# 演算子の前後にpaddingを入れる
pad-oper
# originalファイルを生成しない
suffix=none
# if, for, while文の前後に空行を入れる
break-blocks
# コメントもインデントする
indent-col1-comments

このファイルを .astyle の名前で保存すると

astyle --options=./.astyle <filename>

と実行することでコードを整形することができる。

CircleCIの設定

シェルスクリプト .code-format.sh を作成する

すべてのファイルに対してastyleを実行し、実行前と実行後のファイルに差があればコーディング規約を守ってないとしエラーを返す。

// .code-format.sh

OPTIONS="--options=./.astyle"
astyle --version

RETURN=0
ASTYLE=$(which astyle)
for FILE in `\find . -name '*.cs'`; do
  TEMP=$(mktemp)
  $ASTYLE $OPTIONS < $FILE > $TEMP
  if ! cmp -s "$FILE" $TEMP; then
    echo "error: $FILE does not respect with coding style"
    RETURN=1
  fi
  rm $TEMP
done
exit $RETURN

CircleCi上でこれを実行できるよう circle.yml を作成する。

dependenciesのpreでastyleのダウンロードとインストールを行う。

// circle.yml

dependencies:
  pre:
    - wget https://jaist.dl.sourceforge.net/project/astyle/astyle/astyle%203.0/astyle_3.0_linux.tar.gz
    - tar -zxvf astyle_3.0_linux.tar.gz
    - cd astyle/build/gcc && sudo make && sudo make install
test:
  override:
    - bash .code-format.sh

あとはGitHubにpushして、CircleCI上で設定したら完了。