FuelPHP1.8.0→1.8.2、PHP5.6→PHP7.3へのバージョンアップ対応をした。
業務でアプリケーションのバージョンアップ対応を行ったので、取り組みをまとめておく。
※ミドルウェアのバージョンとかは割愛
※OSはAmazon Linux(2ではない)
FuelPHP1.8.0はPHP7.2まで対応しているが、1.8.2は7.3まで対応している。
バージョンアップに取り掛かる2週間くらい前に突如リリースされた。
fuelphp.com - Fuel releases 1.8.2
PHP7.2はアクティブサポートが2019年11月30日、セキュリティサポートが2020年11月30日となっており、
PHP7.3は2020年12月6日、2021年12月6日となっている。
サポートの期間が伸びるためFuelPHP1.8.2がリリースされたのは大変感謝すべき一件だったと思う。
約1ヶ月半
最初の2週間は合宿という形でオフィスから離れた場所で集中的に作業に取り組んだ。同期間中は、コードフリーズ期間として、緊急対応以外のリリースを原則停止した。
パフォーマンス要件というよりもセキュリティ対応の意図が大きかった。
プロダクトのセキュリティを担保できないというのは事業にとってのリスクになり得るだろう。
masterから派生させたバージョンアップ対応用のreleaseブランチを用意した。
コードフリーズ期間は2週間設けたが、フリーズ解消後はmasterブランチでのリリースを可能とするため、masterへの機能改修、追加等があった場合は、releaseブランチへ都度変更をrebaseで取り込むようにした。
FuelPHPもPHPのバージョンアップも作業の進め方としては概ね同じで、
※1 動作確認テストは過去の資産(以前のバージョンアップ対応で使用したテスト項目)をアップデートして利用した。
※2 FuelPHPのバージョンアップ対応が終わってから一度動作確認を行い、PHPのバージョンアップ対応をしてから再度動作確認を行った。
(FuelPHPの動作確認が終わった段階で一旦リリースを挟んでも良かった気がする。)
といった流れで進行した。
違いはPHPの対応の場合は事前にstg環境とCIの実行環境をphp7.3に対応しておく必要があるくらい。
あとは朝会をやってハマりどころとか進捗の共有等を毎朝行ったり、みんなでランチにいったりした。楽しかった(小並感)。
Unit Testがある程度ちゃんと用意されていたので地獄を見ることはなかったように思う。(テスト大事)
作業完了後に発生したバグはテストで担保できていない部分(ファットなコントローラーとかE2Eがあれば検知そうなところとか)が主で、テストケースが足りないといったところは殆どなかった。
自分はプロジェクトリーダーのような役割を担っていたので、進捗管理やタスクのハンドリング等を行いつつ、実作業もやるみたいなスタンスで色々やっていたが、FuelとPHPのバージョンアップの開発作業よりもインフラ側の作業の方に時間を使っていた気がする。(開発作業は殆どレビュー中心の作業しかしていないかも、、いくつか対応したもののあるが、、)
Laravelとかと違い頻繁にアップデートされているFWではないので、PHP7.3対応は本当に万全なのか懐疑的なところ(リリースされて間もないので実績が少ない。)がちょっとあったが、結果として問題ないようだった。
「マイナーアップデートとはなんだったのか」みたいな変更があってエモい気持ちになるところがあった。
v3.1.30→v3.1.33へのマイナーアップデートで発生した問題が2つほどあった。
PHP7系から1年ほど離れていたせいか、割と忘れている機能とか変更とかあって学びがあった。
場当たり的な対応をしてしまっている節がある気がする。より丁寧に対応するにはデータ構造から見直したり、メソッドの外観を調整する必要があったかもしれない。
count(null)
でもWarningになるisset
や!empty
でnullをチェックしたり、該当箇所の引数を配列またはオブジェクトに変更するなどして対応カナリアリリースで対応した。
PHP5.6のインスタンスがぶら下がっているターゲットグループにPHP7.3のインスタンスを少しずつぶら下げて並行稼働、7.3の台数を増やしつつ、5.6の台数を減らしていった。
全部切り替え終わった段階で完全切替(releaseブランチをmasterにマージ)。
一部本番環境で調査したエラーについては、ロードバランサーのリスナーの設定を活用した。
送信元IPを社内IPで指定して、社内からのアクセスを特定のインスタンスに振り分けて検証する方法を取った。(ダークカナリアリリース?)
並行稼動期間中は度々エラーが発生し、LBからインスタンス切り離したりつけ直したりと障害対応しつつ、安定稼働、完全切替まで2週間を要した。
リリースのフェーズでテストや動作確認で検知できなかったバグがいくつか発生した。
中には解決が難しいものや対応が厄介なモノ等あったが、何かあったときは切り戻し作業(LBからインスタンスを切り離すだけ)を早急に行いつつ、エラーログの収束、安定稼働に2週間弱ほと格闘した。
自分の目線ではバージョンアップ対応よりもリリース作業のほうが大変だった印象がある。
PHPバージョンアップ関連のブログやスライドを漁ってみた。
バージョンアップ時に対応が必要な箇所はプロダクトによって様々だろうが、基本的な作業の流れの結構似ていると思った。
GameWithさんは環境が酷似しているのですごくエモい気持ちになった。
5年以上PHP5で運用されていたFuelPHPで動くGameWithをPHP7.3にバージョンアップしました! #GameWith #TechWith
テストコードが無くてPHP7へのバージョンアップが出来ない?ボットで解決しました!
3ヶ月でphp5.5から7.2にバージョンアップした現在と今後の向き合い方
CPU・メモリ使用率には大幅改善があったが、レスポンスタイムには大きな変化が見られなかった。
まだちゃんと計測できていない部分があるので調査中。
バージョンアップ対応は人海戦術が有効な部分が大きいと思うので、集中的に取り組むと比較的短期間で終わるのかもしれない。
良い経験になった。
FuelPHP1.8.2が急にリリースされた奇跡があった一方で、合宿終盤でAWSの大規模障害に直面したという稀有な出来事もあった。(stg環境での動作検証に多少の影響があった)