※資料内の参照リンクを選択し閲覧する場合は、ダウンロードをお願いいたします
\積極的に技術発信を行なっております/
▽ Twitter/COLOPL_Tech https://twitter.com/colopl_tech
▽ connpassページ http://colopl.connpass.com
▽ COLOPL Tech Blog http://blog.colopl.dev
Rector ではじめる"運用を止めない"PHP アップグレード株式会社コロプラ技術基盤本部 サーバー基盤チーム 工藤 剛1#phperkaigi #a #colopltech
View Slide
アジェンダ21. 自己紹介2. Rector ってなに?3. Rector のすごいところ4. 白猫プロジェクト NEW WORLD'S による実例5. テスト及びデプロイ6. まとめ#phperkaigi #a #colopltech
32017 年に新卒入社各種タイトルの運用に携わった後、 SRE チームに Joinミドルウェアのバージョンアップや PHP 周りを主に担当php-src ext-random の (一応) メンテナTwitter: @zeriyoshi Mastodon: @[email protected]氏名 :部署名 :工藤 剛技術基盤本部 第2バックエンドエンジニア部サーバー基盤グループ SREチーム#phperkaigi #a #colopltech自己紹介
4Rector ってなに?#phperkaigi #a #colopltech
5PHP-Parser や PHPStan を用い、 "静的解析" 結果を使うリファクタリングツールhttps://github.com/rector/rectorRector = (超強力) リファクタリングツール$ composer require –dev rector/rector#phperkaigi #a #colopltech
6Rector のすごいところ#phperkaigi #a #colopltech
7左 (PHP 8.0) のコードに右の Rector ルールを適用すると...#phperkaigi #a #colopltech
88.2 相当の機能を利用するよう自動的にリファクタ#phperkaigi #a #colopltech
9PHPStan を用いた静的解析+PHP-Parser ベースの AST 操作=PHPDoc の解釈や型推論までできる超強力リファクタリングツールつまり#phperkaigi #a #colopltech
10ほかにも...#phperkaigi #a #colopltech
11ダウングレードもできる!$ composer require –dev rector/rector-downgrade-phprector/rector-downgrade-phphttps://github.com/rectorphp/rector-downgrade-phpちなみに Rector 自体も Rector を使って PHP 7.2 以降であれば動くコードに変換してリリースされている (!)
12アップグレード戦略#phperkaigi #a #colopltech
アップグレード戦略13● 積極的なコードリファクタリングはしない○ PHP 7.4, 8.1 両方で同様に動作するコードを書く■ 曖昧比較の非互換 => colopl_bc (内製 PHP Extension) で吸収● 曖昧比較を ext-colopl_bc の関数に Rector ですべて変換● CI を用いて非互換が生じるコードが紛れ込んでいないか常に検査○ Rector を実行し、差分が出ないかを常に検査○ PHPStan のルールを書いて非互換コードが生じないよう常に検査○ ダメ押しに PHPCompatibility による検査● 外部依存関係は 7.4 / 8.1 を両立できるところまで可能な限り更新○ Symfony コンポーネント郡○ PHPUnit 3 + 独自 patch -> PHPUnit 9#phperkaigi #a #colopltech
● switch 文における曖昧比較演算子にするルール○ switch ($foo) { case 'bar': } -> switch (true) { case $foo == 'bar': }● 曖昧比較演算子を互換関数にするルール○ 1 == 2; -> \Colopl\BackwardsCompatibility\Php74\eq(1, 2);■ switch 文の == も最終的にこれで変換される● APC から APCu へ移行するためのルール○ apc_clear_cache('user'); -> apcu_clear_cache(); 等● 曖昧比較演算を伴う配列関連の関数を互換関数にするルール○ in_array, array_search, array_keys -> ext-colopl_bc の関数に置換書いた主な Rector ルール14#phperkaigi #a #colopltech
書いた主な Rector ルール15● オブジェクトへの array_key_exists を property_exists にするルール○ array_key_exists('key', $stdClass); -> property_exists($stdClass, 'key');● array_multisort の曖昧比較・ソート順変更を互換関数にするルール○ array_multisort -> \Colopl\BackwardsCompatibility\Php74\array_multisort● 以前のソートの挙動を再現した互換関数にするルール○ sort -> \Colopl\BackwardsCompatibility\Php74\sort#phperkaigi #a #colopltech
16PHP 7.4 / 8.1 両対応なコードベースを常に維持できるため移行期間中開発側で意識する必要がない並行で新規開発中のコードも自動的に 7.4 / 8.1 両対応になるこれらのルールを常に適用し続ければ...#phperkaigi #a #colopltech
17テスト及びデプロイ#phperkaigi #a #colopltech
並行 QA + インスタンス入れ替え18● PHP 7.4 , 8.1 環境それぞれで同一のテストを一通り実施○ ユニットテスト○ 実機デバッグ○ 並行開発している新規機能の QA● ロードバランサーに対し、新旧インスタンスを同時に投入○ 徐々に新インスタンスの比率を上げていき、最終的に旧インスタンスをすべて LB から外す■ 旧インスタンス: Apache2 + mod_php + PHP 7.4■ 新インスタンス: nginx + php-fpm + PHP 8.1○ コードベースが完全に同一なため、デプロイミスは発生しない● 正常に動作していることを確認し、旧インスタンスを削除#phperkaigi #a #colopltech
残作業19● 各開発サーバーを作り直し○ 長期運用タイトルのため、 Unity の AssetBundle などのリソースが巨大■ 新規構築したサーバーへの展開に 4 時間くらいかかる● 開発チームと連携しつつ、徐々に旧環境を削除していく○ コードベースが同じなので PHP 8.1 更新後のコードを取り込んでも盛大に conflict したりはしない■ 新規開発の効率を維持できた● Rector によるコード変換を CI から外し、 PHP 8.1 の新機能を使える状態へ => ハッピーな世界#phperkaigi #a #colopltech
20まとめ#phperkaigi #a #colopltech
まとめ21● 常に PHP 7.4 / 8.1 で動作するコードベースを維持できた!○ 新規開発にマイグレーション対応が追いつかない、というあるあるを自動化で回避できた● ルールを書くまでの学習コストは少々高め○ 割と単純なルールなら書けるので、命名規則等をしっかりとやっていればラフなルールを書くことは可能■ とはいえ PHPStan による型推論情報も利用できるので活用していくとより良い● 組み込みのルールがめちゃくちゃ充実している○ 今回はコード差分を最小限にするために独自ルールしか使わなかったが、移行に使える組み込みルールも豊富にある○ Laravel マイグレーション用のルールとかもあるhttps://github.com/driftingly/rector-laravel#phperkaigi #a #colopltech
22ご意見・ご感想などなんでもお待ちしております!!!Twitter: @zeriyoshi#phperkaigi #a #colopltech