修正した部分だけPHPの構文チェックをする仕組みを作ってみました。
構文に問題があればGithubのPull Requestにコメントされます。
この方法のよいところは既存のソースを変えることなくPHPの構文チェックの仕組みを導入できることです。
規約に沿っていないコードが大量にあり、かつテストコードがないような環境(レガシー環境)にも導入することができます。
使用したツールは以下です。
また、packsaddleのツールはRuby製ですので、Rubyが動作する環境が必要です。
サンプルとしてGithubにphp-syntax-checkというリポジトリを作成しているので参考にしてください。
以下のスクリプトをCircleCIで実行しています。
check_syntax.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
仕組み
以下の3つのセクションに分類されます。
- 対象のファイルを抽出
- 構文チェック
- 結果をレポート
1. 対象のファイルを抽出
以下のコマンドでmasterと差分のあるファイル名を取得します。
1
|
|
さらに grepで拡張子が .phpのファイルのみ対象にします。
1
|
|
2. 構文チェック
構文チェックツールは好きなものを使えます(CheckStyleフォーマットで出力できるものに限りますが)。
今回はPHP_CodeSnifferを使いました。
1
|
|
xargs
は前のコマンドを引数でとるために必要です。
以下のコマンドでmasterとブランチの差分をチェックして、差分があるところのエラーを検知対象のエラーとしています。
1
|
|
エラーの差分の抽出にcheckstyle_filter-gitというツールを使っています。
これは、入力として渡したCheckStyle formatの文字列から、変更した内容の部分のエラーを抽出するツールです。
例えばファイルの10行目〜15行目を変更した場合、その行で発生したエラーのみを抽出します。
3. 結果をレポート
saddlerを使って結果をGithubに通知します。
1 2 3 |
|
注意点としては、PRを作っていないと通知でエラーとなります。
ですので、Pull Requestがあるかどうかをチェックするif文をいれています。
$CI_PULL_REQUEST
はCIrcleCIの変数で、Pull Requestが作られていればこの変数にURLが格納されています。
1 2 3 |
|
また、通知にはGITHUB_ACCESS_TOKEN
を発行して環境変数に登録しておく必要があります。
CircleCIの環境変数の設定については、以下を参照ください。
また、通知ではなく単に結果を出力する場合は、saddler/reporter/textを指定します。
1 2 3 |
|
以下は、出力があった場合はエラーにする例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
その他
ファイルのエンコードがEUC-JPのソースコードに適用したところエラーとなりました。
リポジトリをフォークして対応しました。
1.1.0より使えるようになりました!
-
https://github.com/shoyan/ruby-checkstyle_filter-git/commit/a11c3c7f4daf1ddf26c0ab4f4ae9d8b1b78bda4b
以下のように設定します。
Gemfile
1
|
|
iconvでgit diffの出力結果の文字コードをEUC-JP
->UTF-8
に変換して渡せるようにしました。
1 2 3 4 |
|
PRもしているので直ることに期待です。
Mergeいただきました。
サンプルとしてGithubにphp-syntax-checkというリポジトリを作成しているので参考にしてください。