4つのプロダクトのPHP/Laravelバージョンアップ対応事例(PHP 7.1→8.1, Laravel 5.4→8)

この記事は「ウィルゲート Advent Calendar 2024」の 1 日目の記事です!!ヨッ!!! adventar.org

はじめに

ウィルゲートでSREをしていることみん(@kotomin_m)です!こんにちは!

このブログでは、今年行った4つのプロダクトをPHP 7.1→8.1, Laravel 5.4→8にバージョンアップしたプロジェクトについて紹介します!

ウィルゲートのプロダクトにはバックエンドでPHP・Laravelを利用しているプロダクトがあり、それらをPHP 7.1→8.1, Laravel 5.4→8にバージョンアップしました。 2024年6月末のCentOS EOLに伴い、Amazon Linux 2023への移行にあたってPHPのバージョンアップが必要である、という背景で対応しました。

また、このプロジェクトは通常の機能開発と並行しながら大きな障害なく期日内に完了させることができました!!1つの事例として、参考になれば幸いです。

プロジェクトを進める上で何を大事にしたか

今回のプロジェクトにあたって大事にしたことが3つあるので、それぞれのポイントごとに進め方についてお話します!

1. 通常の機能開発を止めずにバージョンアップを行うこと

1番重要なこととして、対象のプロダクトは日々の機能開発が行われているということです。 通常の開発を止めることは事業に影響も出てきてしまうので、今回はそれぞれのプロダクトの機能開発と平行してバージョンアップ作業も進める必要がありました。

したがって、バージョンアップ作業を数ヶ月かけて準備して一気に移行作業を行うと開発とコンフリクトしてしまうため、少しずつに移行作業を進めてマージし、コンフリクトが起きないように対応を進めました!

2. バージョンアップ(サーバ移行)が期日内に完了すること

今回はCentOS 7のEOLに伴うサーバ移行のためのバージョンアップ作業なので、EOLまでに完了させることは必須条件でした。

作業中に出てきた「やったほうがよいけど、EOL対応後でも問題ない対応」を、後回しにしてプロジェクトの完了を優先させました。

3. メンテナンスを取らずにサーバ移行を行うこと

今回のバージョンアップは少しずつ進めるため、各プロダクごとに複数回のサーバ移行が発生します。 数ヶ月の短期間に何度もメンテナンスを取って作業することは、ユーザへの影響も大きくなりますし、ビジネスサイドなど各所との連携も必要になって運用コストもかかります。 そこで、今回はメンテナンスを取らずに移行作業が行える方法で対応しました。

これによって、休日や夜間に作業する必要もなくなり、対応するエンジニアの負担も減らすことにも繋がりました。

プロジェクトメンバーとの連携

ここは、プロジェクトに関わる各チームのメンバーとどのように連携を取っていたかを紹介します!

キックオフMTG

まず、プロジェクトが始まるにあたって、関係者全員を集めたキックオフMTGを行いました。

キックオフのMTGについて、『プロジェクトはキックオフが9割 | Marginalia』という記事がとても参考になりました。

ここでの 「全員とは誰か」 がキックオフにおいてもっとも重要なポイントと言っても過言ではありません。

キックオフに呼ばれていなかった人へ後から協力を求めることになるのは、そのプロジェクトの計画に漏れがあったということであり、明確なプロジェクト立ち上げの失敗です。

「全員」については、実際にメインで作業を進めるメンバーだけではなく、同じチームで開発をしているメンバーも含めて全員呼びました。 機能開発と平行して作業を行うので、チームメンバーにもタスクの調整などの協力をしてもらう可能性があったからです。

キックオフMTGでは、以下の内容について話しました。

  • キックオフMTGの目的
  • スケジュールの共有
  • 役割分担の確定
  • バージョンアップの全体的な進め方について共有
  • 今後の連携方法の相談

役割分担については、私がPHPカンファレンス香川で発表した資料が参考になります!

新米SRE、4つのプロダクトを同時にPHP7.0から8.1へ!! - Speaker Deck

SRE・インフラ・アプリの各チームと連携して進めていくための認識をあわせて一緒のゴールを向くためのキックオフMTGが実施できたのかなと思います。

定例MTG

プロジェクト実施中は各チームと毎週のMTGを行いました。

最初はアプリ←→SREのみで行っていましたが、3,4回目ぐらいでインフラも呼んだ方が早いとなったので全チーム合同で行うように変わっていきました。 また、MTG時間もプロダクトによって調整していきました。

この毎週のMTGでは、各チームの進捗状況の共有・次週までのアクションの設定を行いました。 プロダクトを跨いだ調整や、バージョンアップの順番の入れ替えを行ったりしながら、どうするかの連携を取りながら進めました。

スケジュールや細かいタスクはNotionで管理していました

終わってから考えましたが、このプロジェクトは関わる人数が多かったので、密にコミュニケーションを取ったことが期日までに完了できた重要なことの一つだなと思いました!

具体的な対応内容

バージョンアップ作業

バージョンアップ作業は、ざっくり調査・作業・テストという順で行いました。

調査

調査は、PHPとLaravel、その他ライブラリの公式ドキュメントで変更差分を確認しました。

各バージョン、アップデート内容が書いてあるページがあるので、そこを確認します。 ただし、「やったほうがよいけど、EOL対応後でも問題ない対応」は後回しにする方針なので、新機能の部分は飛ばして、下位互換性のない変更点を中心に「やらなければマズい対応」を洗い出しました。 (もちろん新機能で使えるものは使っていきたいですが、、)

作業

作業では、PHPのライブラリ Rectorを利用しました。

Rectorはバージョンアップでの変更箇所を自動で検出してコードを書き換えてくれる便利ツールです。 compsoerでインストールできて、比較的学習コストも少なく利用することが出来ました。

実行するための設定ファイルでは、

  • 現在のPHPのバージョン
  • アップデートするPHP or Laravelのバージョン
  • 対象ディレクトリ
  • 対応するルール・除外するルール

などを指定することが出来ます。 特に、除外するルールを設定できるのが良かったです。バージョンアップと一緒には対応したくない言語のアップデートなどを除外して使いました。

Rectorは実行後、どのルールを利用して対象箇所を書き換えたかを出力してくれます。 ルールの一覧はGitHubにドキュメントがあるので、書き換わってほしくないものはこれでルールを確認して除外しました。

それぞれのプロダクトごとに柔軟にカスタマイズして利用できたのがとても良かったです。

ただ、Laravel 6ぐらいまでは使ってもあまり大きなインパクトはあんまりなかったかな〜という感想です。

それから、PHPStan/Larastanを全プロダクトで導入しました。(もとから導入されているプロダクトもありました) 静的解析でエラーになることで、メソッド引数の変更等にも気がつくことが出来、本当に重宝しました。

また、PHPUnitでテストが書かれているプロダクトは、バージョンアップ時にテストが落ちるなどで事前に不具合に気がつくことが出来るなどもありました。

静的解析のありがたさ、テストの大切さを身をもって実感することが出来ました。

(ここらへんの話も登壇スライドにあります)

テスト

バージョンアップ作業を行い、ステージング環境にマージしたあとは、アプリチームに各プロダクトで機能を網羅する手動テストを実施してもらいました。

なぜこれをやることにしたかを話します。

今回、期日内にプロジェクトを完了させることを優先したため。PHP/Laravelの変更差分以外の、関連ライブラリすべてのアップデート差分を読むことはほぼしていません。

そのため、手動テストでプロダクトの重要な機能にクリティカルな不具合が存在していないかをテストして、これが通ればリリースすることに決めました。

納期と品質のどちらも完璧に担保することは難しいです。今回はこのように妥協点をみつけて対応することでプロジェクトを進めました。

実際、いくつかの障害は起きました。しかし、どれも早めに検知して早めに対応することができたので、大きな顧客への影響はありませんでした。

サーバ移行作業

アプリケーションロードバランサー(ALB)のターゲットグループに順番にサーバを追加・切り離しを行うことで、メンテナンスを取らずにサーバの切り替えを行いました。 移行手順のイメージ図を先に作成し、定例で共有してメンバー間で認識を揃えました。

サーバ切り替え手順のイメージ図

移行作業の手順書をステージング環境の時点で作成し、本番環境はそれと同様の作業を行うようにしました。

おわりに(今後の展望)

私自身、今回のバージョンアッププロジェクトを通じて、PHPそのものへの理解や、プロダクトの構成への理解がとても深まりました。アプリケーションそのものだけでなく、開発環境やサーバ構成などの良いところ・悪いところを自分で考えられるように成長したなと思います!

また、複数プロダクトやインフラチームも関わる、関係者が多いプロジェクトを無事に完了させたという経験は大きな自信にもなりました!

今後はPHPやLaravelはもちろん、その他の技術も新しいバージョンに継続的にアップデートしていける仕組みづくりにも取り組んで行きたいです!

「ウィルゲート Advent Calendar 2024(https://adventar.org/calendars/10272)」、翌日は佐々木さんによる「 画像生成AI「DALL・E3」をAPIで実行してみよう! 」です。 お楽しみに〜〜〜〜〜!!!!!