Slide 1

Slide 1 text

⾃分が信じられないから 静的解析が好きです 2023.09.27 SATOSHI KANEYASU

Slide 2

Slide 2 text

⾃⼰紹介 ⽒名︓兼安 聡 所属︓株式会社サーバーワークス 最近のお仕事︓DevOpsの推進 趣味︓サックス、筋トレ、CS ゲーム 資格︓ X(Twitter)︓@satoshi256kbyte など

Slide 3

Slide 3 text

購入しました 明日、受け取りに 行きます

Slide 4

Slide 4 text

アジェンダ • [エピソード]システムのVerupにおける静的解析の活⽤ • 廃⽌された関数・変数の置換チェック • 独⾃ルールのソースの静的解析、その課題と対策 • 静的解析の⾃動化 • ⾃動化できなかったこと • pre-commitでコミット差分だけ静的解析 • まとめ

Slide 5

Slide 5 text

システムのVerupにおける静的解析の活⽤ • ⾔語はPHP • フレームワークバージョンアップ • フレームワークのVerupは破壊的変更、廃⽌された関数・変数は多数 • バージョンアップ前・後、両⽅のFWの知識があるのは極少数 • 品質担保の⼀環として、静的解析(PHPStan)を使⽤

Slide 6

Slide 6 text

廃⽌された関数・変数の抽出に⽤いる • 旧Verのコードは、ほとんどが何らかの修正が必要 • 正規表現&⼿作業で⼀通り修正 • レビュー&⼿動テストでは改修成否のチェックは不可と判断し、 静的解析を採⽤ • 静的解析の準備は(個⼈的には)まあまあ⼤変というレベル • 効果は「特⼤」、これがないとまともな品質にはならなかっただろう

Slide 7

Slide 7 text

廃⽌された関数・変数の置換チェック • 廃⽌された関数・変数が正しく置換されてるか、静的解析でチェック • 配列に関する警告等、修正のタイパが悪すぎるものは無視リスト • 最終的には、PHPStanのBaselineも活⽤ • 効果があったことから、 新規だけでなく改修PJでも静的解析は⾮常に有効と考えている ある時点より前のエラーは認識済とみなす ある時点以降新たに出たエラーだけチェック Baseline

Slide 8

Slide 8 text

独⾃ルールのソースの静的解析、その課題と対策 • 独⾃のビジネスロジック置き場がある • そのままでは静的解析できない • PHPStanのFW⽤の拡張を更に拡張して、 独⾃のビジネスロジック置き場もフォロー • 拡張ライブラリは、独⾃とはいえFWの ルールを参考にしていたのでスムーズに作 れた src Controller Business Model View /

Slide 9

Slide 9 text

静的解析の⾃動化 • AWS CodeBuildで静的解析を⾃動実⾏ • CodeBuildはdevelopへのコミットで起動 • マージのタイミングで全体の解析を⾏うので、 思わぬエラーを拾えた • 最終的には静的解析+独⾃のシェルで、 例外の隠蔽やSQLインジェクションも⾃動抽出 AWS CodeBuild AWS CodeCommit AWS CodeDeploy

Slide 10

Slide 10 text

⾃動化できなかったこと • AWS CodeBuildで⽔際対策はできた • しかし、静的解析NGなコードはコミットして欲しくないのが本⾳ • コミット前にローカルで静的解析するようルール付けしたが、 定着しなかった

Slide 11

Slide 11 text

pre-commitでコミット差分だけ静的解析 • 前述の経験を踏まえて改善 • Node.jsのhuskyを使⽤すると、 コミット前にタスクを⾃動実⾏可能 • 開発者が個々に設定する必要はない .husky pre-commit / src phpstan-commit.sh

Slide 12

Slide 12 text

コミット差分だけ静的解析するシェル #!/bin/bash FILES=$(git diff --cached --name-only --diff-filter=ACM | grep "^src/.*¥.php$") if [ "$FILES" != "" ]; then vendor/bin/phpstan analyse --level=max $FILES if [ $? -ne 0 ]; then echo "PHPStan failed" exit 1 fi fi phpstan-commit.sh

Slide 13

Slide 13 text

pre-commitで静的解析を実⾏ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" ./phpstan-commit.sh .husky/pre-commit

Slide 14

Slide 14 text

コミット時の出⼒サンプル > git -c user.useConfigOnly=true commit --quiet --allow-empty-message --file - Note: Using configuration file /home/ec2-user/husky-phpstan/phpstan.neon. 0/1 [░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 0% [1G [2K 1/1 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100% ------ ------------------------------------------------------------ Line sample1.php ------ ------------------------------------------------------------ 6 Parameter #1 $a of function add expects int, string given. 6 Parameter #2 $b of function add expects int, string given. ------ ------------------------------------------------------------ [ERROR] Found 2 errors PHPStan failed husky - pre-commit hook exited with code 1 (error)

Slide 15

Slide 15 text

まとめ • 静的解析は改修案件でも有効 • pre-commitを使えば、静的解析のルール化も可能 コードレビューの前準備︕ • pre-commitで静的解析した上で、 CI/CDパイプラインに繋げて更なる改善に繋げたい 私はもう静的解析は⼿放せない

Slide 16

Slide 16 text

以上、ありがとうございました。