タイトルはPHPに絞ってますが、他の言語でも同じようなことは出来ると思います。
前提
- インターネットに接続できること
- Gitを使っていること
- shellがちょっと分かること
CI環境を準備するのは大変
何を目的としているかわからないメソッドに対してテストを書いたり、
CIサーバー(サービス)を導入するために偉い人を説得したり、CIは始めることが一番大変なのではと思います。
手元にあるものだけで手っ取り早くCIしたいですよね?
Gitのpre-commmitを利用しましょう
Gitを利用していればcommitしない人なんていませんね。
commitするたびにツールが走ればいいんです。
gitのpre-commitにチェックツールを走らせるように書いておくだけ、
物凄くお手軽にCI環境が構築できますね!
pre-commitで使えるツール
色々使えるツールがあります。
php -l
これはインターネットに繋がっていなくてもPHPが利用できれば使えますね。
PHPのシンタックスエラーを見つけてくれます。
白い画面になるのを防げる優れものです。
phpmd
良くないコードを見つけて起こってくれるツールです。
使い方やインストールについては以下投稿を見ましょう。
php-cs-fixer
特定のコーディング規約にコードをフォーマットしてくれるツールです。
細かい設定書こうとすると難易度上がります。
security-checker
composerでインストールしたライブラリに脆弱性が出ていないかチェックしてくれるツールです。
コードの静的解析を行うのではなく、特定の脆弱性の報告されたライブラリを利用していないかどうかをチェックしてくれます。
pre-commitのサンプル
以下のサンプルはphp -l
、phpmd
をコミット時に変更したPHPファイルに対して走らせるものです。
問題が一つでも見つかるとコミットさせてもらえません。
# !/bin/sh
if git rev-parse --verify HEAD >/dev/null 2>&1
then
against=HEAD
else
against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
exec 1>&2
EXIT_CODE=0
error_check() {
if [ $1 -gt 0 ]; then
EXIT_CODE=$1
fi
}
cecho () {
str=$1
color=$2
echo "\033[0;${color}m${str}\033[0;39m"
}
cecho '##########################' 32
cecho '# Checking PHP syntax... #' 32
cecho '##########################' 32
echo ''
for CHECK_FILE in `git diff-index --name-status ${against} -- | grep -E '^[AUM].*\.php$' | cut -c3-`; do
php -l ${CHECK_FILE}
error_check $?
done
echo ''
cecho '################' 32
cecho '# Run phpmd... #' 32
cecho '################' 32
for CHECK_FILE in `git diff-index --name-status ${against} -- | grep -E '^[AUM].*\.php$' | cut -c3-`; do
vendor/bin/phpmd ${CHECK_FILE} text codesize,design,naming,unusedcode
error_check $?
done
if [ ${EXIT_CODE} -gt 0 ]; then
cecho 'Commit Failed...' 31
else
cecho 'Pre commit check all green!!' 32
fi
echo ''
exit ${EXIT_CODE}
下記画像はシンタックスエラーがあった場合の画面。
まずは小さいことから始めましょう!
小さな改善の積み重ねが大きな改善になるのです。