🤖

大規模システムのPHP/Laravelバージョンアップした話

2023/04/11に公開

ご挨拶

こんにちは、BEENOSのサノです 🙋‍♂️

今回は、弊社で運用しているとある大規模webサービス(ユーザ30万人、gitリポジトリのファイル数10,000以上)のPHP/Laravelバージョンアップを行った話になります。
「既に商用で動いているシステムに対して、バージョンアップのリリースを実際にどうするのか?」というマネジメント・運用の話も少し入ります。

概要

サービスの初回リリースから数年立つと、利用しているすべての技術スタックについてバージョンアップが必要になります。

バージョンアップで得られる恩恵・怠った場合の問題点はたくさんありますが、簡単にいくつか挙げると以下になります。

  1. セキュリティ向上
    • 古いバージョンはサポート外になり、セキュリティホールも見つかっている場合があるので攻撃の対象になります。
  2. サービスの速度改善
    • バージョンアップするだけでもサイトの動作が軽くなることもあります。
  3. 最新の開発環境になる
    • バージョンアップではコード記述の効率化施策がたくさんなされているため、開発作業がスムーズになります。

間接的な効果として、エンジニアにとって快適な開発環境となるので業務効率化・モチベーションアップに繋がります👍

実装

リリースノート読み込み

まずはPHP/Laravel共に現在のバージョンと上げたいバージョンを確認し、リリースノートとバージョン間のアップグレードガイドを読み込みます。

https://www.php.net/manual/ja/migration82.php
https://readouble.com/laravel/10.x/ja/upgrade.html

dockerを使っているので、Dockerfileを修正します。

-FROM php:x.x-fpm
+FROM php:x.x-fpm

composer.jsonを修正し、各ライブラリを新しいバージョンに対応させます。
※この時、新しいバージョンに対応していないライブラリが見つかった場合は下記のような対応が必要になります。

  • 代替のライブラリを探して置き換える
  • Forkあるいはプログラム取得して、composer.jsonを修正する

Laravelについては、composer.jsonを修正してから
composer install でvenderとcomposer.lockを再作成します。

本プロジェクトではPHPStan(larastan)を導入しプログラムの静的解析をしているので、ここで以下のコマンドで実行します。

./vendor/bin/phpstan analyse --memory-limit=-1

このコマンドで発生したエラーをすべて直す必要があります。
今回は数百種類…(一つ一つに複数の修正箇所がある)のエラーが発生し、Excelにまとめる等して一つずつ直していきます。

このエラー修正の作業は非常に大変ですが、これがなければどこに潜んでるかわからないバグを発見できず、超怖いバージョンアップ作業になってしまうところでした。
プログラムの品質保証は普段面倒に感じてしまうことがありますが、バグや障害を発生させるリスクとは比較できません…。

ここまでで一旦プログラムとしてのupgrade対応が完了し、PullRequestが出来上がります。
後は「システムの仕様としてデグレードしていないか」を確認する手動での動作確認フェーズに入ります。

リリースまでの工程管理

今回のような大規模システムの運用では、日々新しいプログラムがリリースされます。
そのため「プログラムがリリースされるたびにバージョンアップ用のPRをメンテナンスする」のは難しいという判断に至りました。
この問題はビジネスサイドと交渉の末、下記の内容で了承を頂くことで解決しました。

スケジュールに関しては、繁忙期を避けつつなるべく短期間で済むよう検討が必要でした。

開発側としては、バージョンアップとは何かをビジネスサイドに伝える必要があるとともに、理解を示し顧客対応をして頂いたビジネスサイドには大変大変感謝です 🙇‍♂️

バージョンアップのPRがある程度完成してからは、対応中の案件全てに関しての切り分けを行いました。

  • バージョンアップ前にリリースが必要
  • バージョンアップ後のリリースでOK

このあたりもビジネスサイドとの日頃のコミュニケーションで、今必要な案件・そうでない案件の認識を合わせていなくてはなりません。

また、テストに関しては次のような意見が出ました。

  • テストチームにいつもどおり依頼するのは物量的に難しいね
  • バージョンアップまでリリースがないので、エンジニアのリソースを使えるよね

これを受けて、 対象システムに関わる全エンジニアに実装の手を止めてもらい、機能ごとに担当を分けて全員でテストしました!!
開発メンバーの多いプロジェクトとしては少し思い切った判断でしたが、皆さん大変協力的かつ自発的にテストに尽力して頂き、こちらも大変大変感謝です 🙇‍♂️

リリース

そしてドキドキの最終局面のリリース作業ですが、2,000を超えるファイル数のPRにも関わらず無事ノーバグでリリース作業を終えることができました 🎊

まとめ

サービスを長期的に考えたら「今必要」じゃなくても「絶対必要」になると考えています。
サービスリリース後の一度目のバージョンアップができないと、ズルズル行ってさらに対応しづらくなるので本当に良かったです。

改めて、バージョンアップの意義です。

  • セキュリティ・パフォーマンスを考えると必須。
  • さらに、優秀なエンジニアが居続けるため・入ってもらうためにも必要。
  • つまり、5年、10年を考えたシステムを運用するなら絶対必要。

外から見たら地味ですが、事業会社で様々なポジションの方々と一丸となって成功させる事ができ、リスクを乗り越えた充実感のあるプロジェクトでした 👍

Wanted!

BEENOSグループでは一緒に働いて頂けるエンジニアを強く求めております!
少し気になった方は、社内の様子や大事にしていることなどを The BEENOS にて発信しておりますので、是非ご覧ください。

https://beenos.com/blog/

とても気になった方はこちらで求人も公開しておりますので、お気軽にご応募ください!
「自分に該当する職種がないな...?」と思った方は オープンポジション としてご応募頂けると大変嬉しく思います 🙌

世界で戦えるサービスを創っていきたい方、是非是非ご連絡ください!よろしくお願い致します!!

BEENOS Tech Blog

Discussion