Laravel MeetUp Okinawa で話した内容です。
Laravelを使った Github Actions, 静的解析(Larastan), 自動整形(PHP-CS-Fixer)の説明と使い方について発表しました。
www.bengo4.comもう細かいレビューはしたくない、されたくないLaravel MeetUp Okinawa2021.8.25 namizato
View Slide
22並里 辰也(ナミザト タツヤ)自己紹介弁護士ドットコム株式会社 在籍そろそろ1年Laravelが好きでたまにQiitaに投稿してます最近 Github Actions が楽しい@namizatork
Bengo4.com, Inc.弁護士ドットコムというサービス● 一般市民と弁護士を結びつけ、お悩み解決を目指す● 2005年サービス開始● 約900万セッション/ 月● 約300件の法律相談/ 日3
Bengo4.com, Inc.目次● 今回話す内容● 静的解析(PHPStan)● 自動整形(PHP-CS-Fixer)● CI(Github Actions)4
今回話す内容5
Bengo4.com, Inc. 6突然だが、レビューでこんなことを言われた / 言ったこと経験はないだろうか
Bengo4.com, Inc. 7「インデント!!これもう指摘、3度目!!!」
Bengo4.com, Inc. 8「ここの変数未定義だし、ここも型合ってないよ!!!」
Bengo4.com, Inc. 9指摘された側も反省して、気をつけるけど人間だし、同じミスはしてしまう。指摘する側もロジックのレビューに集中したいし、こんな細かいレビューを毎回やり取りするのも大変。
Bengo4.com, Inc.そういう時はCIで自動整形と静的解析を導入しよう10
静的解析(PHPStan)11
Bengo4.com, Inc.静的解析(PHPStan)プログラムコードを実行せずにドキュメントやソースコードなどのチェックによって誤りや脆弱性を検出するテスト手法。それらをPHPで提供されているのが静的解析ツール(今回は PHPStan)です。今回はLaravel専用のPHPStanのラッパーライブラリ Larastanを使用します。12
Bengo4.com, Inc.静的解析とは● 仕様○ プログラムを実行せずに解析される(ただし PHPstanは一部実行する)○ 未定義の変数/メソッド/Class/プロパティなどを検出○ その他PHPDocの構文不備や分岐のチェックも● メリット○ 静的に解析される箇所は網羅的にテストができる○ テストを書く必要がないのでコストが少ない○ 変数の未定義など細かいエラーが事前に分かるのでコードレビューの手間が省ける● デメリット○ 無限ループなどは検出できない13
Bengo4.com, Inc.PHPDoc14● コードの見通しが良くなる● IDEの補完が効くようになる● 静的解析ができる
Bengo4.com, Inc.Levelや範囲などの設定15/phpstan.neon● includes○ 設定ファイルの読み込み● paths○ 対象ファイル● level○ 静的解析のレベル 1 ~ 7● excludePaths○ 無視ファイル
Bengo4.com, Inc.使い方16./vendor/bin/phpstan analyzeと実行するだけで手動で静的解析が走ります。
自動整形(PHP-CS-Fixer)17
Bengo4.com, Inc.自動整形(PHP-CS-Fixer)コーディング規約を設定した基準沿って自動でコーディングを統一する機能。その機能をPHPで提供されているのが PHP-CS-Fixer (他にもPHP_CodeSnifferなどがある) です。PHP-CS-Fixer では公式で PSR-1 や PSR-2 、他にも Symfonyコミュニティ の標準 などが用意されていて、それらを使うことも自身でカスタマイズして使用することができる。また VSCode でプラグインも用意されており、保存時に自動整形することも可能です。18
Bengo4.com, Inc.カスタマイズ19/.php-cs-fixer.dist.phpver3.0.0 からphpファイル● Finder::create()○ 対象ファイル● setRiskyAllowed○ リスクが高い変更の許可● setRules○ カスタマイズするルール設定を記述
Bengo4.com, Inc.使い方20./vendor/bin/php-cs-fixer fix -v --diff--dry-run整形箇所のピックアップ./vendor/bin/php-cs-fixer fix -v --diff自動整形を適用する
CI(GithubActions)21
Bengo4.com, Inc.CI(GithubActions)CIとは、Continuous Integrationの略で、継続的インテグレーションと呼ばれていて、開発、テスト、リリースのサイクルが継続的に行われていく様子の事であり、それらを円滑に使用出来る様にしたものがCIツールです。CIツールは Github Actions だけでなく、複数のツールが存在している( Circle CIなど)Github Actions を使うメリットは無料( privateリポジトリは月2,000時間まで)という点と、普段利用している Github内のプロジェクトに .github/workflows/ ディレクトリを用意して設定ファイルを書くだけで利用できる手軽さにあります。(個人的見解)他にも公式が用意しているテンプレートを使用することもできます。22
Bengo4.com, Inc.Github Actions の設定ファイル23● /.github/workflows/ にyaml形式で記入する● on: CIが走るタイミングを決める● jobs: stepsの集まり● steps: jobを構成するAction● などなど
Bengo4.com, Inc. 24では、ここまで学んだ静的解析と自動整形をCIで設定してみよう!
Bengo4.com, Inc.PHPStan(Larastan)25/.github/workflows/larastan.ymlマスターに対してプルリクエスト、マージが行われたタイミングでテストが走るように設定。
Bengo4.com, Inc.PHP-CS-Fixer26/.github/workflows/php-cs-fixer.ymlこちらもLarastanと同様のトリガーでテストを実行します。今回は `dry-run` で差分を出力までしかしていません。自動整形を適用させたい人は ↓追加./vendor/bin/php-cs-fixer fix -v --diff
Bengo4.com, Inc.CIで落ちる実装27あえてテストが落ちるように実装して、CIが走るようにプルリクを作ってみた。
Bengo4.com, Inc.プルリクを作成28先ほどの実装でプルリクを作ってみた。Github Actions を使っていると、Merge pull request の上にテストが走っているのが分かる。テストが落ちると右の図のように、どのテストが落ちていて、 Merge pullrequest が不活性になっているのが確認できる。CIが走っているCIが落ちている
Bengo4.com, Inc.Larastanのテスト結果29確認すると以下の内容で、怒られているのが確認できる。● 引数の型不一致● 戻り値の型不一致● 未定義の変数の使用
Bengo4.com, Inc.PHP-CS-Fixerのテスト結果30確認すると以下の内容で、怒られているのが確認できる。● declareの改行● namespaceの改行● array()の使用
Bengo4.com, Inc.修正して再度プッシュ31先ほどの内容をfixupで修正して、再度プッシュしてみました。そうするとテストが全部通って、Merge pull requestが活性化しているのが確認できました。これでプルリクでレビュワーをアサインする前に細かいレビューで指摘されることがなくなりました!ヤッタネ (^ω^ )
Bengo4.com, Inc. 32ここまで学んだ内容をGithubのリポジトリに上げています。https://github.com/namizatork/larave-environment
ご清聴ありがとうございました。33