PHPカンファレンス2018 レポート

DQNEOさん「大規模PHPプロジェクトでPHPUnitを3世代アップグレードするためにやったこと」,金山啓子さん「Cygamesにおける長期運用タイトルのこれまでとこれから ~PHP7への道~」 〜PHPカンファレンス2018

この記事を読むのに必要な時間:およそ 3 分

12月15日,東京都大田区産業プラザPiOにて「PHPカンファレンス2018」が開催されました。本稿ではその模様をお届けしています。今回は,メルカリのDQNEOさんと,Cygamesの金山さんのセッションをレポートします。

DQNEOさん「大規模PHPプロジェクトでPHPUnitを3世代アップグレードするためにやったこと」

USメルカリアプリのバックエンドを担当するDQNEOさんは,メルカリの大規模なPHPプロジェクトでPHPUnitのバージョンをいかにしてアップデートしたか,その戦略と方法について話しました。

画像

なぜアップデートしなければならないか

PHPUnitは,Webシステムのテストにも使えるUnitテストフレームワークです。有名なOSSプロジェクトでも採用されており,デファクトスタンダードとも言えます。メルカリでもPHPUnitを使っていて,今回のアップデートに着手した時点で,24万行のテストコードがありました。

アップデートをしなければいけないネガティブな理由としては,PHPUnitの古いバージョンのサポート切れや,新しいPHPのバージョンでテストが動かなくなってしまうのを防ぐという目的がありました。バージョン4, 5はすでにサポートされておらず,バージョン6のサポート期間も2019年2月1日までです。そのため,近いうちに7まで上げる必要が出てきます。また,PHP7.2の環境でPHPUnit4を使おうとするとDeprecatedエラーが出ます。これは将来のPHPで動かなくなる可能性を示唆しています。

ポジティブな理由としては,新しいPHPUnitのほうがより良い書き方をサポートしているという点を挙げました。名前空間,型宣言などモダンな機能を取り入れることができるようになり,可読性と拡張性が向上するのは良いことです。

アップデートの作業は,小さなプロジェクトであればcomposer.jsonを修正してcomposer updateを実行後,失敗するようになったテストを修正すれば終わります。

立ちはだかる大規模プロジェクトならではの難しさ

しかし,今回の対象となったプロジェクトはメルカリのバックエンドを支えるAPIで,関係する開発者が3カ国数十人もおり,1週間にPull requestが75本も生まれるような巨大プロジェクトでした。また,メルカリでは開発フローにGithub flowを採用しています。一般的な方法でアップデートをしようとすると,自分のアップデートをmasterブランチに取り込む際に,次のような問題が発生することは明らかでした。

  • 他の開発者の手元の環境にあるテストが動かなくなる
  • 並行して開発している機能で使おうとしているライブラリとの依存関係が解消できなくなる
  • composer.lockがコンフリクトして手がつけられなくなる

さらに悪いことに,後述の事情からPHPUnitのバージョンアップが本番に影響する可能性もありました。

DQNEOさんは,1年半ごとに半導体の向上とアーキテクチャの変更を交互に繰り返す開発戦略,Intel Tick-Tockにヒントを得ました。テストコードの修正とPHPUnitの更新を交互に繰り返していくことで,安全にPHPUnitのバージョンアップできるのではないかということに気づきました。

画像

この戦略を採用する際にポイントとなるのが「前方互換(forward compatibility)⁠です。バージョンアップ前のPHPUnitに依存した状態のまま,互換レイヤーを挟むことで前方互換を達成させつつ,PHPUnitのバージョンをアップデートしていくというものです。こうすることで,他の開発者がアップデート前のバージョンのテストコードを追加しても,アップデート時に動かなくなる問題を減らせます。

画像

PHPUnitの変更が本番環境の動作に影響する可能性についてですが,実は一部の環境でのみ,--no-devオプションをつけずにcomposer installしており,require-devされているパッケージの挙動が本番環境の挙動に影響するかもしれないことがわかったのです。幸い使われていることがなかったのですが,この影響調査では地道にすべてのクラスを確認しました。念のため,update前後のcomposer.lockを使ってvenderディレクトリに変更が発生しないことも確認しました。

この経験から,本番環境とQA環境では--no-devオプションをつけ,開発環境とCI環境ではオプションなしでcomposer installを実行するのがよいという戦略に至りました。また,composer installを実行した際は,そのコマンドをコミットメッセージとして残すことで,他の開発者も再現できるので良いというTipsも発見しました。

OSSへの還元

こうした経験をもとに最新のPHPUnitに追いつけていないOSSプロジェクト(DietCube,DiesCake,Monolog,PHPBench,AssertChain,Karen,Chronos,AWS SDK for PHP)に,Pull requestを送ったことを紹介しました。

DQNEOさんは「皆さんも困りごとやその解決方法をブログや勉強会で発表して,OSSに還元してください!」と述べ,今回のセッションを結びました。

著者プロフィール

花井宏行(はないひろゆき)

スタディプラス株式会社所属。日本Symfonyユーザー会メンバー。PHPカンファレンスには2015年から参加。

Twitter:hanahiro_aze


中村慎吾(なかむらしんご)

仕事でPHPを使うようになって10数年。楽しい事には何でもやってみるスタイル。趣味が講じて(拗らせて?)会社も作りました。Web開発となるとPHPは手放せません。

Twitter:@n416
URLhttp://kisaragi-system.co.jp

コメント

コメントの記入